nayoungs
항상 끈기있게
nayoungs
  • 분류 전체보기 (274)
    • Cloud (21)
      • AWS (15)
      • Azure (3)
      • NCP (2)
      • GCP (1)
    • DevOps (68)
      • Docker (16)
      • Kubernetes (50)
      • CICD (2)
    • IaC (25)
      • Ansible (17)
      • Terraform (8)
    • Certification (4)
    • 금융 IT (5)
    • AI (3)
    • Linux (47)
    • 미들웨어 (5)
    • Programming (7)
      • GoLang (3)
      • Spring (4)
    • CS (25)
      • 네트워크 (17)
      • 운영체제 (5)
      • Web (1)
      • 개발 상식 (2)
      • 데이터베이스 (0)
    • Algorithm (59)
      • 프로그래머스 (36)
      • 백준 (18)
      • 알고리즘 정리 (5)
    • ETC (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayoungs

항상 끈기있게

Cloud/AWS

[AWS] CodeBuild : Docker 이미지를 Build하고 ECR에 Push하기

2023. 7. 20. 22:30
728x90

CodeBuild란?

AWS CodeBuild란, 클라우드 상의 완전 관리형 빌드 서비스이다. CodeBuild에서는 자체 빌드 서버를 프로비저닝, 관리 및 확장할 필요가 없다. AWS의 CI(Continuous Integration) 서비스라고 보면 된다.
 

CodeBuild 작동 방식

CodeBuild는 다음 그림과 같이, 소스 공급자에 소스가 업로드되면 CodeBuild가 알아서 소스를 가져와 빌드를 진행한다. 그리고 빌드가 완료되면 아티팩트(빌드 결과물)를 아티팩트 저장소에 저장한다.

https://blog.walkinpcm.com/10

CodeBuild에서 지원하는 소스 공급자는 다음과 같다.

  • Amazon S3
  • AWS CodeCommit
  • Github
  • BitBucket
  • Github Enterprise

CodeBuild가 빌드 환경에 소스 코드를 다운로드한 다음, buildspec(build specification)을 사용하게 된다. buildspec이란 빌드를 실행하는 데 사용하는 yaml 형식의, 빌드 명령 및 관련 설정 모음이다.

정리하자면 buildspec.yaml 이란, CodeBuild가 수행할 작업들을 yaml 형식으로 작성한 파일이라고 보면 된다.

 
아티팩스 저장소는 Amazon S3를 선택하거나 선택하지 않을 수 있다.
선택하지 않는 경우는, 빌드 후 절차에서 ECR에 저장하거나 단순 빌드 테스트하는 목적일 수 있다.
AWS CodeBuild Overview



Hands On!

이번 포스팅에서는 소스 공급자를 Github으로 하고,
Docker Image를 빌드한 뒤 ECR까지 푸시하는 것까지 진행해본다.

Github -> CodeBuild -> ECR

 

ECR

가장 먼저, 이미지를 저장할 ECR 리포지토리를 생성한다.



CodeBuild

ECR에 이미지를 푸시할 것이기 때문에, 별도로 아티팩트 저장소(S3)는 생성하지 않는다.

buildspec.yaml을 작성하기 전에, buildspec에 조금 더 알아보자.

  • buildspec은 단계(phase) 별로 원하는 명령을 입력한다.
  • phase에는 install, pre_build, build, post_build가 있다.
  • 모든 단계가 필수적인 것은 아니며, 목적에 따라 구분하여 작성한다.
  • install : 빌드 전에 필요한 환경을 설치한다.
  • pre_build : 빌드 전에 수행할 명령을 입력한다.
  • build : 빌드를 수행할 명령을 입력한다.
  • post_build : 빌드 후에 수행할 명령을 입력한다.

위의 사항을 숙지했다면, 이제 buildspec.yaml을 작성해보자.

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image... 
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}         
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
  • pre_build : ecr에 로그인
  • build : docker image 빌드, image이름은 commit hash가 되도록 설정해주었다.
  • post_build : ecr에 이미지 푸시

이렇게 작성한 buildspec.yaml은 소스 공급자 코드에 포함되어야 한다.

다음으로 CodeBuild 프로젝트를 생성한다.

글쓴이는 [소스 공급자]로 Github을 선택하였고, OAuth 방식을 통해 연결해주었다.
OAuth 방식을 사용하려면 [Github에 연결] 버튼을 눌러, 새로 뜬 창에서 Github 로그인을 해주면 된다.
그리고 사용하려는 레포지토리를 선택한다.

그 후, 각자 환경에 맞게 빌드 환경을 설정하면 된다.

이때, docker image를 빌드하기 위해 [권한이 있음] 부분을 꼭 체크해줘야한다.

buildspec.yml을 작성했디 때문에 [buildspec 파일 사용]을 선택하고, 글쓴이는 루트 디렉토리에 파일이 있기 때문에 [Buildspec 이름]은 넘어간다. 루트 디렉토리가 아니라면, 경로를 적어주면 된다.

다음으로 buildpspec.yml에 필요한 환경 변수를 설정해주자.

총 3가지 환경 변수 설정이 필요하다. 사용자의 환경에 맞게 세팅해준다.

  • AWS_ACCOUNT_ID
  • AWS_DEFAULT_REGION
  • IMAGE_REPO_NAME

다음으로 CodeBuild 권한을 수정해주자.
ECR에 이미지를 push해야하기 때문에, CodeBuild가 ECR에 접근할 수 있도록 권한을 부여해줘야한다.

새로 생성된 CodeBuild 역할에 AmazonEC2ContainerRegistryFullAccess 권한을 연결해준다.



Build Project

이제 빌드를 진행해보자!
[빌드 시작] 버튼을 누르고, 시간이 지나서 성공함을 확인할 수 있고,
ECR 리포지토리에서도 이미지가 업로드되어있는 것을 확인할 수 있다.








Reference

더보기
  • https://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/welcome.html
  • https://blog.walkinpcm.com/10
728x90
저작자표시 비영리 (새창열림)
    'Cloud/AWS' 카테고리의 다른 글
    • AWS를 이용한 HA(High Availability) wordpress 서비스 배포
    • [AWS] CDN과 Amazon CloudFront + S3 연동
    • [AWS] Amazon Auto Scaling
    • [AWS] 배스천 호스트(Bastion Host)
    nayoungs
    nayoungs
    안되면 될 때까지

    티스토리툴바