유투브 영상: https://youtu.be/wE1ETdbTVZ0
1. CodeBuild 로컬 실행(Agent)이란?
CodeBuild 로컬 실행은 CodeBuild가 실행할 코드를 내 PC에서 실행하는 방법입니다. 정식용어는 CodeBuild Agent입니다. 코드를 CodeBuild에서 실행하기 전, 로컬에서 코드를 디버깅할 때 사용합니다.
2. 장점
시간과 비용을 엄청 많이 절약합니다.
CodeBuild는 코드를 실행하기 까지 대기시간이 필요하고 사용 비용을 지불해야합니다. 그래서 내가 작성한 코드가 오류가 있는지 확인하려면 불필요한 시간과 비용이 필요합니다.
CodeBuild 로컬 실행은 내 PC에서 바로 코드를 실행할 수 있어서 시간과 비용을 절약합니다.
3. 원리
CodeBuild 로컬 실행은 도커 컨테이너를 활용합니다.CodeBuild 엔진역할을 하는 Agent 컨테이너와 코드가 실행되는 Build 컨테이너를 생성합니다.
4. 단점
CodeBuild 로컬 실행은 네트워크 제약을 받습니다. 만약 코드가 AWS VPC 네트워크가 필요하다면 로컬 실행에서는 네트워크 오류가 발생합니다. 직접 해보지는 않았지만, Client VPN을 활용하면 VPC 제약을 보완할 수 있을 것으로 생각합니다.
5. 사용방법
도커 이미지를 준비하고 쉘 스크립트를 실행하면 됩니다. 쉘 스크립트는 github에 있습니다.
5.1 도커 이미지 준비
도커 이미지는 총 2개가 필요합니다. 도커 이미지는 x86 또는 ARM계열을 사용할 수 있습니다.
- Agent 도커 이미지
- Build 도커 이미지
Agent 도커 이미지 pull 방법
# x86
docker pull public.ecr.aws/codebuild/local-builds:latest
# ARM
docker pull public.ecr.aws/codebuild/local-builds:aarch64
Build 도커 이미지
# x86
docker pull public.ecr.aws/codebuild/amazonlinux2-x86_64-standard:5.0-23.07.28
# ARM
docker pull public.ecr.aws/codebuild/amazonlinux2-aarch64-standard:3.0
Build 도커 이미지는 직접 만들 수 있습니다. Dockerfile은 github에 있습니다. M1 Mac OS를 사용하시는 분은 docker build과정에서 오류가 발생할 수 있습니다.
5.2 코드(buildspec.yml) 준비
CodeBuild가 실행할 코드를 준비합니다. 코드가 있는 파일은 buildspec.yml이어야 합니다. 아래 코드는 echo를 실행합니다.
version: 0.2
phases:
build:
commands:
- echo "Hello world!"
5.3 쉘 스크립트 실행
로컬 실행은 쉘 스크립트로 실행합니다. 쉘 스크립트는 github에 있습니다. 윈도우 운영체제는 WSL 등 쉘 스크립트를 실행할 수 있는 환경을 구축해야 합니다.
git clone https://github.com/aws/aws-codebuild-docker-images.git
cd ./aws-codebuild-docker-images/local_builds
ls -l codebuild_build.sh
쉘 스크립트를 실행하기 위해 실행권한을 설정합니다.
chmod u+x ./codebuild_build.sh
쉘 스크립트를 실행하려면 인자를 설정해야 합니다.
- i(필수): Build 컨테이너 이미지
- a(필수): 코드 실행결과(아티팩트) 저장경로
- l: Agent 컨테이너 이미지
./codebuild_build.sh \
-i <Build-container-image-name> \
-a <artifact-output-directory> \
-l <Agent-container-image-name> \
buildspec.yml이 현재 경로가 아닌 다른 경로에 있으면 s인자로 경로를 설정해주세요.
./codebuild_build.sh \
-i <Build-container-image-name > \
-a <artifact-output-directory> \
-l <Agent-container-image-name> \
-s <project-code-directory>
6. 예제
6.1 예제 github
예제 코드는 제 github에 공개되어 있습니다.
6.2 도커 이미지 pull
저는 M1 맥북을 사용하고 있어서 ARM계열 도커 이미지를 사용했습니다.
# Agent conatiner image
docker pull public.ecr.aws/codebuild/local-builds:aarch64
# Build container image
docker pull public.ecr.aws/codebuild/amazonlinux2-aarch64-standard:3.0
6.3. 예제1: echo helloworld
첫번째 예제는 echo명령어를 실행하는 간단한 예제입니다.
$ cat buildspec.yml
version: 0.2
phases:
build:
commands:
- echo "Hello world!"
쉘 스크립트를 실행합니다.
./codebuild_build.sh \
-i public.ecr.aws/codebuild/amazonlinux2-aarch64-standard:3.0 \
-l public.ecr.aws/codebuild/local-builds:aarch64\
-a artifacts
쉘 스크립트 실행결과를 관찰해보세요. echo가 실행되어hello world문자열이 출력되었습니다.
6.4 예제2: S3 버킷에 파일 업로드
두 번째 예제는 S3 버킷에 파일을 업로드합니다. CodeBuild에서 어떻게 AWS프로파일을 사용하는지 체험하는 예제입니다.
코드는 간단합니다. AWS CLI를 사용해서 버킷에 파일을 업로드합니다. 파일을 업로드 하기 위해 버킷을 미리 만들어주세요.
version: 0.2
phases:
build:
commands:
- aws s3 cp helloworld.txt s3://codebuild-locally-akbun
쉘 스크립트를 실행합니다.
./codebuild_build.sh \
-i public.ecr.aws/codebuild/amazonlinux2-aarch64-standard:3.0 \
-l public.ecr.aws/codebuild/local-builds:aarch64 \
-a artifacts
쉘 스크립트는 실행 중에 오류가 발생했습니다. 오류 메세지는 인증정보를 찾을 수 없다는 의미입니다. 버킷에 접근하려면 AWS 인증정보가 필요한데, 쉘 스크립트에 인증정보를 설정하지 않았기 때문에 컨테이너가 AWS 인증정보를 못 찾았습니다.
AWS 인증정보는 c인자로 설정합니다. 디폴트로 $HOME/.aws파일을 바라봅니다. p옵션으로 프로파일 이름을 설정할 수 있습니다.
./codebuild_build.sh \
-c \
-p <AWS profile 이름>
예제에서 AWS profile은 codebuild를 사용합니다. 이 프로파일은 CodeBuild-locally-demo IAM role을 assume합니다.
저는 테라폼으로 IAM role을 생성했습니다. terraform apply하면 IAM role신뢰관계가 2개 있습니다. IAM role은 로컬 실행에서 사용하고 실제 CodeBuild에서 사용하기 때문입니다. 운영환경에서는 CodeBuild용으로만 사용해야 합니다.
IAM role permission에는 특정 버킷에 대한 모든 권한을 줬습니다.
다시 쉘 스크립트를 실행하면 버킷에 파일이 잘 업로드 됩니다.
버킷 대시보드에 가면 CodeBuild Agent가 업로드한 파일이 보입니다.
7. 마치며
CodeBuild 로컬 실행은 CodeBuild를 사용하는 프로젝트에서 매우 유용하게 사용할 수 있을 것으로 기대됩니다. 하지만 로컬 실행용 IAM role을 관리해야하는 관리포인트가 늘어나는 단점이 있습니다.
참고자료
'전공영역 공부 기록' 카테고리의 다른 글
Aamzon Linux dig, nslookup설치 (0) | 2023.11.11 |
---|---|
AWS AMI찾는 방법 (2) | 2023.11.05 |
Copilot을 이용한 소스코드 분석 (0) | 2023.10.29 |
Argocd가 겪는 문제: 닭이 먼저냐, 닭걀이 먼저냐 (0) | 2023.10.29 |
istio가 무엇인지 쉽게 이해해보자! (0) | 2023.10.23 |