프로젝트에서 CI 도구로는 GitHub Actions, CD 도구로는 ArgoCD를 이용했다. GitHub Actions를 이용한 이유는 촉박한 시간에서 쉽게 설정할 수 있었기 때문이다. 또한 Jenkins는 사용해 본 적이 있기 때문에 GitHub Actions를 통해서 CI를 설정하였다. 푸시하면 연동된 ECR로 자동으로 업로드되도록 코드를 설정하였다.
backend
name: CI
on:
push:
branches:
- main
env:
AWS_REGION: ap-northeast-2
REGISTRY: <id>.dkr.ecr.ap-northeast-2.amazonaws.com
REPOSITORY: <repo_name>
IMAGE_TAG: back
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
- name: login to ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag and push docker image to Amazon
id: build-image
env:
ECR_REGISTY: ${{ steps.login-ecr.outputs.registry }}
run: |
docker build -t ${{ env.REGISTRY }}/${{env.REPOSITORY}}:${{env.IMAGE_TAG}} .
docker push ${{ env.REGISTRY}}/${{env.REPOSITORY}}:${{env.IMAGE_TAG}}
frontend
name: CI
on:
push:
branches:
- master
env:
AWS_REGION: ap-northeast-2
REGISTRY: <id>.dkr.ecr.ap-northeast-2.amazonaws.com
REPOSITORY: <repo_name>
IMAGE_TAG: front
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
- name: login to ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag and push docker image to Amazon
id: build-image
env:
ECR_REGISTY: ${{ steps.login-ecr.outputs.registry }}
run: |
docker build -t ${{ env.REGISTRY }}/${{env.REPOSITORY}}:${{env.IMAGE_TAG}} .
docker push ${{ env.REGISTRY}}/${{env.REPOSITORY}}:${{env.IMAGE_TAG}}
이후 push가 되었는데도 웹페이지에 제대로 반영이 되어있지 않아 살펴보았다. Deployment.yaml의 imagePullPolicy가 제대로 작동하지 않는 문제였다. 공식문서를 살펴보면, tag가 latest일때만 imagePullPolicy가 default로 설정되고, 다른 태그일 경우에는 따로 imagePullPolicy를 always로 설정해 줘야 한다. 설정한 후 웹 페이지에 push된 최근 이미지가 잘 반영되는 것을 확인하였다.
또한, aws의 secret key를 그대로 github의 secret에 저장하면 보안 문제가 발생할 수 있다는 것을 알게 되었는데, 이는 RBAC로 해결 가능한 부분이라고 한다. 나중에 시간이 되면 RBAC를 적용해 볼 예정이다.
그리고 ECR에서 자꾸 untagged가 늘어나 좀 더러워지는 것 같은 면이 있는데, 이것은 버전을 자동으로 바꾸게 하는 것으로 해결 할 수 있는 것으로 보인다. 하지만 태그를 유지하면서 자동으로 이전 버전을 삭제하게는 못 하는 건가? 이 쪽은 더 찾아봐야 할 것 같다.