코딩과로그
[AWS, TIL] 배포 자동화 실습 1편 (feat: Github Actions, AWS, ECS) 본문
배포 자동화 실습
프로젝트 목표 설명:
- 위의 그림과 같이 GitHub Actions 과 AWS 의 ECS 를 활용하여 백앤드 서버 배포 자동화를 진행해보았습니다.
프로젝트 제작의 메인 컴포넌트:
- GitHub Action 과 ECS 입니다. GitHub Action으로 변경점을 확인하고 도커 이미지를 빌드하여 이미지를 올린 뒤 올린 이미지를 ECS 에 전달하면 ECS가 배포를 진행합니다.
프로젝트에 사용된 컴포넌트:
- 프로젝트에 사용된 주요한 컴포넌트들입니다.
- GitHub Actions
- 깃헙 레포의 변경사항에 대해 트리거 발생
- ECR 에 도커 이미지 업로드
- ECS 내 서비스의 테스크 재정의
- ECS
- Cluster 내 Service
- 사용할 Load Balancer 및 Task 선택
- 태스크 생명주기 관리
- Cluster 내 Service
- IAM
- 객체에 대해 역할 부여 (ECS가 secret 정보를 얻을 수 있도록 역할 부여)
- ASM (Amazon Secrets Manager)
- 환경 변수 정의
아래의 가이드는 ECS를 활용한 배포 구현 방법입니다. DB 서버 구축과 백엔드 서버 연결까지를 다루고 있습니다.
해당 가이드는 나중에 저 스스로 기억하기 위함으로 가이드를 따라하시는 것은 권장하지 않습니다.
1. mongoDB 이미지 ECS 배포
mongoDB 를 ECS에 배포하기 위해 우선 mongoDB 이미지 ECR에 업로드합니다.
- ECR private repository 생성

생성 옵션

생성한 리포지토리에 들어가서 푸시명령 확인하기

이미지를 다음 명령어를 순서대로 입력하여 빌드한다.
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com
docker pull mongo
docker tag mongo:latest 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com/velog-mongo:latest
docker push 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com/velog-mongo:latest

An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid. Error: Cannot perform an interactive login from a non TTY device
해당 오류가 발생할시 해결법 링크
클러스터 생성

주의! 하나의 가용영역 즉 az 하나에 한개의 서브넷만 사용하도록 한다
테스크 정의 생성
이미지 URL은 위에서 생성한 ECR의 URL을 입력해주고
포트 매핑을 추가하여 mongo의 포트인 27017을 입력해준다.
앱 프로토콜은 NONE으로 설정해준다.

환경 변수를 추가하여 mongoDB의 사용자와 비밀번호를 적어준다.
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example

CPU와 메모리는 기본값으로 사용하고 태스크역할과 실행역할만 설정하고 넘어간다.
처음 생성하는 경우 역할이 뜨지 않을 수 있다. 그경우에는 비우고 넘어간다.

NLB 로드밸런서 생성


가용영역 전부 선택


대상그룹 생성


클러스터 서비스 생성


로드밸런서에서는 하나의 가용영역(az)안에 하나의 서브넷만 사용가능하므로 주의한다.
보안그룹에는 80포트와 27017포트를 허용하는 보안그룹을 사용한다.


서버 이미지 ECS 배포와 db연결
ECR private repository생성

생성 옵션

생성한 리포지토리에 들어가서 푸시명령 확인하기

이미지를 다음 명령어를 순서대로 입력하여 빌드한다.

민감한 정보 Screts Manger에 저장
backend 코드에서 MONGO_URL로 환경변수를 받아와서 사용하기에 MONGODB 연결 URL을 담아준다.


테스크 정의 생성
이미지 URL은 위에서 생성한 ECR의 URL을 입력해주고
포트 매핑을 추가하여 사용중인 포트를 입력해준다.

키는 실제로 애플리케이션에서 사용할 환경 변수 이름입니다.
값 유형은 ValueFrom으로 설정해 둡니다.
값은 Secrets Manager에 저장되어 있는 보안 암호의 키/값의 ARN으로 지정합니다. 다음과 같은 형식입니다.
arn:aws:secretsmanager:ap-northeast-2:725601756882:secret:VELOG_MONGO_URL-Rpur08:MONGO_URL::
VELOG_MONGO_URL 은 보안 암호 이름입니다.
Rpur08 일종의 해시값으로 ARN에서 확인할 수 있습니다.
MONGO_URL은 보안 암호의 키입니다. 우리는 MONGO_USERNAME 등으로 지정하면 됩니다.

다음 옵션은 기본값으로 설정하고 생성한다.

사용하고 있는 테스크 역할에 권한을 추가해준다.
SecretsManagerReadWrite을 추가해준다.

벡엔드 클러스터 서비스 생성


보안그룹은 포트 3000이 열려있는 보안그룹을 선택해준다.

로드밸런서는 ALB로 서비스와 함께 새로 생성해준다.

배포를 자동화할 ECS 작업 테스크의 JSON파일을 가져온다.

task-definition.json 파일을 프로젝트 폴더안으로 옮긴다.
나는 프로젝트폴더 최상위 폴더에 aws폴더를 만들어서 넣어줬다.

깃액션 yml 작성
프로젝트 폴더 최상위에 /github/workflows/deploy-ecr.yml 파일을 만들어준다.

env에 설정된 값은 다음과 같다.
- AWS_REGION: ap-northeast-2
- 사용하고 있는 aws region이다.
- ECR_REGISTRY: 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com
- ecr의 registry이다 이미지의 앞부분
- ECR_REPOSITORY: mildstone-backend
- ecr의 repository이다 이미지의 뒷부분
- ECS_SERVICE: fastify-sv
- 배포할 서비스의 이름
- ECS_CLUSTER: mongo-cluster
- 배포할 클러스터이름
- ECS_TASK_DEFINITION: ./aws/task-definition.json
- 사용할 task-definition의 위치
- CONTAINER_NAME: fastify
- task-definition.json에서 containerDefinitions -> name을 가져 온다.
name: Deploy to Amazon ECR
on:
push:
branches:
- main
pull_request:
branches:
- main
env:
AWS_REGION: ap-northeast-2
ECR_REGISTRY: 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com
ECR_REPOSITORY: mildstone-backend
ECS_SERVICE: fastify-sv
ECS_CLUSTER: mongo-cluster
ECS_TASK_DEFINITION: ./aws/task-definition.json
CONTAINER_NAME: fastify
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: ${{ 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 }}
working-directory: ./backend-was
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 "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
- 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
초록색이 되면 정상적으로 배포가 되는 것임.
'Devops > TIL' 카테고리의 다른 글
[TIL] 마이크로서비스 - msa (0) | 2023.05.08 |
---|---|
[TIL] 서버리스(ServerLess) (0) | 2023.05.08 |
[TIL] NAT Gateway (0) | 2023.04.27 |
[TIL] 서버 배포 파이프라인 실습 (0) | 2023.04.25 |
[TIL] Fagate ECS 배포 (0) | 2023.04.21 |