はじめに
Terraform CLIの環境をTerraform Cloudに移行してみました。
その際にローカルとは違う部分や詰まったところを書いていきます。
ローカル(作業端末)はWindows 11で構築するクラウドのリソースはAzureです。
Terraform Cloudの準備
まずはアカウント登録してWorkspaceを作成します。
今回はworkflowをCLI-driven
にしました。
workspaceの設定です。
Execution ModeはRemoteにします。
terraformの実行環境をterraform Cloudに任せるタイプです。
後は適当に。
Terraform CLIでのModuleの構成
Terraform CLIでは共通的な部分をModuleとして利用していました。
各リソースを作成する定義を用意しておき、変数を渡して複数作成できるようにしていました。
home
│ recovery_services_vault.tf
│ resource_group.tf
│ storage_account.tf
│ variables.tf
│ virtual_network.tf
├─env
│ ├─dev
│ │ main.tf
│ │ variables.tf
│ └─prd
│
└─modules
├─lb
│ lb.tf
│ outputs.tf
│ variables.tf
├─nsg
│ nsg.tf
│ variables.tf
└─vm
manageddisk.tf
outputs.tf
variables.tf
vm.tf
呼び出しの指定はこんな感じ。
実行ディレクトリからの相対パスです。
module "main" {
source = "../../"
resource_group = local.resource_group
virtual_network = local.virtual_network
subnet = local.subnet
}
module "vm01" {
source = "../../modules/vm/"
vm = local.vm01_vm
data_disk = local.vm01_data_disk
virtual_network = local.virtual_network.vnet1
subnet = local.subnet.sub1
}
Terraform CloudでのModuleの構成
Module自体はGitHubやS3等色々なサービスで使用出来ますが今回は折角Terraform Cloudを使うので
Terraform Registryに登録してみます。
Module用GitHubリポジトリの作成
Module登録にはGitHubのリポジトリを指定する必要があります。
そのためGitHubのリポジトリを事前に作成しておきます。
リポジトリ名はterraform-<PROVIDER>-<NAME>
とする必要がありますのでAzureの場合、
terraform-azurerm-devmodule 等のようにします。
また、リリースしている必要もありますので忘れずにリリースもします。
なお、リポジトリはPrivateで大丈夫です。
home
│ availability.tf
│ recovery_services_vault.tf
│ resource_group.tf
│ storage_account.tf
│ variables.tf
│ virtual_network.tf
└─modules
├─lb
│ lb.tf
│ outputs.tf
│ variables.tf
├─nsg
│ nsg.tf
│ variables.tf
└─vm
manageddisk.tf
outputs.tf
variables.tf
vm.tf
Terraform RegistryにModule登録
上記のリポジトリを登録
リポジトリが命名規則に則っていない場合は一覧に表示されません。
Terraform Registryでバージョン毎の構成を見れます。
上記のようなフォルダ構成にした場合はmodules
以下のフォルダはサブモジュールとして登録されます。
Moduleの呼び出し
Moduleの呼び出し記述はapp.terraform.io/<organization>/module/azurerm
となります。
Moduleのversionも指定します。
サブモジュールを指定する場合は基本のパスの最後に/
を2つ入れた後に配下のフォルダ名となります。
module "main" {
source = "app.terraform.io/<organization>/module/azurerm"
version = "1.0.4"
resource_group = local.resource_group
virtual_network = local.virtual_network
subnet = local.subnet
}
module "vm01" {
source = "app.terraform.io/<organization>/module/azurerm//modules/vm/"
version = "1.0.4"
vm = local.vm01_vm
data_disk = local.vm01_data_disk
virtual_network = local.virtual_network.vnet1
subnet = local.subnet.sub1
}
Terraform Cloudで実行するように定義していきます。
Terraform Cloudのorganizationとworkspace名を指定します。
テナントIDとサブスクリプションIDはTerrform CloudのVariables
でも登録出来ますが、
気軽に変更出来るようにローカル環境で定義します。
terraform {
cloud {
organization = "<organization name>"
workspaces {
name = "workspace name"
}
}
required_providers {
azurerm = {
source = "hashicorp/azurerm"
}
}
}
provider "azurerm" {
features {}
subscription_id = "<subscription_id>"
tenant_id = "<tenant_id>"
}
Azureへの認証
Azureにはサービスプリンシパルを使って認証します。
Azure Portalでサービスプリンシパルを作成します。
ロールの付与も忘れずに。
シークレットキーとクライアントIDをVariablesに登録します。
- ARM_CLIENT_ID
- ARM_CLIENT_SECRET
Terraform Cloudへの認証
Terraform CloudへはTokenで認証します。
Windowsの場合、Tokenを%APPDATA%\terraform.rc
に格納すれば大丈夫とドキュメントに記載があったのですが、うまく動作しなかったので
terraform login
で遷移した画面でTokenを発行しました。
%AppData%
にterraform.d
というフォルダが出来上がり、その中のファイルに記述されていました。
Token記述の形式は以下です。
credentials "app.terraform.io" {
token = "xxxxxx.atlasv1.zzzzzzzzzzzzz"
}
実行
準備完了後はCLIと同じように実行することでリソース作成が出来ます。
terraform init
terraform plan
terraform apply
実行結果や状態はTerraform Cloudで確認出来ます。
さいごに
複数人で実行する場合はTerraform Cloudで管理するのがいいですね。