GitHub Actions와 AWS 연동해서 간단한 자동 배포 구현하기

Grara·2023년 5월 14일
post-thumbnail

개요


  • 어느날 개인 프로젝트를 진행하던 도중 빌드를 할 때마다 EC2로 원격접속해서 jar파일 옮기고 스크립트 실행하는게 귀찮아졌다.
  • 이전에 TravisCI를 조금 사용해본적이 있지만 아쉽게도 무료사용이 끝나버렸고 이 조그만 프로젝트를 위해서 결제를 하는건 너무 아까웠다.
  • 그러던중 대안책으로 GitHub Actions가 눈에 띄었다. public repository에 대해서는 무료라고 하니 아주 좋은 대안으로 생각된다.
  • AS-IS와 TO-BE

image

image

  • 이 글에서는 Github Actions를 제외한 나머지에 대해서는 다루지않을 예정이다. 이미 너무 많은 좋은 참고자료들이 있기에 일일이 다 설명하는 것은 무의미하다고 생각된다.
  • GitHub Actions외에 다른 서비스에 대해 사전 지식이 없는사람은 구글에 'GithubActions ec2'라고 하면 많이 나오니 해당 글들을 참고하기 바란다.

Github Actions의 기본


  • Github Actions의 기본적인 단위는 다음과 같다.
  • WorkFlow
    • .github/workflows 아래에 WorkFlow를 정의할 수 있다.
    • 1개의 WorkFlow는 1개의 yml파일로 정의된다.
    • WorkFlow는 1개 이상일 수 있다.
    • WorkFlow는 1개 이상의 Job을 포함한다.
  • Job은 1개 이상의 Step들로 이루어진 작업 단위이다.
  • Step은 한줄의 명령어, 쉘스크립트, 혹은 action(GitHub Actions내의 개념) 을 의미한다.
  • action은 복잡하고 자주 반복되는 작업을 수행하는 Github Actions 플랫폼용 사용자 지정 애플리케이션이다.
  • RunnerWorkFlow를 실행하는 Github에서 제공하는 서버이다.
  • EventWorkFlow를 작동시키는 트리거다.

시작하는 법

  • 저장소의 Actions탭에 들어갔을 때 기존 WorkFlow가 없을 경우 다음과 같은 화면이 나올 것 이다. 여러가지 기본 템플릿이 주어지는데 어차피 수정해야 하니 Simple workflow를 Configure하자

image

  • 다음과 같은 화면이 나오면 commit을 해주자. 아래의 WorkFlow 설정 예시를 참고 한뒤 수정 후 해도된다.

image

  • 그러면 다음과 같은 경로에 WorkFlow가 생성된다.

image

WorkFlow 설정 예시


#이름, 큰 의미없다.
name: Deploy to Amazon EC2

#어떤 Event에 WorkFlow를 실행할건지 설정
on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

#Job 설정
jobs:
  build:
    #우분투서버에서 실행
    runs-on: ubuntu-latest
    
    #스텝들을 정의
    steps:
    	#저장소로부터 코드 내려받기, action 사용, @v3는 버전을 의미한다.
      - name: Checkout
        uses: actions/checkout@v3
        
        #gradlew 실행권한 주기
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash
        
        #테스트 진행안하고 Gradle로 빌드
      - name: Build with Gradle
        run: ./gradlew build -x test
        shell: bash
        
        #빌드된 jar와 CodeDeploy의 appspec, 스크립트를 함께 압축
      - name: Make zip file
        run: zip ./$GITHUB_SHA.zip build/libs/*.jar appspec.yml scripts/start.sh
        shell: bash
        
        #AWS IAM 키 설정
      - 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
      
      	#S3에 압축한 파일 업로드
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$GITHUB_SHA.zip
      	
        #CodeDeploy실행
      - name: Code Deploy
        run: aws deploy create-deployment --application-name $APP_NAME --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name $DEPLOY_GROUP --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip
  • $GITHUB_SHA : 워크플로우를 Trigger시킨 커밋의 고유값이 할당된다. 기본적으로 설정되어있는 환경변수다.
  • 이외에 Secret과 환경변수 설정은 아래에서 설명한다.

Secret과 변수입력


Secret 설정

  • 먼저 IAM의 Key는 다음과 같이 설정한다.
  • 저장소 -> Settings -> Secrets and variables -> Actions

image

  • AWS_ACCESS_KEY_ID : IAM 액세스키
  • AWS_SECRET_ACCESS_KEY : IAM 비밀키

변수입력

  • 아래의 변수들은 각자의 환경에 맞게 대체해서 써주면 된다. (그대로 쓰면 안됨)

  • EX) $BUCKET_NAME -> 자기가 사용하는 S3버킷 이름

  • 굳이 변수를 등록해서 사용하고 싶으면 저장소 -> Settings -> Secrets and variables -> Actions -> Variables -> New Repository variables 에서 값을 추가하고 {{ vars.변수명 }} 형식으로 사용하면 된다.

  • $BUCKET_NAME : S3 버킷 이름

image

  • $APP_NAME : CodeDepoly 애플리케이션 이름

image

  • $DEPLOY_GROUP : CodeDeploy 배포 그룹 이름

Push 후 확인


  • 이제 Master로 푸쉬될 경우 Github Actions가 동작할 것 이다.
  • 정상적으로 동작하고 있는지 보려면 다음의 화면으로 들어가면 된다.

image

  • 만약에 다음과 같이 실패가 뜰 경우 클릭 후 상세정보로 들어가서 에러를 확인하자

image

image

image

CodeDeploy 확인


  • GitHub Actions는 정상적으로 동작했는데 CodeDeploy쪽에서 문제가 발생하는 경우가 있다.
  • CodeDeploy에서 문제가 일어난 경우는 ec2 접속 후 아래의 명령어들을 입력해서 로그를 확인하자
마지막 줄 계속 출력 (계속 갱신)
tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
tail -f /opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log

실행 기준 마지막 100줄 출력
tail -n 100 /var/log/aws/codedeploy-agent/codedeploy-agent.log
tail -n 100 /opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log
  • 본인이 겪었던 삽질을 바탕으로 주의할 점을 말해주자면 인스톨 후 스크립트 파일(.sh)을 실행하려면 반드시 스크립트 파일이 압축파일에 포함되어야 한다는 것이다. 압축파일에 스크립트 파일을 포함하지 않고 기존 경로에 있던 스크립트 파일을 실행하려고하면 실행이 되지않는다.
  • 정확한 원인은 모르겠지만 CodeDeploy가 실행되면 내가 지정한 경로로도 인스톨이 되고 /opt/codedeploy-agent/deployment-root/해시값/배포ID/deployment-archive 폴더 아래로도 인스톨이 되는데 해당 폴더에 스크립트파일이 없으면 기존 경로에 파일이 있어도 에러가 뜨면서 제대로 실행이 안된다.

마무리


  • 글을 쓰려고 시작하니까 이미 자세하게 설명해놓은 글들이 워낙 많아서 그냥 안쓸까하다가 그래도 어떻게든 마무리했다.
  • 기존에 AWS를 좀 다뤄본 사람은 어렵지않게 배워서 해볼만한데, AWS를 안 다뤄본 사람은 상당히 귀찮은 과정이 많다. 프로젝트 규모가 작고 잦은 빌드/배포가 필요하지 않다면 그냥 수동으로 빌드해서 배포하자. 배보다 배꼽이 크다.
profile
가보자고

0개의 댓글