Github와 AWS CodeBuild, ECR을 이용한 docker 이미지 빌드 자동화

배포 자동화란 무엇인가?

배포 자동화(Deployment Automation)는 소프트웨어를 개발 환경에서 프로덕션 환경으로 배포하는 과정을 자동화하는 것을 의미합니다. 이는 코드 변경 사항이 저장소에 반영될 때마다 자동으로 빌드, 테스트, 배포하는 일련의 프로세스를 설정하여 수동 개입 없이 신속하고 일관된 배포를 가능하게 합니다.

사전 준비

Github 저장소 생성 및 코드 작성

  1. github에 저장소를 생성합니다. 저장소 이름은 hello-world로 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
import * as express from "express";

const app = express();
const port = 8080;

app.get("/", (req, res) => {
res.send("Hello World!");
});

app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
  1. javascript 코드는 http://localhost:8080/로 요청 시 Hello World!를 반환하는 간단한 express 서버 코드입니다.

  1. 저장소에 코드를 커밋 & 푸시합니다.

AWS Elastic Container Registry(ECR) 생성

  1. AWS Management Console에 로그인한 후, 서비스 메뉴에서 ECR을 검색하여 ECR 서비스로 이동합니다.

  1. 리포지토리 생성 버튼을 클릭합니다.

  1. 리포지토리 이름을 hello-world로 입력하고 리포지토리 생성 버튼을 클릭합니다.

  1. 생성된 리포지토리의 URI를 확인합니다.

AWS CodeBuild 생성

  1. AWS Management Console에서 CodeBuild 서비스로 이동합니다.

  1. 빌드 프로젝트에서 프로젝트 생성 버튼을 클릭합니다.

  1. 프로젝트 구성에서 프로젝트 이름을 hello-world로 입력하고 소스에서 소스 공급자GitHub로 선택합니다.

  1. OAuth를 사용하여 연결을 선택하고 GitHub에 연결 버튼을 클릭합니다.

  1. 연결을 완료하면 GitHub 리포지토리에서 위에서 생성한 hello-world 리포지토리를 선택 할 수 있습니다.

  1. hello-world 리포지토리를 검색 후 선택합니다.

  1. 기본 소스 Webhook 이벤트에서 코드 변경이 이 리포지토리에 푸시될 때마다 다시 빌드를 체크하면 Webhook 이벤트 필터 그룹에서 PUSH 이벤트를 선택할 수 있습니다. 웹훅을 통해 코드를 개발환경에서 푸시 상태가 될 때마다 자동으로 빌드를 수행할 수 있습니다.

  1. 환경에서 운영체제Ubuntu로 선택하고 런타임Standard로 선택합니다. 서비스 역할에서 역할 이름을 잘 기억해두세요. 이 역할은 CodeBuild가 다른 AWS 서비스와 상호 작용할 수 있도록 하는 역할입니다. ECR에 이미지를 푸시하려면 이 역할에 ECR에 대한 권한을 추가해야 합니다.

  1. Buildspec에서 buildspec 파일 사용을 선택하고 buildspec.yml 파일을 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: 0.2

env:
variables:
ECR_REGISTRY: "***************.dkr.ecr.ap-northeast-2.amazonaws.com"
IMAGE_NAME: "hello-world"
TAG: "latest"
PLATFORMS: "linux/arm64"

phases:
pre_build:
commands:
- echo "Logging in to Amazon ECR..."
- aws --version
- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin $ECR_REGISTRY

build:
commands:
- echo "Building and pushing the Docker image..."
- docker buildx create --use
- docker buildx inspect --bootstrap
- docker buildx build --platform $PLATFORMS -t $ECR_REGISTRY/$IMAGE_NAME:$TAG --push .
  1. yml파일을 생성하는데 ECR_REGISTRY, IMAGE_NAME, TAG, PLATFORMS를 설정해줍니다. ECR_REGISTRY는 위에서 생성한 ECR 리포지토리의 URI를 입력합니다. IMAGE_NAME은 ECR의 리포지토리 이름인 hello-world를 입력합니다. TAG는 이미지의 태그를 의미하며 latest로 설정합니다. PLATFORMS는 빌드할 이미지의 플랫폼을 의미하며 linux/arm64로 설정합니다. 가격적인 측면에서 ARM 기반의 인스턴스를 사용하여 linux/arm64로 설정하였습니다. buildx는 다중 플랫폼 이미지를 빌드하고 푸시하는 데 사용되는 도구입니다. 여러가지의 이미지를 빌드하고 싶다면 PLATFORMSlinux/amd64,linux/arm64,linux/arm/v7로 설정하면 됩니다.
  • linux/amd64: x86_64 아키텍처 (64비트 Intel/AMD)
  • linux/arm64: ARM 아키텍처 (64비트 ARM)
  • linux/arm/v7: ARM 아키텍처 (32비트 ARM)
    각 플랫폼의 아키텍처는 위를 참고하시면 됩니다.

pre_build 단계에서는 ECR에 로그인을 하고, build 단계에서는 이미지를 빌드하고 ECR에 푸시하는 과정을 수행합니다.

  1. 로그CloudWatch를 선택하고 매번 빌드가 실행될 때마다 로그를 확인할 수 있습니다.

AWS IAM 역할 변경

  1. AWS Management Console에서 IAM 서비스로 이동합니다.

  1. IAM 리소스에서 역할을 선택합니다.

  1. 위에서 생성한 CodeBuild 서비스 역할을 선택합니다.

  1. 권한 정책에서 정책 이름을 선택합니다.

  1. 권한에서 편집 버튼을 클릭합니다.
1
{ "Effect": "Allow", "Action": ["ecr:*"], "Resource": ["*"] }
  1. 위 코드를 Statement 배열에 추가합니다. 이 코드는 CodeBuild 서비스 역할에 ECR에 대한 모든 권한을 부여합니다.

  1. 변경 사항 저장 버튼을 클릭합니다.

AWS CodeBuild 빌드 시작

  1. CodeBuild에서 hello-world 프로젝트를 선택한 후 빌드 시작 버튼을 클릭합니다.

  1. 빌드 상태의 상태가 성공함으로 변경되면 빌드가 성공적으로 완료된 것입니다.

  1. ECR로 이동하여 이미지가 성공적으로 푸시되었는지 확인합니다.
공유하기