[AWS] CodeBuild로 코드 빌드하기
소스코드 배포를 위해선 (1) Dockerfile을 작성하여 프로젝트 이미지를 생성(build) 하고 이를 (2) 도커 저장소(ecr)에 저장해야합니다. 이후 (3) AWS 서버(ec2)에서 이 이미지를 설치하고 인스턴스로 실행(run)하면 배포가 완료됩니다. 코드에 변경사항이 있을 때 마다 반복 되는 이 과정은 CI/CD를 통해 자동화 될 수 있습니다. 오늘은 그 일부인 빌드 및 저장 자동화 도구 'AWS Codebuild'를 리뷰 해 보겠습니다.
Codebuid의 프로세스는 아래와 같습니다.
1. AWS CodeBuild 프로젝트를 생성합니다.
CodeBuild는 소스코드 저장소에서 buildspec.yml과 Dockerfile을 참조합니다. AWS 콘솔이 아닌 AWS CLI 를 활용하는 경우 create-project 옵션에 아래 JSON 포맷의 문서를 입력해줍니다.
# CodeBuild 템플릿 예시
{
"name": "sample-docker-custom-image-project",
"source": {
"type": "S3",
"location": "codebuild-region-ID-account-ID-input-bucket/DockerCustomImageSample.zip"
},
"artifacts": {
"type": "NO_ARTIFACTS"
},
"environment": {
"type": "LINUX_CONTAINER",
"image": "docker:dind",
"computeType": "BUILD_GENERAL1_SMALL",
"environmentVariables": [
{
"name": "IMAGE_REPO_NAME",
"value": "your-Docker-Hub-repo-name"
},
{
"name": "IMAGE_TAG",
"value": "latest"
}
]
},
"serviceRole": "arn:aws:iam::account-ID:role/role-name",
"encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
}
위 과정에서 정의되는 환경변수(environmentVariables)는 buildspec.yml에서 사용됩니다. 도커 저장소로 ecr을 사용하는 경우 환경변수의 IMAGE_REPO_NAME에 AWS ecr 저장소의 이름을 설정합니다. 도커(ecr)를 사용하게 되면 스토리지(S3)에 빌드 산출물을 저장하는 것이 아닌 도커 저장소를 사용하게 되므로 배포 과정 중 스토리지에서 아티팩트를 참조하지 않습니다.
2. 프로젝트 루트 디렉토리에 Dockerfile를 정의합니다.
# Dockerfile 예시
FROM maven:3.3.9-jdk-8
COPY . .
RUN echo "Hello World"
위 과정에서 로컬 코드를 Docker 이미지에 이관하고, 스토리지 및 프로젝트 실행 구성을 정의합니다.
3. 프로젝트 루트 디렉토리에 buildspec.yml를 정의합니다.
# buildspec.yml 예시
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Docker Hub...
# Type the command to log in to your Docker Hub account here.
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $IMAGE_REPO_NAME:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $IMAGE_REPO_NAME:$IMAGE_TAG
위 과정에서 Docker 이미지를 빌드하고, push하는데 사용할 커맨드 명령어를 정의합니다. $IMAGE_TAG 와 같은 환경변수는 위 1번 과정인 CodeBuild JSON 템플릿의 ".environment.environmentVariables" 경로에 리스트로 정의됩니다.
4. AWS CodeCommit 또는 S3에 소스코드를 업로드합니다.
S3를 활용하는 경우 소스코드의 루트 디렉토리는 포함시키지 않습니다. 루트 디렉토리 내부의 파일들만 압축(.zip)하여 S3 버킷 내부에 저장합니다. buildspec.yml과 Dockerfile은 소스코드에 포함되어 CodeBuild 템플릿에서 참조됩니다. 소스코드 업로드 작업은 CodeBuild가 아닌 CodePipeline에서 자동화 할 수 있습니다.
🐾 요약
(2) Docker 이미지 빌드를 위한 명세는 Docekrfile에 저장 되었고, (3) Docker 이미지 빌드와 Docker 저장소로 push하기 위한 커맨드 명령어는 buildspec.yml에 정의 되었습니다. 이 두 과정이 실행 될 환경은 (1) CodeBuild Template에서 설정 되었습니다. 이 구성은 AWS CodeBuild, CodePipeline 콘솔 또는 AWS CLI에서 실행 될 수 있습니다.
CodeBuild는 AWS SDK 위에서 동작됩니다. AWS CodePipeline 프로세스는 CodeBuild를 포함하며, 클라우드 환경에 빌드 된 인스턴스를 배포하는 과정까지 관리 및 자동화 할 수 있습니다. CodePipeline는 다음 포스트에서 리뷰하도록 하겠습니다.