Terraform Cloud+GitHub Actions+AzureのIaCパイプラインを構築する

# はじめに

Hashicorp公式ドキュメントのチュートリアル（Terraform Cloud+GitHub Actions）の構成を、Azureでやってみた。（ドキュメントではAWSを管理対象としている。）

- ワークフロー
    1. 各branchへコミットされると`terraform plan`が走ってCloud上で結果を確認できる
    1. mainブランチが更新されると`terrafrom apply`されてリソースが変更される


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/eaaff38b-b51e-4967-9460-f7cb7fe8e112.png)


https://developer.hashicorp.com/terraform/tutorials/automation/github-actions

# 構築
### GitHubにリポジトリを作成
Terraform Cloudと連携させる用のリポジトリを作成しておく。
今回は面倒なので、providerブロックの中にサービスプリンシパルのシークレットを埋め込んだ。

```:main.tf
terraform {
  required_version = ">=0.12"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "xxxx"
  tenant_id         = "xxxx"
  client_id         = "xxxx"
  client_secret     = "xxxx"
}

（以下リソース定義）
```

### Terraform Cloudでワークスペースを作成
Projects & workspacesページから新しいワークスペースを作成する。
**API-driven workflow**を選択し、次のページではワークスペースの名前を付けて作成。
![110700 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/60c0613a-dd6e-faa4-599f-a5d8f29eae52.png)
![110719 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/d61058d9-63ef-31d1-3561-04598435dc9a.png)


User Settings>Tokensページで**create an API token**をし、適当な名前を付けてGitHubと連携するためのトークンを生成する。
シークレットは生成されたタイミングしか表示できないので、メモ帳にコピーしておく。
![112326 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/191f3a2f-812e-22ca-d19b-700324fdeb58.png)



### GitHubでトークン文字列を設定
リポジトリの設定ページから Secrets and variables>actionsに移動し、**New repository secret**をする。
キーは`TF_API_TOKEN`として、コピーしておいたシークレットを登録する。

![114948 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/704096bc-12ad-2f4f-9059-be7e4f750dad.png)



### GitHub Actionsのワークフローを定義
リポジトリに`.github/workflows`フォルダを作成し、中にymlファイルを置いていく。
今回は公式チュートリアルのリポジトリを参考に、terraform-plan.ymlとterraform-apply.ymlを必要なところだけ修正していく。（envブロックとjobsブロックだけ修正すれば動く）

https://github.com/hashicorp-education/learn-terraform-github-actions/tree/main


```:terraform-plan.yml / terraform-apply.yml
(省略)

env:
  TF_CLOUD_ORGANIZATION: "xxxxx" #Terraform CloudのOrganization名
  TF_API_TOKEN: "${{ secrets.TF_API_TOKEN }}"
  TF_WORKSPACE: "avd_example_api-driven" #API-Drivenのワークスペース名
  CONFIG_DIRECTORY: "./"

jobs:
  terraform:
    name: "Terraform Apply"
    runs-on: ubuntu-latest
(省略)
```

### テスト
作業用ブランチを作成して、GitHubにpushする。
```
$ git checkout -b 'update-tfc-org'
$ git push origin update-tfc-org
```

GitHub上で`update-tfc-org`ブランチから`main`ブランチにプルリクエストを作成する。
GitHub ActionsでTerraform planの実行結果が表示される。
![123318 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/6d2cbfda-553c-e9a8-7109-94ce0d2b14e8.png)

`Terraform Cloud Plan`のリンクを飛ぶと変更の詳細を確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/dd87ad15-1503-f641-bb81-fa823f4a3f54.png)

mainブランチにマージするとApplyされ、リソースが作成される。
![123446 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523715/8ac903b2-7901-8f07-03dd-2169e66abe7f.png)

# 参考
https://www.softbank.jp/biz/blog/cloud-technology/articles/202303/terraform-cloud/