1. Intro
개발과 빌드/배포 과정을 자동화 하고, 추적이 가능한 방법은 여러가지가 있습니다. 저는 그 중에서 Github Actions를 활용하여 자동화를 해보고자 합니다. 또한 이번 포스트를 작성하기 위해 빌드/배포는 AWS ECR/ECS 를 이용하여 인프라를 구성하는 방법도 포함하려 합니다.
테스트를 위한 소스는 Github에 올려두었습니다.
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를 설정하는 과정을 알아보도록 하겠습니다.