AWS codepipeline ECS 배포
배포 스펙
소스관리 : 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 체크 -> 정책 연결