본문 바로가기

DevOps

[Terraform] Atlantis를 통한 Git 협업 #1 - Demo

반응형

Git에서 Terraform으로 협업하기 위해서는 다양한 고려 사항이 필요하다.

Terraform을 혼자 테스트를 하거나 소규모 인원이서 관리하는 경우 큰 무리는 없지만 다수가 Terraform 파일을 관리한다면 협업에 대한 고민을 하게 될 수 있음

실제 Production 리소스에 영향이 있기 때문에 함부로 Apply가 수행되어선 안되며 Local에서 Apply를 수행하는 방향보다는 Git에서 PR 진행 후 Plan 결과 혹은 개발계 수행 결과 문제 없을 경우 Apply가 수행되는 방향이 좋을 것을 보인다.

이러한 상황에서 고려해볼만한 Terraform Runner가 Atlantis이다.

Atlantis는 Terraform Pull Request를 자동화해주는 오픈소스 솔루션으로, Github 혹은 GitLab에서 Pull Request가 발생하면 atlantis.yml에 정의된 대로 Terraform Plan 및 Terraform Apply를 Comment로 가능하게 해줍니다.

 

 

[공식 및 참고 문서]

https://www.runatlantis.io/

https://github.com/ministryofjustice/analytics-platform-atlantis-example/blob/master/atlantis.yaml

https://devops-art-factory.gitbook.io/devops-workshop/terraform/atlantis/atlantis-main

 


1.1. 데모

Atlantis는 Git에서 PR 기반으로 협업을 하기 위해 사용하는 Terraform Runner이기 때문에 Main Branch로 바로 Push 하는 것이 아닌 다른 Branch에서 Push한 뒤 Pull Request를 수행해야 한다.

 

$ 참고 $

필자가 설정한 atlantis.yaml

version: 3
automerge: true
projects:
  - name: dev-test
    dir: ap-southeast-1/test
    workspace: dev
    workflow: terragrunt
    autoplan:
      enabled: false

  - name: prod-test
    dir: ap-southeast-1/test
    workspace: prod
    workflow: terragrunt
    autoplan:
      enabled: false

workflows:
  terragrunt:
    plan:
      steps:
        - env:
            name: TFVARS_FILE
            command: cat env/$WORKSPACE.tfvars
        - run: echo -e "env/$WORKSPACE.tfvars File \\n$TFVARS_FILE \\n\\n\\n"
        - run: terragrunt init -upgrade=true -no-color
        - run: terraform workspace select $WORKSPACE -no-color || terraform workspace new $WORKSPACE -no-color
        - run: terragrunt plan --var-file="env/$WORKSPACE.tfvars" -no-color -out $PLANFILE

    apply:
      steps:
        - run: terragrunt apply -no-color $PLANFILE

 

1. ap-southeast-1/test 폴더에서 개발계와 운영계를 각각 dev.tfvars, prod.tfvars로 구분하였다.
이미 dev-test-bucket-2112 라는 임의의 이름으로 변수를 설정하여 Bucket을 배포한 바 있다.

 

 

 

2. 변수를 아래와 같이 수정하여 dev 브랜치에 Push

region  = "ap-southeast-1"
account = "sandbox"
tags    = {}

test = "dev-test-bucket-changed-variable"

 

 

3. dev 브랜치에 Push

 

 

4. Compare & Pull Request를 클릭한다.

 

 

5. Create pull request를 수행한다.

 

 

6. 처음에는 위와 같이 아무런 표시도 뜨지 않을 것이다. (auto_plan 설정을 disabled 하였음)

그 이유로는 Terraform Workspace를 사용하여 같은 폴더 내에 dev와 prod 리소스가 공존하기 때문에 Comment에서 어떤 환경에 Plan 및 Apply를 할 것인지 정의해주기 위함이다.

 

 

7. Comment에 atlantis plan -p dev-test 명령어를 날리게 되면 Atlantis 서버로 WebHook이 전달되며, Atlantis 서버에서 대신 Terraform을 수행하게 된다.

-p 옵션은 Project Name의 약자로 atlantis.yaml에서 기 설정한 프로젝트 네임을 뜻한다. 이 부분은 아래에 설명을 할 예정이다.

 

 

env/dev.tfvars 파일에 어떤 변수들이 있는지 출력이 되며, 어떤 Directory 및 어떤 Workspace, 어떤 Project에서 수행되는지 출력이 된다.

 

 

 

Atlantis 서버 내 어느 경로에서 Terraform 코드가 복사되어 수행이 되고, 수행한 Plan을 apply 하는 방법 또한 친절하게 알려준다.

그 외에 State Lock을 걸어서 다른 사람이 동시에 수행하지 못하게 한다.

 

 

8. 이제 atlantis apply -p dev-test 명령어로 Apply를 수행하자  
    평소 Local에서 수행했던 것이 아닌 Atlantis 서버에서 수행이 될 것이다.

 

 

9. Apply 수행된 내역이 출력되며 자동으로 Main Branch에 Merge가 되며 Lock 또한 풀리며 자동으로 Pull Request가 Close 된다.

 

 

이렇게 Atlantis를 사용하여 Git에서 PR 베이스로 Terraform CI를 수행하는 것을 확인할 수 있었다.

 

다음 글에서는 Atlantis를 사용할 때 필요한 개념 및 아키텍처 및 배포 Workflow에 대해서 설명할 할 예정이다. 

반응형