EMD Blog

[Terraform] Terraform Cloud Workflow (1) - UI/VCS-driven Runs 본문

IaC/Terraform

[Terraform] Terraform Cloud Workflow (1) - UI/VCS-driven Runs

EmaDam 2022. 2. 25. 10:45

Terraform Cloud의 Workflow 3가지를 정리하려 한다. 이 내용들은 Terraform Cloud 문서화가 되어있긴 하지만 영어로 되어있기도 하고 번역이 매끄럽지가 않기 떄문에 이렇게 정리해두면 누군가에게는 도움이 될 수 있지 않을까 해서 정리해본다. 

 

UI/VCS-driven Runs

UI/VCS-driven Runs Workflow는 Terraform Cloud를 사용할 경우 기본적으로 채택하게 되는 workflow이다. 이 workflow에서는 모든 workspace가 VCS(Github 같은)의 특정 분기와 연결된다. 작동 방식은 아래와 같다.

  1. Terraform에서 workspace를 생성할 때 VCS 선택한다. (Webhook)
  2. 해당 VCS에서 새 커밋에 대한 병합이 발생하면 Terraform Cloud에서 코드 실행

만약 병합이 아니라 Pull Request가 발생한다면 Terraform Cloud는 이 Pull Request를 병합할 경우 어떻게 인프라가 변경될 지 표시(Plan)해준다. 이는 변경될 부분을 표시만 해주고 실제 반영은 하지 않는다.

위 내용들을 종합하면 아래처럼 설명할 수 있다.

  • VCS에서 커밋 병합시 → Terraform Cloud에서는 terraform apply에 해당하는 작업 수행
  • VCS에서 Pull Request시 → Terraform Cloud에서는 terraform plan에 해당하는 작업 수행

또한 Terraform Cloud에서 Terraform 코드는 VCS에서 제공되기 때문에 특정 commit과 연결된다.

 

VCS 변경사항 트리거 실행

기본적으로 VCS에서 병합이 발생하면 Terraform Cloud에서는 코드가 자동으로 실행된다. 하지만 무조건 자동 실행되는 것은 아니고 몇 가지 조건이 있다.

 

[VCS의 다른 분기에 병합이 발생했을 때]

여기서 분기라고 함은 Github기준으로 Branch를 말한다. 각 workspace는 VCS 저장소의 한 분기에만 연결되기 떄문에 같은 저장소라 할 지라도 지정한 분기에서 병합이 발생하지 않으면 자동으로 실행되지 않는다. 또한 수동으로 실행시키더라도 지정한 분기에서의 코드만 실행하기 때문에 다른 분기의 병합은 아무런 영향도 주지 않는다.

 

[Terraform 작업 디렉터리가 구성된 경우]

Terraform은 작업 디렉토리를 설정할 수 있다. 작업 디렉토리가 없다면 전체 리포지토리에 대한 모든 변경사항을 트리거하고 작업 디렉토리가 존재하면 해당 디렉토리 내 변경사항만 트리거 하게 된다. 이 작업 디렉토리는 여러개가 있을 수 있으며, 작업 디렉토리를 설정하더라도 전체 리포지토리에 대한 변경사항을 트리거 하도록 설정할 수도 있다. 자세한 내용은 아래 두 문서 참고.

 

- VCS Connections - Workspaces - Terraform Cloud and Terraform Enterprise | Terraform by HashiCorp

- Settings - Workspaces - Terraform Cloud and Terraform Enterprise | Terraform by HashiCorp

 

[한번도 코드를 실행한 적이 없는 경우]

코드를 한번도 실행한 적이 없다면 변경 사항을 트리거로 하는 자동 실행은 허용되지 않는다. 즉, 자동 실행을 사용하고 싶다면 workspace를 생성한 후 수동으로 한번 실행시켜 줘야 한다.

 

Terraform Cloud로 수동 실행

자동 실행은 위에서 설명한 것처럼 VCS의 변경 사항을 트리거로 하기 때문에 Terraform Cloud 상에서 변경한 변수 같은 것들은 반응하지 않는다. 그렇기 때문에 이런 변수들을 수정했다면 UI를 통해 수동으로 코드를 실행시켜야 한다.

수동으로 실행 시킬 때는 일반 모드새로 고침 전용 모드 중 하나를 선택해서 실행시킬 수 있다.

 

새로 고침 전용 모드는 terraform refresh와 대응되는 모드이며 이미 생성되어 있는 인프라와 비교하게 된다. 만약 다른 부분이 존재한다면 state 파일을 업데이트 한다.

 

Terraform Cloud에서 코드를 수동으로 실행시키려면 계획을 대기열에 넣을 수 있는 권한이 필요하다.

- Permissions - Terraform Cloud and Terraform Enterprise | Terraform by HashiCorp

위 문서에서는 일반 작업 영역 권한에 해당 권한이 포함되어 있다.

 

계획 확인 또는 폐기

Terraform Cloud에서 코드를 실행을 하기전에 인프라에서 어떤 리소스가 추가되고 어떤 리소스가 삭제되는 지(plan) 먼저 보여준다. 이때 이 plan을 확인해서 해당 plan을 실행 시킬 지 아니면 폐기 시킬지 결정할 수 있으며 해당 계획에 댓글을 남길 수도 있다.

만약에 계획에 오류가 없을 경우 자동으로 실행되도록 설정하고 싶다면, 설정 페이지에서 자동 적용 기능을 활성화 할 수 있다. 이 기능은 사용자가 실행 트리거 및 실행을 적용할 권한을 가지고 있어야 한다.

- Settings - Workspaces - Terraform Cloud and Terraform Enterprise | Terraform by HashiCorp

 

Pull Request Plan

VCS에서 Pull Request가 들어오면 해당 VCS의 Pull Request 상태창에서 Terraform Cloud 링크를 보여준다. (아래 이미지)

 

Detail을 클릭하면 Terraform Cloud로 이동하며, 이동한 후 나오는 페이지에서는 Pull Request에 대한 Plan이 표시된다. 이 Pull Request에 대한 Plan은 VCS에서 링크를 타야만 확인이 가능하며, VCS를 거치지 않고 Terraform Cloud 페이지에서 직접 접근하는 방법은 없다.

참고로 이 VCS의 분기와 연결되어 있는 Terraform Cloud Workspace가 여러개라면 링크도 여려개가 표시되고, 링크를 클릭하더라도 해당 Terraform Workspace에 대한 권한이 없다면 Plan을 확인할 수 없다.

이 Pull Request에 대한 Plan은 무조건 발생하는 것은 아니고 특정 규칙에 따라 발생하는데 그 규칙은 아래와 같다.

  • 동일한 Repository의 Pull Request에서만 트리거되지만 Terraform Enterprise 버전 v202005-1이상을 사용하고 있다면 fork된 Repository에서의 Pull Request도 트리거 된다.
  • 해당 Terraform Cloud Workspace 설정에서 Automatic speculative plans 옵션을 활성화 해야한다.
  • 연결된 분기에서의 Pull Request만 트리거 된다.
  • 작업 디렉토리가 구성되어 있는 경우, 작업 디렉토리 외 부분에 대한 Pull Request는 트리거 되지 않는다.
  • 만약에 Terraform Cloud에서의 Plan은 정상인데 VCS에서 Commit에 에러가 발생한 경우 해당 에러는 Terraform Cloud Plan에 영향을 주지 않는다. (계속 정상으로 표시됨.)

Pull Request에 대한 Plan은 Pull Request 반영 전과 후의 상태를 비교하며, 만약 변경사항이 너무 많을 경우 Plan 정확하게 표시가 되지 않을 수도 있다.

 

 

다음 포스팅에서는 CLI 기반 Workflow를 정리해보겠습니다.