[Infracost] 테라폼 리소스 비용 한눈에 보기 - 2. Atlantis 연동
- -
현재 Infracost 를 활용하여 다음과 같은 테스트를 진행 중이다.
1) Local 환경에서 직접 Infracost 를 실행해보기 ! 완료
2) Terraform 협업 툴인 Atlantis 와 융합하여 Infracost 를 PR 에 적용하기 !
3) AWS Code Series 에 Infracost 적용해보기 !
Infracost 에 대한 설명과 Local 환경에서 작동하는 법은 이전 포스팅을 참고해주세요 :)
이번 포스팅에서는 Terraform 협업 PR 도구인 Atlantis 와 Infracost 를 함께 사용하는 법을 알아보자 !!
사용한 Terraform Code 및 Atlantis Config 파일은 GitHub 에 저장해두었습니다.
1. Atlantis 란 ??
Terraform Code Pull Request(PR) 자동화 오픈소스 도구
테라폼을 혼자 사용할 때는 로컬에서 바로 운영해도 문제가 없지만,
팀 단위로 사용하게 되면 테라폼 코드에 대해서 관리의 필요성을 느끼게 될 것이다.
이를 위해 S3 나 Git 등에 테라폼 코드를 커밋하여 관리하는 방법 등을 고려하게 된다.
Atlantis 는 테라폼 코드를 Git 으로 관리할 때 사용할 수 있는 도구이다.
보통 Git 을 사용해 협업을 한다면 Git Branch 를 나눠서 작업한 후 Merge 하는 식의 PR 을 생성하게 되는데,
이 때 Atlantis 를 사용한다면, Atlantis 명령어를 통해 PR 승인 후 테라폼 리소스 배포까지 자동으로 진행시켜 준다.
참고로 Atlantis 는 Terraform 리소스 배포 시, Lock 기능도 제공하고 있다.
Atlantis 에 대해서 더 궁금하다면 아래의 공식 홈페이지를 찾아가보자.
Atlantis 검토 시, 어떤 Git 저장소를 사용할 지도 함께 고려하자 !!
Atlantis 는 다양한 Git 저장소를 지원하고 있다.
원래 GitLab 과 GitHub 둘 다 테스트를 진행하고 있었는데,
현재 진행하고 있는 테라폼 스터디에서 GitHub 와 Atlantis 를 연동하신 분이 계셔서 이번 포스팅에서는 GitLab 으로 진행하겠다.
- GitHub 와 Atlantis를 연동하고 싶다면 아래 게시글을 참고해보자
1.1. Atlantis Config ...
Atlantis 에는 Server-Side Config 와 Repo Level Config 2가지의 Config 파일이 존재한다.
간단하게 짚고 넘어가보자
1. Server-Side Config
서버 내부에 저장되는 Config 파일
PR 단계에서 진행할 일련의 과정(Stage)를 구성
Jenkins 의 Jenkinsfile 이나, AWS CodeBuild 의 build.spec 파일과 유사한 역할을 한다.
2. Repo Level Config
Git Repository 에 저장되는 Config 파일
Git 에 저장된 많은 파일 중, 어떤 Directory 에서 PR 을 실행할 것인지, 어떤 파일이 변경되면 실행할 것인지 구성
즉, Git 저장소에서 Atlantis 로 webhook 을 유도하는 구성 파일이다.
2. GitLab 설정
Atlantis 설치 전, 필요한 GitLab 구성을 진행
Atlantis 가 GitLab Repo PR 에 접근하기 위해서는,
해당 Repo 에 접근할 수 있는 User 와 Access Token 이 Atlantis 에 부여 되어야한다.
2.1. GitLab Access Token 생성
User > Edit Profile > Access Tokens
- Token 이름 및 유효 기간 입력 후 Scopes 는 API 만 선택
- 생성 후 Token 값은 다시는 볼 수 없으니 꼭 복사하여 안전한 곳에 보관하자
2.2. GitLab Repo 생성
- 테라폼 코드를 커밋하고 PR 을 자동화할 Repo 를 생성
사전 준비는 완료되었다.
이제 Atlantis 를 설치하자 !!
3. Atlantis - Infracost 구성
3.1. Atlantis 설치 (Docker)
Atlantis 는 기본적으로 Self-Hosting 을 권장하고 있다.
때문에, Atlantis 를 사용하기 위해서는 서버를 호스팅 해야한다.
서버를 띄웠다면 아래의 명령어를 차례대로 입력하자
sudo yum install -y docker git ruby
sudo systemctl enable docker --now
- ruby 를 사용해 GitLab 과 Atlantis 를 연동할 Webhook Secret 생성 후 저장
ruby -rsecurerandom -e 'puts SecureRandom.hex(32)'
- Atlantis - Infracost 이미지 다운로드
편리하게도 Infracost 에서 Atlantis 연동을 위한 공식 이미지를 배포하고 있다.
그만큼 많이 사용하고 있다는 게 아닐까 싶다.
sudo docker pull infracost/infracost-atlantis
3.2. Atlantis 실행
- 컨테이너 실행 시, Server-Side Config 파일을 생성해서 지정해줘도 되지만,
여기서는 json 형태로 Server-Side Config 내용을 선언해주겠다.
다음 내용을 변경해주자
- GitLab-User
- GitLab-Access-Token
- GitLab-Repo-URL
- Infracost-API-Key (Infracost API Key 가 없다면 이전 포스팅 참고)
sudo docker run \
--restart=unless-stopped -d \
-p 80:4141 \
--name atlantis \
infracost/infracost-atlantis:latest server \
--gitlab-user={GitLab-User} \
--gitlab-token={GitLab-Access-Token} \
--repo-allowlist='{GitLab-Repo-URL}' \
--repo-config-json='
{
"repos": [
{
"id": "/.*/",
"allowed_overrides":["apply_requirements","workflow"],
"allow_custom_workflows":true,
"workflow": "atlantis-infracost"
}
],
"workflows": {
"atlantis-infracost": {
"plan": {
"steps": [
"init",
"plan",
{
"env": {
"name": "INFRACOST_API_KEY",
"value": "{Infracost-API-Key}"
}
},
{
"env": {
"name": "INFRACOST_TERRAFORM_BINARY",
"command": "echo \"terraform${ATLANTIS_TERRAFORM_VERSION}\""
}
},
{
"run": "/home/atlantis/infracost_atlantis_diff.sh"
}
]
}
}
}
}
'
배포가 성공했다면 Atlantis 서버 IP 로 들어가보면 다음과 같은 UI 를 볼 수 있다.
해당 UI 는 Terraform Lock 에 대한 파악만 할 수 있는 간단한 UI 이다.
4. GitLab Webhook 설정
Atlantis 가 GitLab 에 접속할 수 있게 되었으니, 이제 GitLab 의 Webhook 설정을 해주자 !!
- URL : http://{Atlantis-Domain}/events
- Secret Token : Atlantis 서버에서 발급한 Webhook Secret 값
- Trigger : Push events, Comments, Merge request events 3개
- Webhook 생성 후 Push Event 테스트를 진행하여 HTTP 200 이 노출되면 성공
4.1. atlantis.yaml 파일 생성 후 커밋
atlantis.yaml 은 Repo Level Config 파일
## atlantis.yaml 내용
version: 3
automerge: true
projects:
- name: infracost ## Project 명
dir: test ## Terraform 코드를 저장할 Directory
workspace: default ## Terraform Workspace
terraform_version: v1.3.2 ## Terraform Version
autoplan:
when_modified: [ ## Git 에서 아래의 Terraform 파일이 수정될 때 실행
"*.tf",
"../modules/**/*.tf",
"terraform.tfvars"
]
enabled: true
apply_requirements: [approved]
4.2. Terraform Code 커밋 후 PR 생성
- test 디렉토리에 테라폼 코드 생성
## 현재 디렉토리 구조
.
├── atlantis.yaml
└── test
├── Service.tf
└── variables.tf
- PR 을 생성해야 하므로, feature branch 로 커밋
git branch feature
git checkout feature
git push -u origin feature
- GitLab 에서 PR 생성
4.3. PR 에서 Atlantis 동작 확인
- 'atlantis help' 입력 시 화면
- atlantis plan 후, 'show output' 을 펼치면 Infracost 비용 확인 가능
- 'atlantis apply' 후 화면
리소스가 생성 되고 Merge 가 완료되었다고 나온다.
실제 AWS 콘솔에서 확인해보면 방금 Merge 한 테라폼 코드가 실행된 것을 확인할 수 있다 !
PS. 트러블슈팅
- GitLab PR 에서 Atlantis apply 시 다음과 같은 오류가 발생하였다.
Error: goroutine panic. This is a bug.
runtime error: invalid memory address or nil pointer dereference
runtime/panic.go:260 (0x44c995)
runtime/signal_unix.go:835 (0x44c965)
github.com/runatlantis/atlantis/server/events/vcs/gitlab_client.go:209 (0xb8f5fa)
github.com/runatlantis/atlantis/server/events/vcs/proxy.go:72 (0xb947c4)
github.com/runatlantis/atlantis/server/events/vcs/pull_status_fetcher.go:28 (0xb95045)
github.com/runatlantis/atlantis/server/events/apply_command_runner.go:108 (0xd74c15)
github.com/runatlantis/atlantis/server/events/command_runner.go:296 (0xd79823)
runtime/asm_amd64.s:1594 (0x467ca0)
Atlantis Docker 로그를 확인해보니 GitLab Repository 에 커밋할 수 없다는 권한 오류가 발생
docker logs -f atlantis
해결
GitLab Access Token 을 부여한 Atlantis 계정의 권한이 Reporter 로 설정되어 있었다.
Maintainer 이상의 권한을 부여하여 해결.
Developer 권한을 부여하면 Commit 은 가능하지만 PR 자동화가 되지 않아 Maintainer 권한을 부여해주었다.
이번 포스팅에서는 Infracost 와 Atlantis 를 활용한 PR 자동화를 구현해보았다.
다음에는 AWS Code Series 에 Infracost 를 연동시켜 보는 것을 포스팅 해보겠다.
'IaC > Terraform' 카테고리의 다른 글
4주차(1)_Terraform Module (0) | 2022.11.17 |
---|---|
3주차(2)_File Layout 을 이용한 tfstate 파일 격리 (0) | 2022.11.16 |
[Infracost] 테라폼 리소스 비용 한눈에 보기 - 1. Local 환경에서 실행 (0) | 2022.11.12 |
3주차(1)_Workspace를 이용한 tfstate 파일 격리 (0) | 2022.11.10 |
2주차(4)_S3, DynamoDB 를 활용한 tfstate 파일 관리 (0) | 2022.11.10 |