Search

AWS ECR/ECS로 서버 배포하기 + Github Actions (1)

카테고리
Dev-Ops
태그
AWS
게시일
2024/05/09
수정일
2024/11/18 15:40
시리즈
AWS-Study
1 more property

1. Intro

개발과 빌드/배포 과정을 자동화 하고, 추적이 가능한 방법은 여러가지가 있습니다. 저는 그 중에서 Github Actions를 활용하여 자동화를 해보고자 합니다. 또한 이번 포스트를 작성하기 위해 빌드/배포는 AWS ECR/ECS 를 이용하여 인프라를 구성하는 방법도 포함하려 합니다.
테스트를 위한 소스는 Github에 올려두었습니다.
ecs-deploy-tester
kkamikoon

Infrastructure

이번 실습에서의 인프라 구조도는 다음과 같습니다.

Build & Deploy process

빌드와 배포는 Github Actions를 통해 이루어집니다. 순서를 단순화하여 표현하면 다음과 같습니다.
1.
Github의 특정 branch에 push 함
2.
workflows에 정의된 내용대로 Github Actions이 동작함
a.
Github Repository 내에 필요한 environments & secrets를 기입하고 이를 활용함
3.
AWS ECR에 빌드한 이미지를 저장
4.
AWS ECS에 Fargate 타입으로 container가 올라감

2. github workflows

github environments

먼저 github workflows를 사용하기 위해서는 적절한 Environment와 Secrets를 세팅해주어야 합니다. 단, Github Actions를 활용하고자 하는 레포지토리에서 세팅을 해주어야 합니다.
1.
[ 원하는 레포지토리 ] 확인
2.
Settings
a.
Environments 클릭
i.
New environment (저는 여기서 development로 설정하였습니다.)
ii.
Add environment secret → AWS ACCESS KEY, SECRET, REGION 설정
b.
Secrets and variables 클릭 (필요시)
i.
Actions 클릭
ii.
New repository secret → JSON 파일 이름과 JSON을 그대로 입력해줍니다.
3.
workflows 설정
위의 과정 중 Settings의 작업은 workflows에서 사용하고자 하는 환경변수 값을 의미합니다. 저는 secrets.json 파일을 활용하여 환경변수를 설정하여 사용하고 있습니다. 이러한 JSON 파일을 설정할 필요가 있다면, Secrets and variables에서 repository를 등록하시면 됩니다.
Secrets and Variables를 캡처한 화면

workflows

on: push: branches: [ development ] name: 🚀 Deploy development http server jobs: build: environment: development name: Build runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Create Secret JSON id: create-secrets-json uses: jsdaniell/create-json@1.1.2 with: name: "settings/secrets.json" json: ${{ secrets.DEVELOPMENT_SECRET_JSON }} - 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: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build, tag, and push image to Amazon ECR id: build-image uses: docker/build-push-action@v5 env: ECR_REGISTRY: [AWS ACCOUNT NUMBERS].dkr.ecr.ap-northeast-2.amazonaws.com ECR_REPOSITORY: ecs-deploy-tester-development-repo IMAGE_TAG: latest with: file: Dockerfile-development context: . push: true tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }} cache-from: type=gha cache-to: type=gha,mode=max - name: Build Image Path id: image-path env: ECR_REGISTRY: [AWS ACCOUNT NUMBERS].dkr.ecr.ap-northeast-2.amazonaws.com ECR_REPOSITORY: ecs-deploy-tester-development-repo IMAGE_TAG: latest run: | echo "ecs-deploy-tester-image=${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.IMAGE_TAG }}" >> $GITHUB_OUTPUT - name: Create ECS task definition id: ecs-deploy-tester-task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 with: task-definition: ecs-deploy-tester-development-task-definition.json container-name: ecs-deploy-tester-container image: ${{ steps.image-path.outputs.ecs-deploy-tester-image }} - name: Deploy ECS task definition uses: aws-actions/amazon-ecs-deploy-task-definition@v1 with: task-definition: ${{ steps.ecs-deploy-tester-task-def.outputs.task-definition }} cluster: ecs-deploy-tester-development-cluster service: ecs-deploy-tester-development-service wait-for-service-stability: true
YAML
복사
위 yml 파일로 설정한 workflows에 대한 대략적인 설명을 작성하면 다음과 같습니다.

3. Workflows

jobs

어떤 작업이 이루어지는지 아래에 상세하게 정의할 수 있습니다. build 아래에 브랜치, 이름, 구동 환경을 정의하고, 각각 단계(steps)별로 어떤 작업을 진행할지 정의합니다.

steps - Checkout

정의한 환경(environemt, name, runs-on 등)으로 전환합니다.

steps - Create Secret JSON

Github 내에 정의한 secrets의 데이터를 가져와 파일로 저장하는 작업입니다. secrets에 저장한 DEVELOPMENT_SECRET_JSON을 branch 기준 가장 상위 디렉토리로부터 상대 경로“settings/secrets.json” 에 값을 저장합니다.

steps - Configure AWS credentials

AWS 에 접근하기 위한 access key, secret key, region을 설정합니다.

steps - Login to Amazon ECR

위의 정보를 이용하여 Elastic Container Registry에 로그인합니다.

steps - Set up Docker Buildx

buildx를 이용하여 도커를 빌드하기 위한 세팅입니다.

steps - Build, tag, and push image to Amazon ECR

빌드한 이미지를 어떻게 관리할 것인가에 대한 설정입니다. ECR_REGISTRY는 ECR의 ARN을 넣어주도록 하고, ECR_REPOSITORY는 따로 생성해준 repository 이름을 입력합니다. with는 어떤 빌드한 이미지를 저장하는 설정입니다. ECR 정보와 Repository, Tag의 정보를 이용하여 설정해줍니다.\

steps - Build Image Path

빌드한 이미지의 경로를 가져옵니다. Actions가 동작하는 가상 환경의 env에 경로 값을 입력하여 활용하기 위한 설정입니다.

steps - Create ECS task definition

작성한 Task definition과 빌드한 이미지를 이용하여 어떻게 Task를 생성할지 정의하는 설정입니다.

steps - Deploy ECS task definition

ECS task definition 탭에 생성된 task 정의서를 이용하여 Task를 실행합니다.

4. Next post…

이번 포스트에서는 간단하게 Github Actions와 ECS 인프라 구조도와 배포를 위한 workflows 설정에 대해 알아보았습니다. 글이 너무 길어지는 관계로 두 개의 포스트로 나누어 작성하였는데, 다음 포스트에서는 ECS를 설정하는 과정을 알아보도록 하겠습니다.