[AWS] Github Action을 통한 AWS CodeDeploy,S3,EC2 연동 (2)

곽진호·2022년 3월 3일
0

AWS[Codedeploy]

목록 보기
2/2

이전 설명까지 잘 따라왔으면 이제 얼마 남지않았따.
먼저 IAM user를 하나 생성해주자, 여기에는 권한을 codedeploy및 s3 access 를 추가할것이다

아래처럼 유저 리스트에 나오면 성공이다.

Github_Actions_user의 access id,key를 꼭 기억하고있어야한다. 추후 github setting 환경변수에 사용하기 때문이다.

S3버킷을 생성해주고, 그안에 디렉토리를 하나 생성해보자

기본설정으로 버킷을 생성한후에 아래와 같이 리스트에 나오면 된다.

이제부턴 github 설정이 필요하다.
지금부터 살짝 어려우니 잘따라오길 바란당.

일단 나는 github action을 통해서 s3에 zip파일을 업로드하려고 하니까 action을 사용해야한다.
그 전에 github setting에서 aws access ID,KEY,Region을 등록해야한다.

Actions에 들어가서 아래와 같이 key,value를 설정하면된다. 우측상단에 New repository secret을 눌러 생성한다.

이전에 저장해놨던 Github_Action_user의 id,access key, region 셋다 등록을 해준다.

이제부터 중요하다. github의 root디렉토리에 아래와같이 파일을 만들어준다. 이 파일은 EC2에 업로드되었을때 어떤실행을 할지 명령하는 것이다.
hooks: 에는 afterInstall 말고도 엄청나게 많은 구분단계가있다. 여기서는 간단하게 인스톨이 끝난후에 어떤명령을 할지 적어놓았다.

back_up.sh

#!/bin/bash
now_dir_path=`pwd -P`
CUR_DATE='backup_'`date +%Y%m%d`
mkdir -p /home/ubuntu/$CUR_DATE

cp -r /home/ubuntu/smart_mirror /home/ubuntu/$CUR_DATE

cd /home/ubuntu/smart_mirror/
rm -rf `ls /home/ubuntu/smart_mirror/ | grep -v logs | grep -v keys`
rm -rf .git

cd $now_dir_path
cp -i -rf smart_mirror/* /home/ubuntu/smart_mirror/
cp -i -rf smart_mirror/.git /home/ubuntu/smart_mirror/

나는 만든 쉘스크립트는 살짝 야매라고 생각한다
backup파일을 해당날짜로 생성한후, .git 속성을 복사해서 업데이트되는 파일에 속성을 부여하는것이다.

run_docker.sh

echo killing old docker processes!
cd /home/ubuntu/smart_mirror
docker-compose rm -fs

echo building docker containers
docker-compose up --build -d

단순하게 이미 실행되고 있는 컨테이너를 종료한후 다시 빌드후에 실행한다.

다음은 github의 workflows 쪽이다.

.github/workflows/aws.yml 을 추가한다. 위의 템플릿은 marketplace에 엄청나게 많다. 나는 이미 사용하고있는게 있어서 이전에 사용했던것과 동일한것을 복사해왔다.

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
  ZIP_NAME: export NAME:${GITHUB_SHA}

  
jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - 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: ${{ secrets.AWS_REGION }}
        
    
    - name: zip create
      run: |
        echo ${GITHUB_SHA}_build.zip
        zip -qq -r ./${GITHUB_SHA}_build.zip .
      shell: bash
      
    - name: Upload to S3
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
      run: aws s3 cp --region ap-northeast-2 ./${GITHUB_SHA}_build.zip s3://jinho/smart-mirror/${GITHUB_SHA}_build.zip
    
    - name: Deploy
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
      run: aws deploy create-deployment --application-name my-CICD --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name groupName --s3-location bucket=jinho,key=smart-mirror/${GITHUB_SHA}_build.zip,bundleType=zip

자 이제 이 파일을 해석해보도록하겠다. 생각보다 어렵지않다.

on:
  push:
    branches:
      - main

이부분은 다들알겠지만, 브랜치가 main인것으로 push되면 이 action을 실행하겠다는 말이다.

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
  ZIP_NAME: export NAME:${GITHUB_SHA}

위 부분은 settings에 설정했던 환경변수들을 불러와서 사용할수 있도록 해주는 곳이다. 만약 settings에서 환경변수를 설정하기 싫다면, 여기에서 문자열로 대입해도 문제가 없다.


    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - 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: ${{ secrets.AWS_REGION }}
        
    
    - name: zip create
      run: |
        echo ${GITHUB_SHA}_build.zip
        zip -qq -r ./${GITHUB_SHA}_build.zip .
      shell: bash
      
    - name: Upload to S3
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
      run: aws s3 cp --region ap-northeast-2 ./${GITHUB_SHA}_build.zip s3://jinho/smart-mirror/${GITHUB_SHA}_build.zip
    
    - name: Deploy
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
      run: aws deploy create-deployment --application-name my-CICD --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name groupName --s3-location bucket=jinho,key=smart-mirror/${GITHUB_SHA}_build.zip,bundleType=zip

나의 workflow는 .zip파일을 만든후에 s3에 해당 zip파일을 올린다. region 은 자기가 해당하는 리전을 꼭 쓰도록한다.

      run: aws deploy create-deployment --application-name my-CICD --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name groupName --s3-location bucket=jinho,key=smart-mirror/${GITHUB_SHA}_build.zip,bundleType=zip

애플리케이션 이름은 우리가 만들었던 이름을 사용하면된다.
--deployment-config-name 은 우리가 설정한 것들중 한개를 선택하면된다.

여기까지하고 어떤것이던 push를 해보자

음 Upload to S3는 성공으로 실행되지만 Deploy 하는쪽에서 실패했다.
그럼 S3에 가서 .zip파일이 업로드되었나 확인해보자

잘 올라간것을 확인해볼수있다.
아! EC2에 codeDeploy agent 설치를 안했다. 설치를 진행해주도록 하자

$ aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2

./install을 설치후에 권한을 변경하고 실행시킨다

$ chmod +x ./install && sudo ./install auto

다시한번 main에 push 해보자

  1. action은 성공적이다 다음은 s3에 정상적으로 파일이 업로드 되었는지 확인해보자

  2. s3에도 정상적으로 파일이 업로드 되었다. codedeploy에 가서 배포그룹을 살펴보자

  3. aws애플리케이션에 들어가서 배포 그룹을 확인해보자



  4. 다음은 EC2에 들어가서 내가 원하는데로 이루어졌는지 확인해보자

  • 도커 컴포즈는 정상적으로 실행되고있다.
  • 원하는대로 백업파일이 해당 날짜로 생성되었다.

성공적이당ㅇ!

git에 코드를 푸쉬하는 순간부터 s3에 업로드되고, EC2서버에 자동으로 배포하며 트래픽을 막는순간부터 배포이후 실행하기 까지 다 했다.

나아가 더 해보고싶은단계는 좀더 디테일하게 트래픽을 막는순간부터 install단계를 나눠서 해보고 싶다. 시간적여유가 생긴다면?

처음으로 쓰는 Velog 여서 너무 앞뒤도안맞고 문법에 맞게 쓴지도 모르겠다.

profile
진짜 호랭이

0개의 댓글