★ 初級

01. プロバイダと認証

Azure を Terraform で扱う最初の一歩は azurerm プロバイダ の宣言と 認証。Azure ならではの「Subscription / Tenant」概念と 4 通りの認証方法を整理します。

最小構成

terraform {
  required_version = ">= 1.6"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
  }
}

provider "azurerm" {
  features {}
}

# ここから resource を書ける
resource "azurerm_resource_group" "main" {
  name     = "rg-myapp-prd"
  location = "Japan East"
}

features ブロックの役割

provider "azurerm" { features {} }必須。空でも書く必要があります。中身は「Azure リソースの削除時挙動」をカスタマイズする場所で、たとえば Key Vault の soft_delete 動作を制御します。

provider "azurerm" {
  features {
    resource_group {
      prevent_deletion_if_contains_resources = true   # RG にリソースが残っていれば destroy 拒否
    }
    key_vault {
      purge_soft_delete_on_destroy = false   # 本番では false にして「7-90 日」の復旧期間を保つ
    }
    virtual_machine {
      delete_os_disk_on_deletion = true      # VM destroy で OS ディスクも消す
    }
  }
}

Tenant / Subscription / Resource Group

Azure には AWS よりひとつ多い階層概念があります:

[Microsoft Entra ID Tenant]   ← 組織(メールドメインに紐づく)
   ├── [Subscription A]       ← 請求とアクセス制御の境界(AWS Account 相当)
   │      └── [Resource Group X]   ← リソースの論理グループ
   │             ├── azurerm_virtual_network
   │             ├── azurerm_storage_account
   │             └── azurerm_linux_virtual_machine
   └── [Subscription B]
          └── ...
用語役割AWS 対応
Tenant組織(Entra ID)の単位AWS Organizations Root
Subscription請求・IAM スコープAWS Account
Resource Group関連リソースの箱AWS では概念なし

認証方法(4 通り)

  1. Azure CLI: ローカル開発で最も手軽。az login しておけば azurerm が自動で使う
  2. Service Principal: client_id / client_secret / tenant_id を使う。CI で旧来から使われた方式
  3. Managed Identity: Azure VM / App Service 等で動かす際に、リソース自身に割り当てた ID を使う
  4. OIDC(フェデレーション): GitHub Actions / GitLab CI から、シークレットなしでロール引き受け。2026 年の推奨

環境変数(Service Principal の例)

export ARM_CLIENT_ID="00000000-0000-0000-0000-000000000000"
export ARM_CLIENT_SECRET="..."           # OIDC を使うならこの行は不要
export ARM_SUBSCRIPTION_ID="11111111-1111-1111-1111-111111111111"
export ARM_TENANT_ID="22222222-2222-2222-2222-222222222222"

terraform plan

GitHub Actions × OIDC

Azure 側にフェデレーテッド資格情報を設定 → ワークフローで azure/login@v2 を使い、シークレット保存なしで認証します。

permissions:
  id-token: write
  contents: read

jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: hashicorp/setup-terraform@v3
      - run: terraform init
      - run: terraform plan
フェデレーテッド資格情報の作成 Entra ID のアプリ登録 → 「フェデレーテッド資格情報」→ GitHub Actions を選び、repo:org/repo:ref:refs/heads/main 等の subject を登録。シークレット保存不要。

複数 subscription の使い分け

1 つの Terraform で複数 subscription を扱う時は、AWS と同様に alias を使います。

provider "azurerm" {
  features {}
  subscription_id = "11111111-..."   # 本番
}

provider "azurerm" {
  alias           = "sandbox"
  features {}
  subscription_id = "22222222-..."   # 検証
}

resource "azurerm_resource_group" "sandbox" {
  provider = azurerm.sandbox
  name     = "rg-sandbox"
  location = "Japan East"
}