Skip to content

Instantly share code, notes, and snippets.

@sigridjineth
Last active November 14, 2021 11:43
Show Gist options
  • Select an option

  • Save sigridjineth/edf6e92ed10960f3ac2e94fc6fd21a20 to your computer and use it in GitHub Desktop.

Select an option

Save sigridjineth/edf6e92ed10960f3ac2e94fc6fd21a20 to your computer and use it in GitHub Desktop.
How to deploy using AWS CodeDeploy with GitHub Actions

How to deploy using AWS CodeDeploy with GitHub Actions

AWS CodeDeploy를 활용한 깃헙 액션 사용법

스텝

Step 1. 별도의 deploy 브랜치를 만드세요.

  • 아래의 예시에서는 deploy-action입니다.

Step 2. repo의 actions 탭을 눌러서 다음의 yml을 입력하세요.

  • GitHub Actions는 별도의 컨테이너(AWS와 관련없음)에서 자바 빌드파일을 만들어서 S3로 압축파일로 던집니다.
  • AWS CodeDeploy는 S3에 업데이트 된 빌드 압축파일을 받아서 EC2에 코드 배포를 실행합니다.
# github action workflow yml file
# 액션의 이름이다.
name: CI

# 언제 액션이 이루어질 지 정할 수 있다. 아래에 브랜치를 지정해주면 된다.
# 우리는 deploy 브랜치에 Push되면 자동 배포하도록 정의할 것이다.
on:
  push:
    branches: [ deploy-action ]

# 아래의 Job들이 깃헙 액션에서 진행된다.
jobs:
  # 하나의 Job을 정의한다. 여기서 Job의 이름은 build이다.
  deploy:
    name: DEPLOY
      # 빌드가 어느 운영체제에서 돌아가느냐?
    runs-on: ubuntu-18.04
    env:
      working-directory: ./BE

      # step은 job의 하위 집합이다. step에서 정의한 작업을 순차적으로 진행한다.
    steps:
      - name: Debug Action
        uses: hmarr/[email protected]
        
        # 위에서 정의한 브랜치로 체크아웃한다.
      - name: Checkout
        uses: actions/checkout@v2

        # 메시지를 출력한다.
      - name: Run a one-line script
        run: echo Start Deploy.

        # 여러 가지의 메시지를 출력할 수 있다.
      - name: Run a multi-line script
        run: |
          echo We love Honux,
          echo CodeSquad 2020 Java Backend.
          
        # 자바 버전을 설정해준다.
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8

        # Gradle에 실행 권한을 부여한다.
      - name: Grant execute permission for gradlew
        run: |
          echo $pwd
          chmod +x gradlew
        shell: bash
        working-directory: ./BE

        # Gradle을 활용해 배포한다.
      - name: Build with Gradle
        run: |
          ./gradlew build -x test
        shell: bash
        working-directory: ./BE

        # 버전마다 이름을 다르게 하기 위해서 GITHUB_SHA라고 하는 해시이름을 활용하여 zip 파일을 만든다.
        # CodeDeploy를 사용하기 위해서는 S3를 거쳐야 한다. 따라서 압축된 파일을 만들어주고 이를 옮긴다.
      - name: Make zip file
        run: zip -qq -r ./$GITHUB_SHA.zip .
        shell: bash
        working-directory: ./BE/build/libs

        # AWS 서비스를 사용하기 위한 인증 과정이다.
      - 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

        # 배포 zip 파일을 S3에 업로드한다.
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://sigrid-deploy/$PROJECT_NAME/$GITHUB_SHA.zip
        working-directory: ./BE/build/libs

        # 실제로 코드를 배포한다.
      - name: Code Deploy
        run: aws deploy create-deployment --application-name sigrid-dev --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name sigrid-dev --s3-location bucket=sigrid-deploy,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

Step 3. 백엔드 작업 폴더에 들어가서 다음의 파일을 생성하세요.

  • 부가설명: AWS CodeDeploy는 appspec.yml을 찾아서 deploy.sh를 실행합니다.
# appspec.yml
version: 0.0
os: linux

files:
  - source: /
    destination: /deploy
permissions:
  - object: /deploy
    owner: ubuntu
    group: ubuntu
    mode: 755
hooks:
  AfterInstall:
    - location: deploy.sh
      timeout: 60
      runas: root
# deploy.sh
#!/usr/bin/env bash

REPOSITORY=/deploy
cd $REPOSITORY

APP_NAME=action_codedeploy
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME

CURRENT_PID=$(pgrep -f $APP_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> Nothing to end."
else
  echo "> kill -9 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

echo "> $JAR_PATH deploy"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &

Step 4. EC2 IAM 설정

  • EC2에서 Codedeploy를 사용하기위해서는 IAM Role이 필요해요.
  • IAM Role 부여하기
서비스 -> IAM -> 역할 -> 역할 만들기
EC2 클릭 -> codedeploy 검색 후 CodeDeployFullAccess, S3FullAccess 선택 후 생성
  • 다시 EC2로 가서 해당 인스턴스를 선택 후 작업->인스턴스 설정->IAM 역할 연결/바꾸기 클릭해서 아까 만든 IAM Role을 선택해요.

Step 5. CodeDeploy IAM 설정

  • Codedeploy에도 권한을 줘야 해요.
  • IAM->CodeDeploy 선택 -> 선택되어 있는 CodeDeployRole 있는지 확인 -> 역할 만들기 -> 생성 확인

Step 6. CodeDeploy 설정하기

  • 배포를 위한 CodeDeploy 애플리케이션을 생성해야 합니다
  • CodeDeploy->어플리케이션 생성 (이름 아무거나)
  • 배포 그룹 생성 선택 (아무거나 가능) -> 배포그룹 이름과 서비스 역할을 설정 (서비스 역할에서 이전 단계에서 만들어놓은 IAM으로 클릭 후 설정)
  • 배포 유형
    • 배포방법은 현재위치방식 사용
    • 미리 만들어놓은 EC2가 있으니 Name태그를 이용해 대상을 설정. (키: Name, 밸류: EC2 이름)
    • 배포 설정은 AllAtOnce로 설정. 로드 밸런서는 안쓰니까 비활성화.

Step 7. AWS CLI용 IAM user 생성

  • 위의 workflow 파일 cli에서 사용할 iam user 생성해보자.
  • IAM-> 사용자 추가 선택-> 이름, access 유형 설정-> 기존정책 직접연결에서 S3FullAccess 선택-> 기존정책 직접연결에서 CodeDeployFullAccess 선택
  • 만들어지면 accees-key와 secret-access-key가 생기는데 이걸 꼭 저장해놓자.

Step 8. AWS 비밀 키 설정하기

  • 정님에게 GitHub Secret에 다음의 사항을 추가해달라고 하세요.
airbnb-02 팀의 github actions 적용을 위해 다음 사항의 Settings/Secrets 적용을 부탁드리고자 합니다.
AWS_ACCESS_KEY_ID: asdfasdf
AWS_SECRET_ACCESS_KEY: asdfasdf
AWS_REGION: ap-northeast-2
  • 이것저것 부탁하기 싫으면 깃헙 레포지토리를 zip 파일로 받아서 새로 레포 만들어서 push하세요.
    • 클론으로 하면 액션 사용이 안되요. 새로 만들어야 해요.

AWS 설정은 아래 링크에서 잘 되어 있다. 2편과 3편을 보면 된다.

Step 9. deploy 브랜치에 푸시한다.

  • 푸시할 때 Actions 탭에 가서 작업이 잘 되는 지 확인한다.
@sigridjineth
Copy link
Author

@sigridjineth
Copy link
Author

sigridjineth commented Jun 4, 2020

프론트 배포

# appspec.yml
version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/deploy-fe

permissions:
  - object: /home/ubuntu/deploy-fe
    owner: ubuntu
    group: ubuntu
    mode: 755

hooks:
  AfterInstall:
    - location: deploy-fe.sh
      timeout: 60
      runas: root
# deploy.sh
#!/usr/bin/env bash

echo "> FE 배포"
sudo cp -rf /home/ubuntu/deploy-fe/dist/* /var/www/html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment