2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Azure で Terraform をはじめる

Last updated at Posted at 2023-11-05

Azure のリソースを Terraform で管理すべく、とりあえず「リソースグループだけ作成する」ところまでやった。

Azure 側準備

前提として、Azure テナントとサブスクリプションは既に作成済みであるものとする。

1. tfstate 置き場を作る

[2024.03 追記] Blob コンテナに tfstate 置くやりかた書いてみたけど、わりとめんどいので雑に検証するだけならローカルに tfstate 置くやりかたでいいと思う [追記終わり]

Azure リソースを Terraform で扱うのであれば特定のリソースグループ全体を扱うのがわかりやすいと思うし、その場合 tfstate の保存場所はそのリソースグループとは別の場所であるべきなのではないか。

  1. tfstate 用のリソースグループを作る
    • 名前は {プロジェクト名}-tfstate にした
  2. ストレージアカウントを作る
    • 名前が Azure 全体で unique かつ24文字までしか使えなくて困る
    • とりあえず tfstate{ランダム数字列} にした
  3. Blob コンテナを作る
    • 名前は tfstate にした

2. Terraform 用のサービスプリンシパルを作る

Terraform にリソースの作成をしてもらうためには権限を与える必要があるので、そのためのサービスプリンシパルを用意する。

  1. サービスプリンシパルを作る
    • Microsoft Entra ID > アプリケーションの登録
    • 名前は {プロジェクト名}-terraform にした
  2. クライアントシークレットを作る
    • (1.で作成したアプリケーション) > 証明書とシークレット > クライアントシークレット
    • 作成したクライアントシークレットを控えておく
  3. 共同作成者 ロールを付与する
    • サブスクリプション > アクセス制御 (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

参考資料

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?