[Kubernetes] AWS CodeBuild로 ECR 이미지 등록하기
안녕하세요, 달콤한달팽이입니다.🐌🙂
이번 시간에는 AWS CodeBuild를 사용하여
AWS ECR에 이미지를 등록하는 방법에 대하여 알아보겠습니다.
이번 실습은 추후에 진행할 ArgoCD를 사용한 EKS CI/CD 환경 구축에 사용되어 먼저 진행해볼 예정입니다!
컨테이너 이미지 생성
EKS를 구성할 때 가장 필수적이고 기본적인 요소는 컨테이너 이미지입니다.
앞선 실습들에선 DockerHub에서 제공하는 기본이미지(ex. nginx, httpd etc..)를 사용했지만,
실무에서는 코드 작성을 통해 직접 제작한 컨테이너 이미지를 통해 서비스를 운영할 것입니다.
이를 간단하게 그림으로 표현하면 아래와 같습니다.
동작순서
1) 개발자의 코드 푸시
2) CodePipeline의 소스코드 변경 감지
3) 운영자의 수동 승인
4) CodeBuild를 통한 컨테이너 이미지 생성
5) 생성된 이미지 ECR로 푸시
이번 실습에서는 BitBucket에 웹페이지가 수정된 코드를 푸시하고,
이를 컨테이너 이미지로 제작하여 ECR로 업로드하는 과정을 구현해보도록 하겠습니다.
1) 사전 준비사항
우선, BitBucket 혹은 GitHub 등의 형상 관리 툴에 소스코드를 푸시할 수 있는 레포지토리를 준비해주세요.
저의 경우 BitBucket이라는 툴에 test-repo라는 레포지토리를 생성했습니다!
그리고 이러한 레포지토리에 코드를 푸시할 수 있는 서버도 준비해주세요
$ git remote -v
이제 본격적으로 생성해보도록 하겠습니다.
2) CodePipeline 생성
AWS의 CodePipeline 콘솔 화면으로 들어가 "파이프라인 생성"을 선택해주세요.
생성 옵션 선택 탭에서는 "Build custom pipeline"을 선택해주세요.
(이 옵션을 통해 파이프라인에 대해 조금 더 귀찮지만, 조금 더 구체적으로 정의할 수 있게됩니다.)
파이프라인 설정 탭에서는 파이프라인의 이름과 서비스 역할을 생성하고 나머지는 기본값으로 남겨둔 채 다음으로 넘어가주세요.
소스 스테이지 추가 탭에서는 먼저 생성해둔 BitBucket 레포지토리를 연결해주세요.
해당 스테이지를 통해 BitBucket 레포지토리의 main 브랜치에 푸시가 발생하면 이를 감지하여 Pipeline이 동작하게 됩니다.
빌드 스테이지 추가 탭에서는 먼저 생성해둔 CodeBuild를 선택해주세요.
만약 먼저 생성해둔 프로젝트가 없다면 아래 접힌 글을 참고하여 프로젝트를 생성한 후 위 과정을 다시 수행해주세요.
1) 프로젝트 구성
이름만 기입하고 넘어가 주세요!
2) 환경 이미지
컨테이너 이미지를 빌드할 때 사용되는 가상 환경 이미지를 구성하는 탭입니다.
이번 실습에서는 특이사항이 없는 NGINX 이미지를 살짝 변형하는 정도만 구현할 것이므로 아래와 같이 구현해주세요.
3) Buildspec
빌드 스테이지에서 가장 중요하고, 이슈가 많이 발생하는 단계입니다.
Build 수행시 참고하는 yaml 파일의 이름과 경로를 지정하는 단계로, yaml 파일의 경로와 이름을 명확하게 기입해주세요.
Default 경로는 레포지토리의 root입니다.
때문에 만약 buildspec.yaml 파일이 root/app/ 경로에 위치할 경우 "app/buildspec.yaml"이라고 명시해주어야합니다.
이번 실습에서는 저는 해당 파일을 root/app/ 경로에 위치시켜보도록 하겠습니다.
이후 나머지는 모두 기본값으로 두고 생성해도 괜찮습니다.
빌드 단계까지 지정이 완료됐다면, 나머지 배포 스테이지는 건너뛰고 파이프라인 생성을 마무리해주세요!
이후 수동 승인 과정까지 파이프라인에 추가해주면, 아래와 같이 파이프라인 구성이 완료되었습니다.
3) 코드 푸시
위 과정이 마무리되었다면 BitBucket이 적용할만한 코드를 레포지토리에 푸시해주어야 합니다.
생성해줄 줄 코드는 아래와 같이 3가지 입니다.
1. buildspec.yaml : 어떤 방식으로 CodeBuild가 진행될 지 명시된 파일
2. Dockerfile : 어떤 방식으로 컨테이너 이미지를 생성할 것인지 명시된 파일
3. index.html : NGINX 생성 시 기존 index.html에 대체 될 html 파일
하나씩 생성해보도록 하겠습니다.
[buildspec.yaml]
version: 0.2
env:
variables:
REPOSITORY_URI: {REPOSITORY_URI}
phases:
install:
commands:
- pip install awscli --upgrade --user
- aws --version
pre_build:
commands:
- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin {계정 ID}.dkr.ecr.{REGION}.amazonaws.com
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:-latest}
build:
commands:
- docker build -f ./app/Dockerfile -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- docker push $REPOSITORY_URI:$IMAGE_TAG
artifacts:
files:
- '**/*'
위 형식에 {REPOSITORY_URI}, pre_build의 첫 번째 명령어는 개개인의 URI로 변경이 필요하며,
이는 AWS ECR 콘솔에서 확인할 수 있습니다!
1) env.variables : 변수 지정
2) phases.install : AWS CLI를 설치 및 버전 확인을 통한 정상 설치 확인
3) phases.pre_build : AWS ECR에 로그인 및 이미지 태그에 추가할 해시값 생성
4) phases.build : 경로의 폴더 내 파일을 참고하여 컨테이너 이미지 빌드 및 태깅
(주의: Dockerfile의 경로를 잘 확인해주세요!)
5) phases.post_build : 생성된 컨테이너 이미지 ECR로 푸시
[Dockerfile]
FROM nginx
COPY ./app/index.html /usr/share/nginx/html/index.html
EXPOSE 80
위 코드는 NGINX에 기본제공되는 index.html을 직접 생성한 index.html로 대체하는 코드입니다.
[index.html]
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>My NGINX!</h1>
<p>My NGINX!</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
위 코드는 NGINX의 index.html 파일을 복사해서 내부 내용물만 살짝 바꿔준 파일입니다!
이제 이를 레포지토리에 푸시해주면 앞서 구성한 파이프라인이 자동으로 수행되게 됩니다.
4) 결과 확인
코드 배포 이후 수동 승인을 진행하면 Build가 성공적으로 되는 것을 확인할 수 있습니다.
이제 ECR의 레포지토리에 새로 생성된 컨테이너가 해시값 태그를 가지고 제대로 들어갔다면 성공입니다!
만약 위 이미지가 진짜 CodeBuild를 통해 생성된 이미지인지 확인하고 싶을 경우,
buildspec.yaml에 echo $IMAGE_TAG를 pre_build 가장 아래에 추가해준 후 CodeBuild의 로그를 통해 확인이 가능합니다.
지금까지 CodeBuild를 사용해 ECR에 이미지를 등록하는 방법에 대하여 알아보았습니다.
해당 내용은 Kubernets와 직접적으로 관련된 내용은 아니지만 EKS 배포에 도움이 될 것 같아 작성해보았습니다.
다음 실습에서는 ArgoCD를 사용하여 EKS CI/CD 환경을 구축해보도록 하겠습니다.
감사합니다!
[참고글]
1편: AWS CodeBuild로 ECR 이미지 등록하기
2편: ArgoCD를 사용한 EKS 자동배포(1) - ArgoCD 배포하기
3편: ArgoCD를 사용한 EKS 자동배포(2) - BitBucket 연결하기
3편: ArgoCD를 사용한 EKS 자동배포(3) - ArgoCD ImageUpdater 사용하기