오늘은 Github Actions를 이용하여 Github Repository에 새로운 코드가 push 되었을 때 ECS 서비스에 코드를 반영하는 워크플로를 만들어봅시다.
대략적인 진행은 ECS Rolling Update와 같습니다.
[AWS] Github Actions로 ECS 서비스에 배포 (Rolling Update)
오늘은 Github Actions를 이용하여 Github Repository에 새로운 코드가 push 되었을 때 ECS 서비스에 코드를 반영하는 워크플로를 만들어봅시다. 1. AWS 리소스 준비 Fargate를 사용하는 ECS Service와 ALB를 같이
arcozz.tistory.com
1. AWS 리소스 준비
ECS Service를 생성하기 전, Service role 하나를 생성합니다.
IAM Role을 생성할 때 Use case에서 CodeDeploy - ECS를 선택하여 자유롭게 생성합니다.
ECS Service를 생성할 때 Deployment options에서 Blue/green deployment를 선택합니다.
ECS Service를 생성하면 CodeDeploy Application, Deployment group이 자동으로 생성됩니다.
기본적으로 Deployment group의 대기 시간이 1시간이기 때문에 0시간으로 바꿔줘야 합니다.
2. Github Actions 설정
.github/workflows/main.yml을 다음과 같이 수정하면 됩니다. 코드 끝에 CodeDeploy 관련 코드를 추가해야 합니다.
name: Deploy to Amazon ECS
on:
push:
branches:
- main
env:
AWS_REGION: ap-northeast-2
ECR_REPOSITORY: color
ECS_CLUSTER: demo-cluster
ECS_SERVICE: color-svc
ECS_TD: color-td
CONTAINER_NAME: color
ECS_APP: AppECS-demo-cluster-color-svc
ECS_DG: DgpECS-demo-cluster-color-svc
ECS_APPSPEC: appspec.yml
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
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: |
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: Download task definition
run: |
aws ecs describe-task-definition --task-definition ${{ env.ECS_TD }} --query taskDefinition > task-definition.json
- 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: task-definition.json
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: true
codedeploy-appspec: ${{ env.ECS_APPSPEC }}
codedeploy-application: ${{ env.ECS_APP }}
codedeploy-deployment-group: ${{ env.ECS_DG }}
CodeDeploy에 이용되는 appspec.yml 파일도 있어야 합니다. container 이름과 포트를 알맞게 수정합니다.
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: <TASK_DEFINITION>
LoadBalancerInfo:
ContainerName: color
ContainerPort: 8080
3. CI/CD 테스트
기존 코드에서는 /v1/color에 접속하면 Red, Green, Blue 색깔을 랜덤으로 반환하게 했습니다.
변경된 코드에서는 Red, Green, Yellow 색깔을 랜덤으로 반환하게 했습니다.
이제 코드를 commit & push 하여 애플리케이션에 반영됐는지 확인해 봅시다.
Github Repository의 Actions 탭에 가보면 CI/CD가 성공적으로 진행된 것을 확인할 수 있습니다.
웹사이트를 새로고침 하면 Red, Green, Yellow가 랜덤으로 반환되는 것을 볼 수 있습니다.
오늘의 글은 여기까지입니다. 감사합니다!
'AWS' 카테고리의 다른 글
[AWS] Terraform으로 EC2 Instance 생성하기 (0) | 2024.01.19 |
---|---|
[AWS] AWS Config로 Security group 감시하기 (0) | 2024.01.02 |
[AWS] Github Actions로 ECS 서비스에 배포 (Rolling Update) (0) | 2023.12.29 |
[AWS] Github Actions로 CodeDeploy 실행 (EC2) (0) | 2023.12.29 |
[AWS] SSH 액세스 실패를 감지하여 이메일에 알리기 (1) | 2023.11.28 |