반응형

개요

현재까지(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)를 사용할 예정이다.

빌드 및 배포 순서
1.개발자 소스 코드 업로드(PUSH)
2.정의된 컴파일러로 빌드
      - Gradle build
      - Docker Image 생
3.생성된 Docker Image ECR 등록
4.Amazon ECR에  등록된 이미지 EKS 배포
참고) 테스트에 사용된 프로그램의 Root 디렉토리 --> 필자는 여기서 예를 들기 위해 Root 디렉토리에 배포와 관련된 일련의 파일들을 모두 두었다. e.g. build.gradle, buildspec.yaml, Dockerfile, deplolyment.yaml, service.yaml, ingress.yaml
- deployment
      - 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

이제 잘 되는지 확인해 보자

 

반응형

+ Recent posts