Azure のリソースを Terraform で管理すべく、とりあえず「リソースグループだけ作成する」ところまでやった。
Azure 側準備
前提として、Azure テナントとサブスクリプションは既に作成済みであるものとする。
1. tfstate 置き場を作る
[2024.03 追記] Blob コンテナに tfstate 置くやりかた書いてみたけど、わりとめんどいので雑に検証するだけならローカルに tfstate 置くやりかたでいいと思う [追記終わり]
Azure リソースを Terraform で扱うのであれば特定のリソースグループ全体を扱うのがわかりやすいと思うし、その場合 tfstate の保存場所はそのリソースグループとは別の場所であるべきなのではないか。
- tfstate 用のリソースグループを作る
- 名前は
{プロジェクト名}-tfstate
にした
- 名前は
- ストレージアカウントを作る
- 名前が Azure 全体で unique かつ24文字までしか使えなくて困る
- とりあえず
tfstate{ランダム数字列}
にした
- Blob コンテナを作る
- 名前は
tfstate
にした
- 名前は
2. Terraform 用のサービスプリンシパルを作る
Terraform にリソースの作成をしてもらうためには権限を与える必要があるので、そのためのサービスプリンシパルを用意する。
- サービスプリンシパルを作る
-
Microsoft Entra ID
>アプリケーションの登録
- 名前は
{プロジェクト名}-terraform
にした
-
- クライアントシークレットを作る
-
(1.で作成したアプリケーション)
>証明書とシークレット
>クライアントシークレット
- 作成したクライアントシークレットを控えておく
-
-
共同作成者
ロールを付与する-
サブスクリプション
>アクセス制御 (IAM)
>追加
>ロールの割り当ての追加
- ロールに
共同作成者
を指定、メンバーにさきほど作成したアプリケーション (サービスプリンシパル) を指定する
-
Terraform コードを書いて適用する
Terraform コード
variables.tf
variable "project_name" {
type = string
}
variable "region" {
type = string
}
variable "azure" {
type = object({
tenant_id = string
subscription_id = string
service_principal = object({
client_id = string
client_secret = string
})
})
}
provider.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>2.0"
}
}
backend "azurerm" {}
}
provider "azurerm" {
features {}
tenant_id = var.azure.tenant_id
subscription_id = var.azure.subscription_id
client_id = var.azure.service_principal.client_id
client_secret = var.azure.service_principal.client_secret
}
main.tf
resource "azurerm_resource_group" "rg" {
name = var.project_name
location = var.region
}
production.tfbackend
resource_group_name = "my-project-tfstate"
storage_account_name = "tfstate01234567"
container_name = "tfstate"
key = "production.tfstate"
production.tfvars
project_name = "my-project-production"
region = "japaneast"
azure = {
tenant_id = "..."
subscription_id = "..."
service_principal = {
client_id = "..."
client_secret = "..."
}
}
Terraform コマンドを実行
$ terraform init -backend-config=production.tfbackend
$ terraform plan -var-file=production.tfvars
$ terraform apply -var-file=production.tfvars
$ terraform destroy -var-file=production.tfvars