Github Action + Docker + EC2 배포 자동화 (CD)

jhkim·2023년 5월 17일
0

빌드 파일을 s3에 업로드하고 codedeploy로 배포하는 방식도 있으나,

현재 프로젝트를 버전별로 관리하고자 하지 않았으므로,
간단하게

main브랜치에 push가 발생하면 자동으로 EC2인스턴스에 SSH접속해서

main브랜치 pull → docker-compose up —build 하는 과정으로 진행해보았다.

과정

우선 github action으로 몇가지 step을 구성한다.

  1. github action ip 구하기
  2. aws credentials설정
  3. github action ip를 보안그룹에 등록하기 (ssh접속 허용을 위함)
  4. ssh커맨드로 접속
    1. EC2 서버 IP주소
    2. username은 EC2 유저 이름
    3. 인스턴스 생성시 발급받은 키 (.pem)
    4. 인바운드 규칙에서 정의한 포트(유형ssh로하면 규칙 설정시 자동으로 22번포트)
  5. 보안그룹에서 github action ip삭제



우선 SSH접속해서 사용자 디렉토리 밑에 간단한 test파일 생성해보기

github action을 통한 ssh 접속이 성공적으로 일어나는지 확인하는 용도

테스트용 브랜치를 하나 생성해서, 해당 브랜치로 push하면 github action이 ec2로 ssh접속해서 RISING디렉토리 밖에 vi로 test파일 생성하도록 함

step 1. github action ip 가져오기

- name: Get Github Actions IP
        id: ip #해당 단계의 식별자. 이후 step에서 ip가 필요할 때 ip라는 id로 참조
        uses: haythem/public-ip@v1.2 #github action에서 사용할 액션 지정. ip를 받아오기

uses뒤에 오는 건 github 서버에서 호스팅되는 실행 환경에서 실행되는 액션임

step 2. aws credentials 설정

- name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with: #해당 단계 수행시 필요한 값들 지정
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

github marketplace에서 제공하는 configure-aws-credentials라는 걸 사용하기

저 값들은 어디에 올려놓냐 하면 github 레포 내 secrets

우선 저기서 필요한 aws_access_key_id를 구해보자

aws 로그인해서 보안 자격 증명 → 액세스 키 만들기

현재 IAM사용자가 없으므로 그냥 루트 사용자 액세스 키를 발급받았다 (권장하지 않음)

발급받은 acces key와 secret key를 github 레포의 secrets에 등록한다.

등록완료

step 3. 보안그룹에 github action 인바운드 규칙 추가

- name: Add Github Actions IP to Security group
        run: |
          aws ec2 authorize-security-group-ingress --group-id ${{ secrets.AWS_SG_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

secrets.AWS_SG_ID - 보안 그룹 id

어느 보안 그룹에 github action ip를 추가할건지 명시

앞에서 보안 자격 설졍해줬으니까 steps.ip로 해당 ip라는 id를 가진 step의 값을 사용함

그렇게 자격 증명하고 aws 보안그룹에(키로 설정한 그 그룹) github action의 ip를 추가하는 작업

step 4. ssh 접속 실행

- name: SSH Commands
        uses: appleboy/ssh-action@v0.1.6
        with:
          host: ${{ secrets.AWS_SSH_HOST }}
          username: ${{ secrets.AWS_SSH_USERNAME }}
          key: ${{ secrets.AWS_SSH_KEY }}
          port: ${{ secrets.AWS_SSH_PORT }}
          script_stop: true #스크립트 실행중 중간에 문제생기면 더 진행 안함
          script: | #ec2에 접속해서 실행할 커맨
            cd ~/RISING
						echo "test" > test

ssh접속을 실행할 때 필요한 값들 with으로 지정

AWS_SSH_HOST = ec2서버 ip주소

AWS_SSH_USERNAME = ec2 유저 이름 (기본값 ec2-user)

AWS_SSH_KEY = ec2인스턴스 생성시 발급받은 키 (.pem)

AWS_SSH_PORT = 인바운드 규칙에서 정의한 포트(유형 ssh로하면 규칙 설정시 자동으로 22번포트)

AWS_SSH_HOST도 탄력적 ip로 설정했다.

결과적으로 ls 해봤을때 test가 잘 생긴 것으로 보아 ssh접속 후 커맨드 실행은 성공!



그럼 이제 실제로 재배포하도록 해보자

ec2접속해서 커맨드 실행이 잘 되는걸 확인했으니

이제 그 커맨드를 도커 빌드하는 것으로 바꿔보자

ssh command실행 step의 script를 변경하자

- name: SSH Commands
        uses: appleboy/ssh-action@v0.1.6
        with:
          host: ${{ secrets.AWS_SSH_HOST }}
          username: ${{ secrets.AWS_SSH_USERNAME }}
          key: ${{ secrets.AWS_SSH_KEY }}
          port: ${{ secrets.AWS_SSH_PORT }}
          script_stop: true
          script: |
            cd ~/RISING #프로젝트 폴더로 이동
            git pull
            docker-compose up --build #도커 다시 빌드

처음 ssh접속하면 홈 디렉토리로 접속되므로
프로젝트 디렉토리로 이동하고(git init되어있는곳)
pull 받게 한 뒤 도커 빌드하게 하자

이제 main에 push하면 ec2에 ssh 접속하고 git pull 한뒤 최신 main상태에서 docker 빌드할 것이다
(+ main으로 체크아웃하는 커맨드를 추가하자)

참고 링크

EC2로 SSH접속해서 재배포하는 방법 - https://tesseractjh.tistory.com/275

0개의 댓글