인프라/AWS

AWS codepipeline ECS 배포

infitry 2022. 4. 21. 22:50
반응형

배포 스펙

소스관리 : github (기왕이면 AWS에서 제공하는 CodeCommit을 쓰는게 나을 것 같다)

빌드 : buildspec.yml 파일 (빌드하는 과정을 정할 수 있다.)

배포 : aws code deploy에서 ecs 서비스로 배포

 

배포  시나리오

1. AWS CodeBuild를 통해 github repository에서 소스를 가져오고 buildspec.yml에 작성된 빌드 순서에 따라 이미지로 빌드

(spring boot 2.3 이후 부터 추가 된 gradle의 bootBuildImage task를 이용하여 Dockerfile 없이 Dockerizing

 

2. 빌드 된 이미지의 태그에 빌드 번호를 붙여준다.

 

3. 이미지를 ECR에 푸시 및 ECS 배포를 위한 컨테이너 이름 및 이미지 저장소가 정의 되어있는 imagedefinitions.json 파일 작성

> ECS는 해당 이미지를 기반으로 서비스가 생성되어 있어야함.

 

4. ECS에 배포한다. 배포하면서 생기는 문제를 확인하기위해 cloudwatch (설정을 바꾸지 않았다면, ECS 생성 시 혹은 codepipeline

생성 시 자동으로 로그그룹이 생성되어 있다.)

 

 

buildspec.yml 파일 작성

- buildspec.yml 파일은 얼마든지 위치를 바꾸거나, 다른 이름으로 생성해도 된다. (코드 파이프 라인 생성 시 위치/파일명 을 설정할 수 있음)

 

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  pre_build:
    commands:
      - REGION=ap-northeast-2
      - REPOSITORY_URI=*****.dkr.ecr.ap-northeast-2.amazonaws.com
      - IMAGE_NAME=example
      - IMAGE_TAG=latest
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - BUILD_TAG=${COMMIT_HASH:=latest}
      - CONTAINER_NAME=example
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $REGION | docker login -u AWS --password-stdin $REPOSITORY_URI/$IMAGE_NAME
  build:
    commands:
      - echo Building the Docker image...
      - chmod +x gradlew
      - ./gradlew :moduleName:bootBuildImage --imageName=$IMAGE_NAME
      - docker tag $IMAGE_NAME:$IMAGE_TAG $REPOSITORY_URI/$IMAGE_NAME:$BUILD_TAG
  post_build:
    commands:
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI/$IMAGE_NAME:$BUILD_TAG
      - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $REPOSITORY_URI/$IMAGE_NAME:$BUILD_TAG > imagedefinitions.json
      - cat imagedefinitions.json

cache:
  paths:
    - '/root/.gradle/caches/**/*'
    - '/root/.m2/**/*'
    - '/root/.cache/pip/**/*'
    - '/root/.npm/**/*'

artifacts:
  files:
    - imagedefinitions.json

- REGION, REPOSITORY_URI, IMAGE_NAME, CONTAINER_NAME 등을 자신의 설정에 맞게 바꾸어야 한다.

- ./gradlew 명령어 실행 시 모듈이 아닌 경우 :moduleName:은 제외하고 모듈인 경우 모듈명으로 변경

- cache는 어떤 대상을 캐시에 저장할지 식별한다. 파이프라인 생성 시 캐시 저장소를 지정할 수 있다.

 

CodePipeLine 생성하기

AWS CodePipeline Console 접속 > 좌측 메뉴 > 파이프라인 > 파이프라인 클릭
나온 화면에서 파이프라인 생성
파이프라인 이름 작성 > 작성 시 역할 이름도 자동으로 생성 됨. > 다음

소스 공급자 > GitHub(버전 2)선택 > GitHub연결 버튼 누르고 본인 상황에 맞게 리파지토리 설정
리파지토리 이름 설정 > 브랜치 이름 설정 (GitHub 연결한 정보로 다 선택 가능)
변경 감지 옵션 필요에 따라 설정 > 출력아티팩트 형식 CodePipeline 기본 값 선택 > 다음

빌드 공급자 AWS Code Build 선택 > 자신의 리전 선택 > 프로젝트 생성 클릭
프로젝트 이름 > 관리형 이미지 > 아마존 리눅스 2 > Standard > 최신 이미지 선택 후 이 런타임 버전에 항상 최신
이미지 사용 > 환경유형 Linux > 빌드 사양 buildspec 파일 사용 > 루트 기준 파일 위치 입력 ex) test-module/buildspec-dev.yml
> CodePipeline으로 계속 > 생성 된 프로젝트가 보이므로 선택 > 단일 빌드 > 다음 

> 배포 공급자 Amazon ECS 선택 > 클러스터 이름 선택 > 서비스 이름 선택 > 이미지 정의 파일 imagedefinitions.json 작성 > 다음 >

> 검토 후 파이프라인 생성

 

CodeBuild 캐싱 활성화

먼저 S3 콘솔에 접속하여 버킷을 하나 생성한다

AWS Console -> CodeBuild -> build 상세 -> 편집 -> 아티팩트
추가구성 -> 생성한 S3 버킷 추가 -> 아티팩트 업데이트

 

ECR 이미지 PULL 권한 추가

AWS CodePipeline 콘솔 접속 -> 빌드 선택 -> 프로젝트 빌드 선택
-> 생성 되어있는 빌드 선택
-> 빌드 세부 정보 클릭
-> 서비스 역할 -> 해당 빌드 역할 선택

-> I AM 역할 > 권한추가 -> 정책연결
-> AmazonEC2ContainerRegistryFullAccess 체크 -> 정책 연결
반응형