새소식

IaC/Terraform

[Infracost] 테라폼 리소스 비용 한눈에 보기 - 2. Atlantis 연동

  • -

현재 Infracost 를 활용하여 다음과 같은 테스트를 진행 중이다.

 

1) Local 환경에서 직접 Infracost 를 실행해보기 ! 완료

2) Terraform 협업 툴인 Atlantis 와 융합하여 Infracost 를 PR 에 적용하기 !

3) AWS Code Series 에 Infracost 적용해보기 !

 

 

Infracost 에 대한 설명과 Local 환경에서 작동하는 법은 이전 포스팅을 참고해주세요 :)

 

[Infracost] 테라폼 리소스 비용 한눈에 보기 - 1. Local 환경에서 실행

이전에 AWS Meet-up 에 참가하게 되었을 때 그곳에서 처음 Infracost 에 대해서 알게 되었다. Infracost 는 테라폼으로 배포되는 리소스의 비용을 대략적으로 파악할 수 있도록 해주는 오픈소스 도구이다

kimalarm.tistory.com

 

 

이번 포스팅에서는 Terraform 협업 PR 도구인 Atlantis 와 Infracost 를 함께 사용하는 법을 알아보자 !!

 

사용한 Terraform Code 및 Atlantis Config 파일은 GitHub 에 저장해두었습니다.
 

GitHub - AlarmKimKB/Atlantis_GitLab: Atlantis & Infracost Test for GitLab

Atlantis & Infracost Test for GitLab. Contribute to AlarmKimKB/Atlantis_GitLab development by creating an account on GitHub.

github.com

 



1. Atlantis 란 ??


Terraform Code Pull Request(PR) 자동화 오픈소스 도구

 

 

테라폼을 혼자 사용할 때는 로컬에서 바로 운영해도 문제가 없지만,

팀 단위로 사용하게 되면 테라폼 코드에 대해서 관리의 필요성을 느끼게 될 것이다.

 

이를 위해 S3 나 Git 등에 테라폼 코드를 커밋하여 관리하는 방법 등을 고려하게 된다.

 

Atlantis 는 테라폼 코드를 Git 으로 관리할 때 사용할 수 있는 도구이다.
보통 Git 을 사용해 협업을 한다면 Git Branch 를 나눠서 작업한 후 Merge 하는 식의 PR 을 생성하게 되는데,

이 때 Atlantis 를 사용한다면, Atlantis 명령어를 통해 PR 승인 후 테라폼 리소스 배포까지 자동으로 진행시켜 준다.

 

참고로 Atlantis 는 Terraform 리소스 배포 시, Lock 기능도 제공하고 있다.

 

 

Atlantis 에 대해서 더 궁금하다면 아래의 공식 홈페이지를 찾아가보자.

 

Introduction | Atlantis

Introduction Getting Started If you'd like to just test out running Atlantis on an example repo check out the Test Drive. If you'd like to test out running Atlantis on your repos then read Testing Locally. If you're ready to properly install Atlantis on re

www.runatlantis.io

 

 

Atlantis 검토 시, 어떤 Git 저장소를 사용할 지도 함께 고려하자 !!

Atlantis 는 다양한 Git 저장소를 지원하고 있다.
원래 GitLab 과 GitHub 둘 다 테스트를 진행하고 있었는데,
현재 진행하고 있는 테라폼 스터디에서 GitHub 와 Atlantis 를 연동하신 분이 계셔서 이번 포스팅에서는 GitLab 으로 진행하겠다.

 

 

  • GitHub 와 Atlantis를 연동하고 싶다면 아래 게시글을 참고해보자
 

Github에서 Atlantis를 이용한 Terraform 협업 환경 구축하기

* 이 글은 CloudNet@ Terraform Study(T101)을 진행하며 학습한 내용을 바탕으로 작성하였습니다. Intro 업무 환경에 테라폼을 사용하면 할수록 늘 새로운 의문점들이 생겨나곤 했습니다. 현재로서도 강력

isn-t.tistory.com

 

1.1. Atlantis Config ...

Atlantis 에는 Server-Side ConfigRepo 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 에 접근할 수 있는 UserAccess 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 연동을 위한 공식 이미지를 배포하고 있다.
그만큼 많이 사용하고 있다는 게 아닐까 싶다.

 

Docker Hub

 

hub.docker.com

 

sudo docker pull infracost/infracost-atlantis

 

3.2. Atlantis 실행

  • 컨테이너 실행 시, Server-Side Config 파일을 생성해서 지정해줘도 되지만,
    여기서는 json 형태로 Server-Side Config 내용을 선언해주겠다.

 

다음 내용을 변경해주자
  1. GitLab-User
  2. GitLab-Access-Token
  3. GitLab-Repo-URL
  4. 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 권한을 부여해주었다.

Developer 권한 부여 시

 

 

 


 

이번 포스팅에서는 Infracost 와 Atlantis 를 활용한 PR 자동화를 구현해보았다.

 

다음에는 AWS Code Series 에 Infracost 를 연동시켜 보는 것을 포스팅 해보겠다.

 

 

Contents

포스팅 주소를 복사했습니다