1. AWS CI/CD(CodeCommit, CodeBuild, Codedeploy) with ECS
2. AWS CI/CD(CodeCommit) with ECS
3. AWS CI/CD(CodeBuild) with ECS
4. AWS CI/CD with ECS - ECS 만들기
5. AWS CI/CD with ECS - ECS Service 만들기
6. AWS CI/CD(Code Deploy&Code Pipeline) with ECS
다음과 같이 ECS 구성
- 샘플 애플리케이션: spring-petclinic
- 형상 관리: CodeCommit
- 코드 빌드: CodeBuild
- 이미지 저장소: ECR(Elastic Container Registry)
- 로드밸런싱 : ELB(Elastic Load Balancing)
<CodeBuild>
1. ECR(Elastic Container Registry) 생성
- ECR Console에 접속 > 메인 화면 > 리포지토리 생성 버튼 선택
- 리포지토리 이름 cicd-demo 입력 > 리포지토리 생성 버튼 선택
- 생성한 cicd-demo 리포지토리를 CodeBuild 서비스에서 사용
2. IAM 정책 생성
CodeBuild에서 ECR에 접근하기 위한 정책을 생성
- IAM Console에 접속 > 왼쪽 메뉴 > 정책 선택 > 정책 생성 버튼 선택
- 정책 생성 화면 > JSON 탭 선택 > 정책 내용 입력(아래 코드 참고) > 정책 검토 버튼 선택
{ "Statement": [ { "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload", "ecr:GetAuthorizationToken", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ], "Resource": "*", "Effect": "Allow" } ], "Version": "2012-10-17" }
- 정책 이름을 CodeBuildECRPolicy-cicd-demo-ap-northeast-2로 입력 > 정책 생성 버튼 선택
3. BuildSpec 파일 생성
CodeBuild 서비스를 통하여 소스코드를 빌드하기 위해서 소스코드의 repository에 buildspec.yml 파일을 생성해야한다.
아래와 같은 buildspec.yml 파일을 CodeCommit에 생성한 cicd-demo 저장소 root에 생성한다.
version: 0.2
phases:
install:
runtime-versions:
java: corretto17
pre_build:
commands:
- echo Logging in to Amazon ECR...
- docker --version
- 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 Build started on `date`
- echo Building the Docker image...
- cd spring-petclinic-main
- sudo chmod 777 mvnw
- echo $IMAGE_REPO_NAME
- echo $IMAGE_TAG
- ./mvnw package
- 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
cache:
paths:
- '/root/.m2/**/*'
- phase.install : Java SDK, Docker CLI를 설치
- phase.pre_build : ECR 서비스에 로그인
- phase.build : Maven 및 Docker 빌드
- phase.post_build : Docker 이미지를 ECR에 push
- cache.paths(선택): 소스코드 빌드에 사용하는 파일을 cache하는 경우 위치
4. Dockerfile 생성
아래와 같은 Dockerfile을 CodeCommit에 생성한 cicd-demo 저장소 root에 생성하면 안됨 그 밑에 생성해야됨 -> build된 파일이 있는 곳에
FROM openjdk:17-oracle
ADD target/spring-petclinic-3.1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
5. CodeBuild 프로젝트 구성
- 빌드 프로젝트 생성
- CodeBuild 콘솔에 접속 > 왼쪽 메뉴의 빌드 > 프로젝트 빌드 선택 > 빌드 프로젝트 생성 버튼 선택
- 프로젝트 설정
- 프로젝트 이름 cicd-demo 입력
- 빌드 배지 활성화 체크
- 소스
- 소스 공급자 AWS CodeCommit 선택
- 리포지토리 cicd-demo 선택
- 환경
- 환경 이미지 > 관리형 이미지 선택
- 운영 체제 > Ubuntu 선택 선택
- 런타임 > Standard 선택
- 이미지 > aws/codebuild/standart:2.0 선택
- 이미지 버전 > 이 런타임 버전에 항상 최신 이미지 사용 선택
- 권한이 있음 체크
- 역할
- 서비스 역할 > 새 서비스 역할 선택
- 역할 이름 codebuild-cicd-demo-service-role 입력
- 추가 구성
- 추가 구성 메뉴 확장 > 환경 변수 입력
이름 값 AWS_DEFAULT_REGION 리전 이름 AWS_ACCOUNT_ID 계정 아이디 IMAGE_REPO_NAME ECR 이름 IMAGE_TAG Docker 이미지 태그 이름
- Build Spec
- 빌드 사양 > buildspec 파일 사용 선택
- 아티팩트
- 유형 > 아티팩트 없음 선택
- 로그
- 유형 > CloudWatch 로그 선택
6. CodeBuild 역할과 정책 연결
- IAM Console에 접속 > 왼쪽 메뉴 > AWS Account > 역할 선택
- 메인 화면 > 검색 창 > codebuild 입력 > codebuild-cicd-demo-service-role 선택
- 권한 탭 > 정책 연결 버튼 선택
- 정책 필터 > codebuild 입력 > CodeBuildECRPolicy-cicd-demo-ap-northeast-2 선택 > 정책 연결 버튼 선택
7. CodeBuild 시작
- CodeBuild 콘솔에 접속 > 왼쪽 메뉴의 빌드 > 프로젝트 빌드 선택
- 메인 화면 > cicd-demo 프로젝트 선택 > 빌드 시작 버튼 선택
- 빌드가 성공적으로 종료되면 상태가 성공함으로 변경
- ECR의 cicd-demo 저장소에 접속해보면 새로운 이미지가 생성되어 있음
<에러사항>
이전의 buildspec.yaml으로 사용할 시에 다음과 같은 문제점이 발생했다.
🧨에러1
YAML_FILE_ERROR: Unknown runtime named 'docker'. This build image has the following runtimes: dotnet, golang, java, nodejs, php, python, ruby
해결 : 그냥 docker 부분 제거
🧨에러 2
COMMAND_EXECUTION_ERROR: Error while executing command: $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION). Reason: exit status 252
해결 : $ 제거
- aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin DOCKER_ID.dkr.ecr.REGION.amazonaws.com
cd spring-petclinic-main
sudo chmod 777 mvnw
./mvnw package
참고
https://yunsangjun.github.io/cloud/2019/06/21/aws-cicd03.html