✅ 이 블로깅은 테라폼으로 시작하는 IaC 책을 기반으로 작성한다.


테라폼 스터디의 마지막 과제로 Gihub Actions를 이용한 Terraform 자동화를 할 것이다!

아래 하시코프 docs를 참고하여 진행하겠다

참조 ) Automate Terraform with GitHub Actions - Terraform - HashiCorp Developer

Untitled

테라폼 코드는 Github으로 관리하고 테라폼 State 관리는 Terraform Cloud에서 할 것이다.

해당 그림은 Pull Request를 요청하면 Main 브랜치에서 승인하여 Terraform Cloud에 반영되는 Github Actions 자동화 워크플로우이다.

Terraform Cloud 설정

먼저 AWS Credentials는 생성했다고 가정하고 진행하겠다.

Terraform Cloud에 AWS 리소스를 배포하기 위한 AWS Credentials를 추가하고 Github Actions에서 Terraform Cloud에 접근하기 위한 API Token을 생성해줘야 한다.

  1. Terraform Cloud → AWS
  2. Github Actions → Terraform Cloud

일단 Workspace를 생성한다.

  • Type : API-driven workflow
  • Workspace Name : learn-terraform-github-actions

그 다음은 AWS Credentials를 Terraform Cloud의 Environment Variables로 추가해 줄 것이다.

Untitled 1

Environment Variables가 어딨는지 한참 찾았는데 Workspace > Variables 탭에 있더라!

Key/Value에 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY를 추가해 주어야 한다

이 때, Terraform Cloud에서는 Environment Variables를 Sensitive 옵션을 통해 가릴 수도 그대로 노출할 수도 있다

Untitled 2

아래 사진은 Sensitive 옵션을 사용한 Variables와 안한 Variables의 차이이다.

Untitled 3

다음은 User Settings > Tokens > Create an API token 으로 Github Actions에서 사용할 API token을 생성하자

Untitled 4

GitHub Repository 설정

테라폼 코드는 아래 저장소를 사용!

참조 ) https://github.com/hashicorp-education/learn-terraform-github-actions

Use this template > Create a new repository를 통해 내 개인 레포에 이 저장소에 있는 템플릿을 가져올 것이다.

Untitled 5

이제 이 레포의 Settings > Security > Secrets and variables > Actions에 들어가서 Terraform Cloud의 API token을 등록해 줄 것이다

Untitled 6

Github Actions Workflow 검토

  • main.tf : 간단하게 ap-northeast-2 리전에 apache 서버를 8080 포트로 노출시켜 배포하는 코드이다.
  • .github/workflows/terraform-plan.yml
    • env에서 Terrform Cloud의 Organization 명을 변경해 준다

      Untitled 7

    • repository에서 contents를 읽을 수 있는 read 권한과 pull-requests에 쓸 수 있는 write 권한도 있어야 한다.

      Untitled 8

    • Checkout → Upload Configuration → Create Plan Run → Get Plan Output → Update PR 단계를 거치게 된다. 해당 Git Repo를 Checkout하고 Terraform Cloud에 변경사항을 업로드하면서 Plan을 실행하고 결과를 출력해 준다. 마지막으로 PR에 설명을 추가한다.

  • .github/workflows/terraform-apply.yml
    • terraform-plan.yaml과 마찬가지로 Organization 명을 변경해 준다.
    • plan과는 다르게 contents를 읽을 수 있는 read 권한만 추가해 주었다.

      Untitled 9

    • Checkout → Upload Configuration → Create Apply Run → Apply 단계를 거치며 이는 실제 Apply를 하는 단계를 거친다.

풀 요청 생성

  1. update-tfc-org 브랜치를 생성하고 checkout 한다

     $ git checkout -b 'update-tfc-org'
     	Switched to a new branch 'update-tfc-org'
    
  2. 변경사항을 add하고 commit 한다.

     $ git add .github/workflows
     $ git commit -m 'Use our Terraform Cloud organization'
     	[update-tfc-org be46701] Use our Terraform Cloud organization
     	 2 files changed, 3 insertions(+), 3 deletions(-)
    
  3. git push로 원격 레포에 반영한다

     $ git push origin update-tfc-org
     	Enumerating objects: 11, done.
     	Counting objects: 100% (11/11), done.
     	Delta compression using up to 8 threads
     	Compressing objects: 100% (6/6), done.
     	Writing objects: 100% (6/6), 601 bytes | 150.00 KiB/s, done.
     	Total 6 (delta 3), reused 0 (delta 0)
     	remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
     	remote: 
     	remote: Create a pull request for 'update-tfc-org' on GitHub by visiting:
     	remote:      https://github.com/gain-yoo/learn-terraform-github-actions/pull/new/update-tfc-org
     	remote: 
     	To https://github.com/gain-yoo/learn-terraform-github-actions.git
     	 * [new branch]      update-tfc-org -> update-tfc-org
    

풀 요청 검토 및 병합

push하고 나면 아래와 같이 PR을 생성할 수 있다

Untitled 10

자 그럼 LGTM 메세지와 함께 PR을 생성하겠다!

Untitled 11

이 때, basecompare의 브랜치를 잘 확인하여 진행할 것!

오 Plan이 실행된다!!

  • Github Actions 실행

    Untitled 12

    Untitled 13

  • TFC 콘솔에서 Plan 실행

    Untitled 14

다시 PR 생성된 것을 확인해 보면 Plan Output이 보인다!

Untitled 15

EC2 인스턴스가 프로비저닝되었는지 확인

아래 PR을 main 브랜치로 Merge하여 Apply가 실행되게 트리거를 동작시킬 것이다

Untitled 16

그럼 merge 되었다고 화면에 표시되고 해당 PR은 closed 상태로 바뀐다

Untitled 17

아고 근데 워크플로우가 Failed로 떴길래 확인해 보니 오탈자 때문에 syntax 에러가 발생했다 ㅎㅎ..

Untitled 18

다시 작업해 줘야겠다

아래 사진처럼 트리거가 동작하여 terraform-apply.yml을 실행시키고 실제 Apply가 진행될 것이다

Untitled 19

진행중인 단계에서 TFC 링크로 바로 들어갈 수 있다

Untitled 20

그럼 현재 TFC에서 Apply를 실행시켜 실제 리소스가 배포된 것과 Outputs을 통해 동작 여부를 브라우저로 확인도 가능하다

Untitled 21

Untitled 22

Untitled 23

배포 성공!

Resource 및 Workspace 삭제

참조 ) Destroy resources and workspaces - Terraform - HashiCorp Developer

리소스 삭제도 workflow로 연동할 수 있는데 오늘은 위 링크처럼 TFC에서 삭제해 주겠다!

Untitled 24

실제 배포된 리소스를 삭제하거나 TFC의 workspace를 삭제하는 것이다

  • Queue destroy plan
    • terraform plan -destroy -out=destroy.tfplan 명령어와 같다. 이는 tfplan 파일을 통해 리소스 생성 혹은 삭제하는 plan을 관리하는 것이다.
    • 해당 파일을 기반으로 삭제하려면 terraform apply destroy.tfplan을 수행해야 한다!
  • Force Delete from Terraform Cloud
    • 이는 TFC의 Workspace만 삭제하는 것으로 실제 리소스는 삭제하지 않는다는 것을 주의한다!

이제 Queue destroy plan을 눌러 리소스를 삭제하자!

destroy plan을 확인하고 아래 Cofirm & Apply를 눌러 삭제를 진행하자!

Untitled 25

삭제는 깔끔하게 완료하였다

UI로 직관적으로 삭제 확인이 가능하여 TFC가 유용하다

결론

장점은 여럿있다.

Github을 코드저장소로 사용하여 코드 히스토리 관리가 가능하고 코드 수정 및 코드 공유가 쉽다

Github Actions로 Plan 및 Apply 자동화가 가능하며, 협업하기 위해 PR 및 Merge를 이용하는 것이 공동 작업을 하기 적당해 보인다. Destroy도 workflow를 만들 수 있지만 이 글에는 추가하지 않았다.

단점으로는 작업자가 동시에 push를 올렸을 때 충돌..? PR의 순서가 애매해지나..? 겪어보지 않아서 어떤 이슈가 발생할지는 정확히 모르겠지만 state 관리가 난해해 질거라 예상된다

그럼에도 불구하고 협업을 위한 Gitops로 사용하기 좋은 플로우라고 생각한다! 언젠가 나도 업무에서 쓸 날을 고대하며 마무리한다🥺

Categories:

Updated:

Leave a comment