-
Github Action을 이용한 ECS에 자동 배포공부/git 2023. 6. 3. 21:15
ECS Fargate로 서비스를 운영하다 보면, 수정사항을 반영하고 태스크에 반영하기 위해서는 과정을 순차적으로 진행해야 한다.
로컬에서 진행했던 과정
1. 터미널에서 AWS 로그인 시도
2. docker-compose로 이미지를 build 한다 (ex. docker-compose -f 도커컴포즈파일명.yml build)
3. 이미지를 ECR에 push 한다.(ex. docker-compose -f 도커컴포즈파일명.yml push)
4. ECR에 올라간 이미지를 확인하고 ECS task 적용한다.
해당 과정을 하다보면 이런 과정을 한번에 줄일 수 있는 자동배포 구축이 필요했다.
여러가지 방법이 있지만, 나는 github action을 사용해보기로 했다.
1. 우선 AWS에서 발급받은 access key를 등록 해 줘야 한다.

settings 선택 2. Secrets and variables 카테고리에서 Actions 선택

3. 발급 받은 Accesskey를 등록합니다.


4. github repo로 가서 action 카테고리를 선택한다.

5. Deployment에서 Deploy to Amazon ECS 선택

6. aws.yml이라는 파일에 코드가 입력이 된 상태를 볼 수 있다.(이제 여기서부터 코드를 수정해서 CI/CD를 구성해야 한다.)
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 # file, e.g. .aws/task-definition.json CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the # containerDefinitions section of your task definition permissions: contents: read jobs: deploy: name: Deploy runs-on: ubuntu-latest environment: production steps: - name: Checkout uses: actions/checkout@v3 - 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: ${{ env.AWS_REGION }} - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: Build, tag, and push image to Amazon ECR id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: ${{ github.sha }} run: | # Build a docker container and # push it to ECR so that it can # be deployed to ECS. docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT - name: Fill in the new image ID in the Amazon ECS task definition id: task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 with: task-definition: ${{ env.ECS_TASK_DEFINITION }} container-name: ${{ env.CONTAINER_NAME }} image: ${{ steps.build-image.outputs.image }} - name: Deploy Amazon ECS task definition uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: task-definition: ${{ steps.task-def.outputs.task-definition }} service: ${{ env.ECS_SERVICE }} cluster: ${{ env.ECS_CLUSTER }} wait-for-service-stability: tru- on: push, pull request같은 특정 브랜치에 해당 동작이 실행 됐을때 action이 실행 되도록 합니다.
(참고로 브랜치를 main이라고 했으면 main 브랜치에 workflow가 있어야 실행이 됩니다. main이라고 입력하고 feat에 있으면 실행이 되지 않습니다.)
- env: 환경변수를 입력하는 곳이며, 입력해두면 job(action에서 실행하는 일들을 job이라고 합니다.)에서 다시 사용할 수 있습니다.
- job: 제일 중요한 부분이며, 실제로 CI/CD의 구성을 해야하는 부분입니다.
- name: 크게 중요하지 않으나 따로 수정하지 않고 그대로 사용하였습니다.
- uses: action에서 어떤 부분을 사용할 것인지 명세가 돼 있는 부분으로 그대로 사용하시면 됩니다.
제가 기록했던 Action을 참고하시면 더 편하실 거라고 생각합니다.
name: Deploy to Amazon ECS on: push: branches: ["main"] # pull_request: # branches: ["main "] env: AWS_REGION: ap-northeast-2 ECR_REPOSITORY: django jobs: deploy: name: Deploy runs-on: ubuntu-latest environment: production steps: - name: Checkout uses: actions/checkout@v3 - 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: ${{ env.AWS_REGION }} - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: Change file permissions # 권한이 없어서 job error가 발생하여 추가 하였습니다. run: chmod +r ./nginx/nginx.conf - name: Build, tag, and push image to Amazon ECR id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: latest run: | docker build -t $ECR_REGISTRY/nginx:${IMAGE_TAG} -f ./nginx/Dockerfile . docker push $ECR_REGISTRY/nginx:${IMAGE_TAG} docker build -t $ECR_REGISTRY/django:${IMAGE_TAG} -f Dockerfile . docker push $ECR_REGISTRY/django:${IMAGE_TAG} # nginx와 django를 하나의 task에서 실행하고 있고, 두개의 이미지가 다르기 때문에 따로 build하고 push 하였습니다. - name: Fill in the new image ID in the Amazon ECS task definition (nginx) id: task-def-nginx env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: latest uses: aws-actions/amazon-ecs-render-task-definition@v1 with: task-definition: task-definition.json container-name: nginx image: $ECR_REGISTRY/nginx:${IMAGE_TAG} # 기존에 ECS Fargate로 서비스를 운영하고 계셨다면, task 정의에서 json 카테고리 선택하고 해당 부분을 json파일로 # 만들어서 사용하시면 task definition부분도 적용이 되실겁니다. - name: Fill in the new image ID in the Amazon ECS task definition (django) id: task-def-django env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: latest uses: aws-actions/amazon-ecs-render-task-definition@v1 with: task-definition: task-definition.json container-name: django image: $ECR_REGISTRY/django:${IMAGE_TAG} - name: Deploy Amazon ECS task definition uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: task-definition: task-definition.json service: ECS-service # 내 서비스 이름 cluster: ECS-cluster # 내 클러스터 이름 wait-for-service-stability: trueRef.
AWS ECS로 ECR이미지 배포 자동화 구축하기
📝배포 자동화 개략도 코드를 푸쉬 하기만 해도 자동으로 배포가 되는 아키텍쳐 다이어그램이다. 우리는 이러한 아키텍쳐를 만들어서 CI/CD를 잘 이해하는 것을 목표로 진행을 해보자. 오른쪽의
velog.io
GitHub Action을 활용한 ECS 배포자동화
Deployment Automation (Django + Docker + ECS(with ECR) + Fargate)
well-balanced.medium.com
https://doqtqu.tistory.com/330#2.2.2.%202.%20Event
[Github] Github Actions를 이용한 CI/CD
CI/CD란? CI란? 지속적인 통합으로, 어플리케이션의 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트 되어 공유 레포지토리에 통합되는 것을 의미한다. CI가 필요한 환경 다수의 개발자가 형상
doqtqu.tistory.com
- 어떤 문제를 해결하기 위해 검색하고 블로그에 작성한 글입니다. 부족한점이 많지만 틀린점이나 부족한점이 있다면 말씀해주시면 감사하겠습니다.
'공부 > git' 카테고리의 다른 글