본문 바로가기

DevOps

[AWS] AWS CI/CD 구현 (1) - CodeCommit, CodeBuild

AWS CICD 구현 - CodeCommit, CodeBuild

 

AWS CICD CodeCommit + CodePipeline 삽질 적용기 1탄 'CodeCommit + CodeBuild 설정' 입니다.

 

💡확인하기
  • 소스 리포지토리는 AWS CodeCommit을 사용합니다.
  • Gradle, Spring Boot, multi module 구조의 프로젝트 기준입니다.
  • docker-compose 를 사용합니다.
  • 각 모듈의 최상위에는 Dockerfile 이 정의되어 있습니다.

 


 

0. 소스 업로드

AWS CodeCommit 에 소스를 업로드합니다.

CodeCommit
CodeCommit

 

1. CodeBuild 설정

1) ECR 생성

build 후 생성되는 docker image를 저장할 저장소인 Elastic Container Repository(ECR) 를 생성합니다.

ECR Dashboard 입장
ECR Dashboard 입장
ECR Dashboard
ECR Dashboard
ECR 생성
ECR 생성

 

2) 빌드 프로젝트 생성

build할 코드베이스를 설정하고 build 옵션 설정, 권한을 부여합니다.

프로젝트 구성 작성

빌드프로젝트 생성 1
빌드프로젝트 생성 1

타겟 소스 설정

대상이 되는 소스 리포지토리와 브랜치를 선택합니다.

빌드프로젝트 생성 2
빌드프로젝트 생성 2

docker image 환경 설정

빌드프로젝트 생성 3
빌드프로젝트 생성 3

role 설정

build 작업을 진행하는 role을 설정합니다.

빌드프로젝트 생성 4
빌드프로젝트 생성 4

build 옵션 설정

CodeBuild는 build 옵션 설정을 yaml 형식으로 정의해야 합니다.

(1) 빌드 명령 삽입(인라인) 방식으로 구현하거나,

(2) 코드베이스에 별도의 buildspec.yml 파일을 작성

하여 구현할 수 있습니다.

별도의 파일로 작성할 경우, 해당 파일의 경로를 설정합니다.

파일명은 꼭 buildspec.yml 이 아니어도 됩니다 😊

빌드프로젝트 생성 5
빌드프로젝트 생성 5

# buildspec.yml
# AWS Build Config

version: 0.2 # 고정

env:
  variables:
    # AWS variable
    REGION: ap-northeast-2
    ECR_URI: 0000.dkr.ecr.ap-northeast-2.amazonaws.com # docker image 업로드할 ECR 리포지토리
    REPOSITORY_NAME: backend

    # Project variable
    PROJECT_NAME: BACKEND
    MODULE_NAME: backend
    IMAGE_NAME: backend
    IMAGE_TAG: latest

# jenkins의 stages
phases:
	# build 작업
	build:
    commands:
      - echo "[${PROJECT_NAME}] Build Start on `date`..."
      - chmod +x ./gradlew
      - ./gradlew bootJar -p ./project/${MODULE_NAME}

	# build 후 작업
	post_build:
    commands:
      - echo "[${PROJECT_NAME}] Post Build Start on `date`..."
		# ECR 로그인
      - aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin ${ECR_URI}
		# docker image build
      - docker build -t ${IMAGE_NAME} ./project/${MODULE_NAME}
      - docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${ECR_URI}/${REPOSITORY_NAME}:${IMAGE_TAG}
		# ECR upload
      - docker push ${ECR_URI}/${REPOSITORY_NAME}:${IMAGE_TAG}

# S3에 업로드할 CodeBuild 출력물
artifacts:
  files:
    - project/backend/build/libs/*.jar
    - project/backend/src/main/resources/appspec.yml
    - project/backend/src/main/resources/script/deploy.sh
    - project/backend/src/main/resources/script/create_directory.sh
  discard-paths: yes

cache:
  paths:
    - '/root/.gradle/caches/**/*'

 

3) Codebuild role에 ECR 접근 권한 부여

CodeBuild 작업을 진행하는 CodeBuild role이 ECR에 접근할 수 있도록 권한을 설정합니다.

module별로 셋팅하므로 정책으로 따로 분리 생성하여 각 모듈별 CodeBuild role에 부여합니다.

ECR 로그인 정책 생성

ECR 로그인정책 생성

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchGetImage",
                "ecr:DescribeRepositories",
                "ecr:ListImages"
            ],
            "Resource": "*"
        }
    ]
}

CodeBuild role에 정책 추가

CodeBuild Role 정책 추가
CodeBuild Role 정책 추가

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "codebuild:*",
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

 


 

👇 👇  2탄 👇 👇

 

[AWS] AWS CI/CD 구현 (2) - CodeDeploy 설정

아무도 안써서 내가 쓰는 AWS CI/CD 적용기 (2) AWS CodeCommit + CodePipeline 삽질 적용기 2탄 'CodeDeploy 설정' 입니다. 👇👇 1탄 👇👇 [AWS] 아무도 안써서 내가 쓰는 AWS CI/CD 적용기 (1) AWS CodeCommit + CodePipelin

devzooo.tistory.com

 

728x90