본문 바로가기

AWS

[AWS] CodeBuild를 이용한 Docker 이미지 빌드 및 ECR에 저장

반응형

 

 
AWS CodeBuild 및 CI/CD 에 대한 설명은 아래 글로 대신합니다.

 

[AWS] CI/CD 파이프라인과 AWS CI/CD 서비스

CI/CD 도입 계기는 항상 필요로 생각하고 있는 부분이었지만 귀찮다는 생각에 시도를 하지 않았지만 시간이 지날 수록 프로젝트가 커지면서 배포 과정에 점점 더 많은 시간들이 낭비되고 있는게

kanoos-stu.tistory.com

 


 

CI/CD 파이프라인 구축을 위해 AWS CodeBuild 설정

CodeBuild가 CI/CD 파이프라인에서 담당할 과정은 다음과 같다

  • GitHub에 있는 Spring 프로젝트를 Pull
  • Sring 프로젝트를 빌드
  • JAR 파일을 Docker Image로 빌드
  • Docker Image를 ECR에 푸시

 


 

AWS CodeBuild 빌드 프로젝트 생성

먼저 AWS 콘솔에서 CodeBuild 서비스로 이동하고 '프로젝트 만들기' 버튼을 클릭한다.
 

빌드 프로젝트 생성의 프로젝트 구성

  • 프로젝트 이름을 지정하고 선택적으로 해당 CodeBuild 프로젝트의 설명을 입력
  • 빌드 배지 - 빌드에 대한 고유한 버전을 식별하기 위해 사용되며, 일반적으로 Git 커밋 해시 또는 버전과 관련된 정보를 포함한다.
  • 동시 빌드 제한 활성화 - CodeBuild 프로젝트에서 동시에 실행될 수 있는 최대 빌드 수를 제한하는 설정.

 

빌드 프로젝트 생성의 소스

  • 소스 공급자 - 빌드할 프로젝트가 저장되어있는 소스 공급자를 선택
  • 리포지토리 - 자신 계정의 리포지토리와 연결하려면 '내 GitHub' 계정의 리포지토리' 선택
  • GitHub 리포지토리 - 드롭다운 항목에서 빌드를 수행할 리포지토리 주소 선택
  • 연결 상태 - CodeBuild 프로젝트에 GitHub에 접근할 권한을 주기 위해 계정 정보를 통해 연결
  • 소스 버전 - 빌드할 리포지토리의 브랜치명 지정
  • Git clone 깊이 - 리포지토리 클론 시 가져올 커밋의 깊이를 지정. 1 지정 시 최신 커밋 1개잔 가져온다

 

 

  • Webhook - 지정한 GitHub 리포지토리의 변화를 감지해 자동으로 빌드하는 기능이다. CodePipeline에 유사한 기능이 있으므로 CodeBuild에서는 활성화하지않고 넘어간다.
  • 환경 이미지 - 관리형 이미지는 AWS 관리하고 제공하는 사전 구성된 빌드 환경 이미지로 빌드 도구와 라이브러리가 미리 설치되어 있다. 사용자 지정 이미지는 사용자가 빌드 환경을 직접 구성해야한다. 특별한 요구사항이나 환경이 필요한 경우가 아니면 관리형 이미지를 선택
  • 운영 체제 - Amazon Linux2, Ubuntu 두 운영체제간의 차이는 크지 않으며 다른 패키지 관리자를 사용하는 정도이다. 선호도에 맞게 선택.
  • 런타임 - CodeBuild 프로젝트에서 사용하는 빌드 환경 설정
  • 이미지 - 소프트웨어 도구들을 포함하고 있는 이미지 선택
  • 환경 유형 - 사용할 빌드 리소스 선택. 일반적인 소프트웨어 개발 및 빌드 작업 시 Linux, 머신 러닝, 3D 그래픽 렌더링 등 작업 시 Linux GPU
  • 권한이 있음 - 도커 이미지를 빌드하려면 체크
  • 서비스 역할 - CodeBuild 프로젝트에 적용할 역할

 

  • Buildspec
    • 빌드 사양 - codeBuild 프로젝트가 수행될 명령어를 파일로 저장할지 프로젝트에 직접 입력할지 선택.
    • Buildspec 이름 - buildspec을 작성할 파일의 이름을 지정, 선택하지 않으면 buildspec.yml
  • 아티팩트 - 빌드 결과물을 출력할 유형 및 구성을 선택, ECR을 통해 이미지를 저장하면 아티팩트 없음 선택해도 무관한다.

그 외에는 선택사항으로 요구사항에 맞게 설정 후 프로젝트 생성
 


 

Buildspec.yml 파일 작성

buildspec 파일은 codeBuild가 GitHub 리포지토리에서 클론한 코드를 어떻게 빌드를 할지를 작성할 파일이다.
해당 파일은 빌드할 프로젝트의 소스 루트 디렉터리에 위치해야한다.
 

# buildspec.yml
version: 0.2
env:
  variables:
    AWS_DEFAULT_REGION: "your-region"
    AWS_ACCOUNT_ID: "your-account-id"
    IMAGE_REPO_NAME: "your-repo-name"
    IMAGE_TAG: "your-image-tag"
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 Building the Spring Project...
      - ./gradlew clean build --exclude-task test
      - 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 $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

 

  • version - buildspec 파일의 버전
  • phases - 빌드의 단계를 설정. 각 단계는 하나 이상의 명령어를 실행한다.
    • install - 패키지를 다운로드하고 설치하는 단계
    • pre_build - 빌드가 시작되기 전에 실행할 명령어를 지정하는 단계
    • build - 실제 빌드 명령어가 실행되는 단계
    • post_build - 빌드가 완료된 후 실행할 명령어를 지정하는 단계
  • artifacts -  빌드 후에 생성되는 파일들을 지정. 이 파일들은 S3 버킷이나 다른 곳으로 전송될 수 있다.
  • cache - 캐시 파일들의 경로를 지정. 이는 패키지를 더 빠르게 다운로드 받고 빌드 시간을 단축하는데 도움
  • environment_variables - 빌드 환경에서 사용할 환경 변수를 지정

environment_valieables 는 buildspec 문서에 작성하거나 콘솔에서 직접 작성해도 무관하다.
위의 buildspec 문서는 CodeBuild의 빌드 과정은 다음과 같다

  1. ECR 로그인
  2. clone 한 코드를 기반으로 빌드
  3. 기존에 작성되어있는 Dockerfile 을 빌드
  4. 도커 이미지 태그 추가
  5. ECR에 도커 이미지 푸시

 


 

CodeBuild 권한 부여

 
CodeBuild 서비스가 ECR에 접근하여 이미지를 풀하기 위해 CodeBuild의 IAM에 다음과 같은 역할을 부여해준다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:CompleteLayerUpload",
                "ecr:GetAuthorizationToken",
                "ecr:InitiateLayerUpload",
                "ecr:PutImage",
                "ecr:UploadLayerPart"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

 
 
 


 

CodeBuild 빌드

위의 설정이 모두 되었다면 빌드 시 CodeBuild의 단계 세부 정보화면에서 모두 성공함 상태와 ECR 리포지토리에서 저장된 이미지를 확인할 수 있다.

CodeBuild 단계 세부 정보

 

ECR 리포지토리

 


 

CodeBuild 환경 구성 시 발생한 문제와 해결 방법

 
 
컴퓨팅 사양 - 빌드 프로세스 컴퓨팅의 사양이 부족해 프로젝트 빌드나 도커 이미지 빌드나 푸시하는 과정에서 실패하는 경우가 발생할 수 있으므로 프로젝트 규모에 맞게 적절할 컴퓨팅 사양을 선택해서 빌드를 실행해야한다.

 

An error occurred (InvalidParameterException) when calling the GetAuthorizationToken operation: Invalid region X
환경 변수 - 환경 변수를 CodeBuild의 빌드 설정이나 buildspec파일에 환경 변수를 제대로 설정했는지 확인해야한다.


An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::ACCOUNT_ID:assumed-role/role_name/INSTANCE_ID is not authorized to perform: ecr:GetAuthorizationToken on resource: *
권한 문제 - CodeBuild의 ECR이나 다른 서비스로의 접근 권한이 없을 겨우에도 에러가 발생하므로 주의해야한다.
 
그 외에도 빌드스크립트의 문법자체에 문제가 있거나 소스코드가 빌드하는 과정에서 문제가 발생할 수도 있다.

반응형