はじめに
Hashicorp公式ドキュメントのチュートリアル(Terraform Cloud+GitHub Actions)の構成を、Azureでやってみた。(ドキュメントではAWSを管理対象としている。)
- ワークフロー
- 各branchへコミットされると
terraform plan
が走ってCloud上で結果を確認できる - mainブランチが更新されると
terrafrom apply
されてリソースが変更される
- 各branchへコミットされると
構築
GitHubにリポジトリを作成
Terraform Cloudと連携させる用のリポジトリを作成しておく。
今回は面倒なので、providerブロックの中にサービスプリンシパルのシークレットを埋め込んだ。
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を選択し、次のページではワークスペースの名前を付けて作成。
User Settings>Tokensページでcreate an API tokenをし、適当な名前を付けてGitHubと連携するためのトークンを生成する。
シークレットは生成されたタイミングしか表示できないので、メモ帳にコピーしておく。
GitHubでトークン文字列を設定
リポジトリの設定ページから Secrets and variables>actionsに移動し、New repository secretをする。
キーはTF_API_TOKEN
として、コピーしておいたシークレットを登録する。
GitHub Actionsのワークフローを定義
リポジトリに.github/workflows
フォルダを作成し、中にymlファイルを置いていく。
今回は公式チュートリアルのリポジトリを参考に、terraform-plan.ymlとterraform-apply.ymlを必要なところだけ修正していく。(envブロックとjobsブロックだけ修正すれば動く)
(省略)
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の実行結果が表示される。
Terraform Cloud Plan
のリンクを飛ぶと変更の詳細を確認できる。
mainブランチにマージするとApplyされ、リソースが作成される。
参考