devops
Github action + Vault + ECR + ArgoCD CICD 파이프라인 구축하기 본문
우리 팀에서는 실제 여러 클라우드 환경에서 서비스를 운영, 테스트하고 있기 때문에 서비스 별로 각기 다른 config 파일을 관리해야 한다. 처음엔 환경마다 Parameter store를 이용해 파일과 key들을 관리했지만 환경에 접속해서 매번 수정하는 게 아주 번거로웠다. 특히나 github action에서 action을 위한 secret 환경변수도 레포마다 관리하는 것이 쉽지 않았다.
이렇게 흩어져있는 설정 파일 혹은 key값들을 중앙화시킬 필요가 있었고, 쿠버네티스를 사용하기 때문에 모든 환경에서 작동하는 컴포넌트의 배포 상태와 흐름을 파악할 수 있어야 했다. 이 요구사항들을 바탕으로 Vault, ECR, ArgoCD가 사용되는 Github action CICD 파이프라인을 구축하게 되었다.
EKS에 배포되는 CICD 파이프라인은 위와 같다. github Repo에 특정 branch의 소스코드의 변경이 있으면 트리거가 되어 github action이 시작된다.
1) github action의 workflow에 따라서 도커 이미지가 빌드되고 빌드된 이미지는 ECR에 push 된다.
2) github action에서 생성된 이미지의 태그로 argoCD manifest 파일을 수정한다.
3) argoCD는 수정된 manifest에 맞춰 EKS 재배포를 진행한다.
4) EKS에서 배포되는 이미지는 ECR를 통해서 pull 한다.
Repo에는 VAULT의 접근 인증을 위한 VAULT_URL, VAULT_TOKEN, VAULT_CA_CERT 를 제외하고는 나머지 config 파일과 token, key 값 모두 vault의 kv 시크릿으로 저장된다.
# github action workflow
- name: Import Secrets
id: import-secrets
uses: hashicorp/vault-action@v2
with:
url: ${{ secrets.VAULT_URL }}
token: ${{ secrets.VAULT_TOKEN }}
caCertificate: ${{ secrets.VAULT_CA_CERT }}
secrets: |
eden/kv frontnode | FRONTNODE_CONFIG ;
eden/kv argoCD | cloneArgoCD ;
eden/kv aws_access_key | AWS_ACCESS_KEY_ID ;
eden/kv aws_secret_access_key | AWS_SECRET_ACCESS_KEY ;
eden/kv github_token | GITHUB_TOKEN
이렇게 경로를 기준으로 여러 서비스의 민감 데이터를 vault로 중앙화하여 관리하면 매번 repo, 클라우드 환경 별로 번거롭게 관리할 필요가 없어진다.
현재 전체적인 파이프라인 구축을 위해서 배포에 필요한 모든 시크릿을 구성했지만, 앞으로 공통으로 사용할 시크릿, 서비스 별 시크릿을 구분, 특정 시크릿을 관리할 수 있는 User를 추가할 계획이다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
AWS Credential은 환경별로 github action용 User를 생성했다. User의 Role은 단순히 ECR 권한만 부여하기 때문에 OIDC 토큰을 굳이 사용할 필요가 없었다.
그 외에 ECR에 이미지를 push 하거나, argoCD의 manifest를 수정하는 것은 간단하지만 Docker 이미지 빌드를 위해서 Private repository의 패키지를 Import 할 수 있도록 구성하는데 시간이 많이 소요되었다. (사실 코드만 보면 간단...)
# install git & credential
RUN apt-get update && apt-get install git curl
RUN git config --global credential.helper '!f() { echo "username=${GITHUB_TOKEN}"; echo "password=x-oauth-basic"; }; f'
vault에서 받아온 시크릿 중 GITHUB_TOKEN은 Dockerfile의 gith credential을 위한 것이고, 위 코드를 통해서 이 문제는 해결할 수 있었다.
'DevOps > Vault' 카테고리의 다른 글
Vault Secrets Engine 정의와 KV Secrets Engine v2 테스트 (0) | 2023.05.21 |
---|---|
Hashicorp Vault 서버 배포하기 (0) | 2023.03.01 |