이전 글에서는 ECR, ECS, Github Actions에 대해서 설명했습니다. 이번에는 실제 코드를 확인하면서 GitHub Actions를 활용한 CI/CD 파이프라인을 알아보겠습니다.
CI/CD 파이프라인에서는 AWS CodeBuild를 이용해 소스 코드 테스트를 진행하고, 이후 ECR, ECS를 활용해 배포할 예정입니다.
참고한 문서는 아래 링크에서 확인할 수 있습니다.
Create a CI/CD pipeline for Amazon ECS with GitHub Actions and AWS CodeBuild Tests | Amazon Web Services
Amazon Elastic Container Service (Amazon ECS) is a fully managed container orchestration service that makes it easy to operate containerized workloads at scale. It also integrates with other core AWS services, such as Amazon Route 53, AWS Identity and A
aws.amazon.com
AWS CodeBuild란?

AWS CodeBuild는 소프트웨어 개발에서 소스 코드 컴파일, 테스트, 배포까지 지원하는 완전 관리형 지속적 통합(Continuous Integration) 서비스입니다. 이번 파이프라인에서는 코드 테스트를 위한 목적으로만 AWS CodeBuild를 활용하게 됩니다.
처음 AWS blog 글을 읽기 전에는 "GitHub Actions Workflow 과정 안에서도 충분히 코드 테스트가 가능하지 않을까?"라는 의문을 갖고 있었습니다. 하지만, AWS Blog 글의 필자는 다음과 같은 이유로 CodeBuild를 사용했다고 설명합니다.
- AWS에 배포된 애플리케이션에 대한 테스트 실행 간소화
- 다른 AWS 서비스와 쉽게 통합되는 관리형 환경을 제공
- AWS 내부에서만 접근 가능한 구성 요소와의 통합 테스트 가능
- 단위 테스트, 정적 코드 분석, 통합 테스트와 같이 코드에 대한 다양한 테스트를 쉽게 실행 가능
프로젝트의 최종 배포 환경이 AWS ECS이기도 하고, 다양한 테스트를 진행하기 위해 저희 팀은 CodeBuild를 도입하기로 결정했습니다.
Github Actions Workflow

Amazon Web Services에서 제공하는 GitHub Actions Deploy to Amazon ECS 템플릿을 사용합니다.
저는 Codebuild 단계를 추가하기 위해 기본 템플릿 앞쪽 단계에 CodeBuild 단계를 추가하여 코드 테스트부터 ECS 배포까지 진행해보겠습니다.
Codebuild in Github Actions


- 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: Run AWS CodeBuild For Code Test
uses: aws-actions/aws-codebuild-run-build@v1
with:
project-name: ${{ env.CODEBUILD_PROJECT_NAME }}
buildspec-override: "buildspec.yml"
해당 Step에서는 AWS CodeBuild를 실행하여 코드 테스트를 진행합니다. GitHub Actions에서 AWS 로그인을 한 후에, CodeBuild에서 생성한 프로젝트 이름을 지정하면 해당 프로젝트에서 buildspec.yml이라는 파일을 참고하여 빌드 및 테스트를 수행합니다.
buildspec.yml이란?
buildspec.yml은 CodeBuild가 실행할 명령어(Command)와 빌드 단계를 정의한 YAML 형식의 설정 파일입니다.
buildspec.yml 파일은 프로젝트의 루트 디렉토리에 위치해야 하며, CodeBuild는 기본적으로 루트 경로에서 해당 파일을 읽고, 각 단계에 맞춰 빌드를 수행합니다.
ECR, ECS in Github Actions
CodeBuild에서 테스트가 완료되면, 이후 ECS로 배포를 진행합니다.ECR과 ECS에 배포되는 가정은 기존 템플릿이 제공해주는 대로 사용을 했기 때문에 따로 설명하지 않겠습니다. 결론적으로 완성된 Workflow를 확인하면 아래의 코드와 같습니다.
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- 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: Run AWS CodeBuild For Code Test
uses: aws-actions/aws-codebuild-run-build@v1
with:
project-name: ${{ env.CODEBUILD_PROJECT_NAME }}
buildspec-override: "buildspec.yml"
- 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: |
# 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 "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
해당 Workflow Step 코드를 통해서 AWS CodeBuild를 활용해 코드 테스트를 수행한 후, ECR 및 ECS를 활용하여 배포할 수 있었습니다. 남은 프로젝트 기간 동안에는 Codebuild에 다양한 테스트를 도입하여 안정적인 배포 환경을 구축할 예정입니다.

'데이터엔지니어링' 카테고리의 다른 글
Github Actions를 이용한 ECR, ECS 배포 자동화하기 (1) (1) | 2025.03.16 |
---|---|
서버리스 데이터 파이프라인 구축하면서 배운점! (0) | 2025.02.16 |
서버리스(Serverless) 데이터 파이프라인 구축기 (2) | 2025.01.31 |
[데이터엔지니어링] Docker 개념 (2) | 2024.05.03 |
[데이터엔지니어링] Apache Kafka Connect 설명 (2) | 2024.04.13 |