devnoong.log
article thumbnail
728x90

CI/CD for EKS cluster란?

 Github 에 위치한 application 소스와 k8s manifests 의 변경 사항이 발생될 때 마다 자동으로 Github Action 을 통해서 빌드/통합(Continous Integration) 하고,

통합된 배포 대상을 ArgoCD 를 통해 k8s 클러스터에 배포(Continous Deployment) 하는 일종의 gitops 파이프라인을 만드는 과정을 안내 합니다.

 

이 때 k8s manifests를 통합/패키징 하는 도구로 Kustomize를 사용 합니다.

manifest 정적 분석을 위해 Checkov Trivy 를 함께 사용 합니다.

 

이를 통해 클러스터의 보안을 향상 할 수 있습니다.

 

CI/CD 파이프라인의 동작 흐름은 다음과 같습니다.

 

 

CI/CD 파이프라인 구성

 

CI/CD를 구성하기 위해 github 두개의 레파지토리를 생성하도록 하겠습니다.

  • front-app-repo: Frontend 소스가 위치한 레파지토리
  • k8s-manifest-repo: K8S 관련 메니페스트가 위치한 레파지토리

1. front-app-repo Repository 생성

 front-app-repo 라는 이름으로 Application repository 생성 후

계정등록 정보를 GITHUB_USERNAME이라는 환경변수로 등록합니다.

 

cd ~/environment/amazon-eks-frontend
rm -rf .git
export GITHUB_USERNAME=KimYeounHong97

 

 

 git remote repo 설정하기 위해 init 명령어를 실행해주세요.

 

cd ~/environment/amazon-eks-frontend
git init

2. front-app-repo 소스 등록

 

소스를 원격에 등록 후 관리하기 위해서 스테이징 영역에 추가 후 커밋을 실행해주세요.

 

 git add .
 git commit -m "first commit"

 

커밋 후  브랜치를 새로 생성 후 원격 front-app-repo 에 frontend 소스 코드를 push 합니다.

 

git branch -M main
git remote add origin https://github.com/$GITHUB_USERNAME/front-app-repo.git
git push -u origin main

 

push명령어를 수행 할 때 토큰 인증이 없으면 아래와 같은 에러가 발생합니다.

 

remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/KimYeounHong97/front-app-repo.git/'

github 에 들어가서 인증 토큰 선등록을 진행을 위해 repo 영역을 체크해주세요.

 

인증 토큰을 생성 후 다시 push 요청을 진행합니다.

 

 

github에서 정상적으로 올라간 소스를 확인 합니다.

 

3. IAM 생성

front app 을 빌드 하고, docker 이미지로 만든 다음 이를 ECR 에 push 하는 과정은 gitHub Action을 통해 이루어 집니다.

 

이를 위해서 사용할 IAM User를  CI/CD 파이프라인을 위한 최소 권한을 가지고 있는  IAM 인 github-Action User로 생성하도록 하겠습니다.

 

aws iam create-user --user-name github-action-yh

 

 

4. ECR Policy 생성

환경변수 위치로 이동 후, ECR policy  파일을 생성합니다.

 

cd ~/environment
cat <<EOF> ecr-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPush",
            "Effect": "Allow",
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload"
            ],
            "Resource": "arn:aws:ecr:${AWS_REGION}:${ACCOUNT_ID}:repository/demo-frontend"
        },
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        }
    ]
}
EOF

 

 만들어진 ECR Policy 파일을 통해 IAM Policy를 생성합니다.

policy 이름은  erc-policy 로  등록 합니다.

 

aws iam create-policy --policy-name ecr-policy-yh --policy-document file://ecr-policy.json

 

생성한 ecr-policy를 새로 생성한 IAM user 에게 할당 합니다.

 

aws iam attach-user-policy --user-name github-action --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/ecr-policy-yh

 

 

그 후에는 github action 에서 사용할 githup secrets(AWS Credential, githup token)를 생성하고, 설정하는 과정을 진행합니다.

5. AWS Credential 생성

먼저 AWS Credential 생성하도록 하겠습니다.

 

 AWS credential를 생성하는 이유는 github action이 빌드된 front app 을 docker image 로 만들어 ECR로 push를 진행할 때 사용 되기 때문입니다.

 

이를 위해 앞서 github-action이라는 별도의 least privilege 를 갖는 IAM User를 생성 했습니다.

 

이제 이 User의 Access Key,Secret Key를 생성하기 위해 키값을 미리 확인합니다.

아래와 같은 출력 결과 가운데 "SecretAccessKey", "AccessKeyId"값은 향후에 사용되므로  따로 메모 저장 합니다.

 

aws iam create-access-key --user-name github-action

 

6. githup token 생성

github.com 로그인 후 User profile > Settings > Developer settings > Personal access tokens 으로 이동 합니다.

그리고 우측 상단에 위치한 Generate new token을 선택 합니다.

 

 

OAuth Apps 탭을 클릭 하여 Note 란에  access token for github action 라 입력 하고 Select scopes 에서 repo 를 선택 합니다.  

 

선택 후 하단에 있는 Generate token 버튼을 클릭해서 토근을 생성해주세요.

 

 

 

토근이 생성 되면 화면에 출력되는 token 값을 복사 합니다.

 

7. github secret 설정

front-app-repo 레파지토리로 돌아가 Settings > Secrets 을 선택 합니다.

 

 

그리고 이어 화면 우측 상단의 New repository secret 을 클릭 합니다.

 

 

 Name ACTION_TOKEN Value 에는 앞서 복사한 personal access token 값을 넣은 후 Add secret 을 클릭 합니다.

 

 

 

다음은 마찬가지 절차로, 앞서 생성 후 기록/저장 해둔 IAM USER 인 github-action  AccessKeyId  SecretAccessKey의 값을 Secret 에 저장하도록 하겠습니다.

 

이때 AccessKeyId  SecretAccessKey의 각각의 Name 은 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 로 합니다.

 

AWS_ACCESS_KEY_ID 를 입력 후 Add select 버튼을 이용해 생성해줍니다.

 

 

추가적으로 AWS_ACCESS_KEY_ID 또한 생성해줍니다.

 

8.  github action  build 스크립트 생성

frontend 관련 환경변수 폴더로 이동 후 github 관련 폴더를 생성합니다.

 

cd ~/environment/amazon-eks-frontend
mkdir -p ./.github/workflows

 

생성 한 폴더로 이동 후 github action 이 사용할 build.yaml 파일을 생성합니다.

 build.yaml  파일은 front app 을 checkout 하고, build 한 다음, docker container 로 만들어 ECR 로 push 하는 과정을 담고 있습니다.

cd ~/environment/amazon-eks-frontend/.github/workflows

 

이 build 스크립트 내용 중 주목할 부분은 docker image tag 입니다. 

docker build 시 이미지 태그를  $IMAGE_TAG 값으로  빌드 마다 랜덤한 값으로 만들어 이미지에 부착하여 ECR로 push 합니다.

 

cat > build.yaml <<EOF

name: Build Front

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source code
        uses: actions/checkout@v2

      - name: Check Node v
        run: node -v

      - name: Build front
        run: |
          npm install
          npm run build

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: \${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: \${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: $AWS_REGION

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Get image tag(verion)
        id: image
        run: |
          VERSION=\$(echo \${{ github.sha }} | cut -c1-8)
          echo VERSION=\$VERSION
          echo "::set-output name=version::\$VERSION"

      - name: Build, tag, and push image to Amazon ECR
        id: image-info
        env:
          ECR_REGISTRY: \${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: demo-frontend
          IMAGE_TAG: \${{ steps.image.outputs.version }}
        run: |
          echo "::set-output name=ecr_repository::\$ECR_REPOSITORY"
          echo "::set-output name=image_tag::\$IMAGE_TAG"
          docker build -t \$ECR_REGISTRY/\$ECR_REPOSITORY:\$IMAGE_TAG .
          docker push \$ECR_REGISTRY/\$ECR_REPOSITORY:\$IMAGE_TAG

EOF

 

생성 후 , 위에서 작성된 build.yaml 을 기반으로 작성된  gitHub Action workflow를 실행해보도록 하겠습니다.

 

코드를 front-app-repo 로 commit 후 push 하여 github action workflow를 동작 시킵니다.

 

cd ~/environment/amazon-eks-frontend
git add .
git commit -m "Add github action build script"
git push origin main

 

push를 진행하는 도중에 아래와 같은 에러가 발생하였습니다... 하핫;

To https://github.com/KimYeounHong97/front-app-repo.git
 ! [remote rejected] main -> main (refusing to allow a Personal Access Token to create or update workflow `.github/workflows/build.yaml` without `workflow` scope)
error: failed to push some refs to 'https://github.com/KimYeounHong97/front-app-repo.git'

 

workflow에 관련된 Acces Token 을 허용해야한다는 에러입니다.

이전에 생성한 토큰 영역에서 workflow 영역을 체크하여 수정해주세요 :)

 

 

 

workflow를 허용 해주고 다시  한번 push 를 진행해줍니다.

 

 

github 화면으로 돌아가 변경 사항이 push 되었는지 확인하고, github action workflow가  흐름을 확인합니다.

 

 

build 과정내역과 결과가 성공적으로 되었습니다.

 

 

정상적으로 build가 성공했기때문에 ECR 레파지토리인 demo-frontend 로 돌아가, 새로운 $IMAGE_TAG를 갖는 이미지가 push 되었는지 확인 합니다.

sha 값의 일부가 포함된 Image Tag로 이미지가  push 되었습니다.

 

728x90