'AWS로 구현하는 MAS와 컨테이너 오캐스트레이션' 강의를
블로그를 통해 구매하시는 분들에게만 10%할인 중입니다.
이미지를 클릭하고, 아래 쿠폰번호를 입력해 주세요!
16861-259843d6c2d7
AWS CodeBuild 및 CI/CD 에 대한 설명은 아래 글로 대신합니다.
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의 빌드 과정은 다음과 같다
- ECR 로그인
- clone 한 코드를 기반으로 빌드
- 기존에 작성되어있는 Dockerfile 을 빌드
- 도커 이미지 태그 추가
- 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 환경 구성 시 발생한 문제와 해결 방법
컴퓨팅 사양 - 빌드 프로세스 컴퓨팅의 사양이 부족해 프로젝트 빌드나 도커 이미지 빌드나 푸시하는 과정에서 실패하는 경우가 발생할 수 있으므로 프로젝트 규모에 맞게 적절할 컴퓨팅 사양을 선택해서 빌드를 실행해야한다.
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이나 다른 서비스로의 접근 권한이 없을 겨우에도 에러가 발생하므로 주의해야한다.
그 외에도 빌드스크립트의 문법자체에 문제가 있거나 소스코드가 빌드하는 과정에서 문제가 발생할 수도 있다.
'AWS' 카테고리의 다른 글
[AWS] CodePipeline으로 CI/CD 구현하기 (2) | 2023.05.30 |
---|---|
[AWS] CodeDeploy를 이용한 Docker 이미지 EC2 배포 (0) | 2023.05.26 |
[AWS] CI/CD 파이프라인과 AWS CI/CD 서비스 (2) | 2023.05.26 |
[AWS] AWS SNS와 SQS를 사용한 이벤트 처리 구현하기 (w.Spring Boot) (0) | 2023.05.03 |
[AWS] 마이크로 서비스 환경 구축을 위한 EC2 + Route53 + Load Balancer + ACM(SSL) 사용 (0) | 2022.05.09 |