개요
현재까지(22년 4월) AWS의 CodeDeploy는 EKS 배포를 지원하지 않는다. 따라서 명령어 기반 build 툴인 CodeBuild를 통해서 배포를 하던지 별도의 서드파티 제품과 연동해야 EKS 배포가 가능하다. 여기서는 CodeBuild를 통해서 EKS배포를 하는 방법에 대해 알아 보겠다.
* 이 예제를 성공적으로 따라해 보기 위해서는 AWS의 CodeCommit이 구성되어 있어야 하며, ECR, EKS등 이미 배포 환경이 만들어져 있어야 한다. 다만 CodeBuild의 작동 방식만 참조를 할때는 해당 구성이 없다고 하더라도 상관없다.
파이프라인
구성할 파이프라인은 아래의 아키텍처에서 볼 수 있듯이 AWS Code Series로 구성할 예정이며 파이프라인 관리 -> CodePipeline, 소스 통합 및 형상관리에 CodeCommit, 소스 빌드 및 배포에 CodeBuild, 그리고 컨테이너 이미지 관리를 위해 Amazon ECR, 마지막으로 배포 대상은 AWS의 관리형 Kubernetes인 EKS(Elastic Kubernetes Service)를 사용할 예정이다.
- Gradle build
- Docker Image 생
- service
- ingress
새 CodeBuild 만들기
aws콘솔 > developer toos > codebuild > build projects 선택
CodeBuild 프로젝트 환경 구성- 예
아래의 구성 예를 참조해 신규 codebuild 프로젝트를 구성해 보도록 한다.
CodeBuild 프로젝트 환경 구성 - 계속
* 여기서 Role Name을 꼭 기억해 두자! --> 이 Role에 Policy를 추가해 CodeBuild가 CodeCommit이나, ECR, EKS등에 접근 할 수 있는 권한을 줄 예정이다.
CodeBuild 프로젝트 환경 구성 - 계속
여기서 buildspec.yaml 파일은 반드시 소스 프로젝트의 root 프로젝트에 존재하고 있어야 한다.
CodeBuild 프로젝트 환경 구성 - 계속
Service Role 권한 추가
CodeBuild로 CodeCommit이나 ECR, EKS등에 접근을 위해서는 앞서 만든 Service Role에 권한을 추가해야 한다. 여기서는 앞서
codebuild-octank-b2bt-codebuild-service-role이란 이름으로 만들었다.
추가할 권한 리스트
EKS ConfigMap에 SeriviceRole 추가
CodeBuild에 k8s 조작한 권한 주기(codebuild가 k8s 조작하기 위해 e.g. kubectl서는 configmap에 조작하는 role정보가 들어가 있어야 한다.)
kubectl get configmaps aws-auth -n kube-system -o yaml > aws-auth.yaml 로 config정보를 yaml만들고 iam에서 롤의 arn을 가져와 아래와 같이 편집
- rolearn: arn:aws:iam ~ 정보가 추가된 것임
$ kubectl apply -f aws-auth.yaml --force 로 편집한 파일 반영
kubectl get configmaps aws-auth -n kube-system -o yaml 로 반영 확인
buildspec.yaml 예제
version: 0.2
phases:
install:
runtime-versions:
java: corretto8
docker: 18
commands:
- AWS_ACCESS_KEY_ID=AK22222222 # AWS의 웹 콘솔에서 Codebuild Environment 변수로 등록할 것(여기선 예제로 여기다가 표시 했지만 보안상 위배임)
- AWS_SECRET_ACCESS_KEY=K42222222222222 # AWS의 웹 콘솔에서 Codebuild Environment 변수로 등록할 것(여기선 예제로 여기다가 표시 했지만 보안상 위배임)
- ACCOUNT_ID=900000001 # AWS의 웹 콘솔에서 Codebuild Environment 변수로 등록할 것(여기선 예제로 여기다가 표시 했지만 보안상 위배임)
- AWS_REGION=ap-northeast-2
- IMAGE_NAME=octank_account:latest
- AWS_ECR_URI=$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$IMAGE_NAME
- curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.16.12/2020-07-08/bin/linux/amd64/kubectl
- chmod +x ./kubectl
- mv ./kubectl /usr/local/bin/kubectl
- mkdir ~/.kube
- aws eks --region $AWS_REGION update-kubeconfig --name eks-demo
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/
build:
commands:
- echo Build Starting on `date`
- echo Building with gradle...
- chmod +x ./gradlew
- ./gradlew build
- echo Building the Docker image...
- docker build -t $IMAGE_NAME .
- docker tag $IMAGE_NAME $AWS_ECR_URI
- docker push $AWS_ECR_URI
post_build:
commands:
- DATE=`date`
- echo Build completed on $DATE
- sed -i.bak 's#AWS_ECR_URI#'"$AWS_ECR_URI"'#' ./deployment.yaml
- sed -i.bak 's#DATE_STRING#'"$DATE"'#' ./deployment.yaml
- kubectl apply -f ./deployment.yaml
- kubectl apply -f ./service.yaml
- kubectl apply -f ./ingress.yaml
이제 잘 되는지 확인해 보자
'Application Modernization > DevOps' 카테고리의 다른 글
AWS CodeCommit을 이용해 S3에 정적 컨텐츠를 배포해 보자 (0) | 2022.04.13 |
---|---|
Github대신 AWS의 CodeCommit을 사용해 보자 - HTTPS 인증 방식 (0) | 2022.04.12 |
Github대신 AWS의 CodeCommit을 사용해 보자 - SSH 인증 방식 (0) | 2022.04.12 |
GitHub, Code Build 그리고 CodePipeline를 이용한 간단한 배포 실습 (0) | 2022.03.21 |
Git, gradle, Spring Boot 개발 환경 구성 ... 2/2 (0) | 2021.09.23 |