ECS를 활용한 CI&CD Architecture Diagram
2023. 3. 23. 13:59ㆍ카테고리 없음

- Terraform으로 EcsCluster 배포: 테라폼으로 만들어진 인프라를 통해 백엔드 코드/프론트엔드 코드를 GitHub에 푸시하면 CI/CD가 진행됩니다.
- [GitHub Actions] name: Deploy to Amazon ECS
- //github actions을 어떤 푸시가 있을 때, 실행시킬지
on:
push:
tags:
- v*
env:
AWS_REGION: ap-northeast-2
ECS_CLUSTER: final-test-ecs-cluster
ECS_SERVICE: final-ecs-service
ECS_TASK_DEFINITION: .aws/task-definition.json
CONTAINER_NAME: final-test-api
permissions:
contents: read
jobs: //deploy를 진행하겠다
deploy:
name: Deploy
runs-on: ubuntu-latest
steps: //어떤 단계로 deploy 진행시킬껀지
- name: Checkout //코드 전부를 ubuntu 서버에 클론하겠다
uses: actions/checkout@v3
- name: Configure AWS credentials //aws credential 정보를 가져온다(setting-secrets 미리 정의 완료후)
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: Extract tag name
id: extract_tag_name
run: echo "##[set-output name=version;]$(echo '${{ github.ref }}' | sed 's/refs\/tags\///')"
- name: Print Image Tag
run: echo "${{ steps.extract_tag_name.outputs.version }}"
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: terraform-test
IMAGE_TAG: ${{ steps.extract_tag_name.outputs.version }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG backend/
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: true - ECS Fargate 서버리스를 이용해 직접 관리할 필요없이 개발에만 집중할 수 있게 하기위해, 그리고 auto-scalling이 될 때 확장성이 더 좋기 때문에 EC2가 아닌 Fargate를 선택하였다. (ECS task를 실행할 수 있는 방법은 2가지 - fargate와 EC2/ EC2일 때 auto-scalling이 EC2와 task 각각 필요하다)
- Secret Manager- Rds Endpoint 데이터 읽을 때 필요하다: db 사용자 패스워드를 secret manager를 통해 암호화된 값을 사용한다 (aurora는 쓰기랑 읽기랑 endpoint가 다르기 때문에 각각 값을 입력한다)
- Aurora DB: Ecs task auto-scalling그룹으로 확장성을 가져와서 트래픽이 몰렸을 때, 스케일업이 자동으로 된다. 하지만 db에 문제가 생기면 다른 모든 서비스에도 영향을 끼칠 수 있으니, 순간적인 트래픽 증가에 대응하기 위한 auto-scalling policy를 구성한다 (AZ zone을 두개로 분리: 가용성 확보를 위해 multi-AZ 활성화, 즉 한쪽 AZ에 문제가 생길 때 대응할 수 있다)
- Open VPN: 외부 사용자가 RDS사용이 필요할 때, 접근 방법을 부여하기 위한 수단이다. VPN 서버를 접속하면 AWS안으로 접속한것이라 private subnet도 접근이 가능하다
- Cognito: 백엔드 프론트엔드 협업할 때, 회원기입 로그인 세부로직을 구성해야하지만, cognito를 사용하여 간편화하였다. 사용자 pool 방식을 사용하였다
- Slack: ECS 서비스에서 설정한 임계치 기준 CPU 사용량 알림을 설정하면, 스케일아웃/ 스케일인을 slack을 통해 전달받고 모니터링할 수 있다. 관리자 입장에서 편한 사용법이다.
- Grafana 시각화: Cloudfront log는 WAF log와 거의 비슷하다. ALB log와 ECS log도 겹치는 부분이 많아 따로 시각화하지 않았다.
- WAF: 방화벽, 웹 공격을 막아주고 국가별 트래픽/에러율 cloudwatch를 통해 log 확인 및 분석이 가능하다.

5
6
4
18
28
7
328