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 되었습니다.
'Cloud > AWS' 카테고리의 다른 글
[MiniKube실습] Cloud9 구성 (0) | 2022.11.07 |
---|---|
[MiniKube 실습] AWS 인프라 구성하기 (0) | 2022.11.07 |
[EKS 웹 애플리케이션 구축] Cluster Autoscaler 적용하기 (0) | 2022.08.19 |
[EKS 웹 애플리케이션 구축] HPA 적용하기 (0) | 2022.08.19 |
[EKS 웹 애플리케이션 구축] EKS CloudWatch Container Insights 사용하기 (0) | 2022.08.19 |