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 通り)
- Azure CLI: ローカル開発で最も手軽。
az loginしておけば azurerm が自動で使う - Service Principal: client_id / client_secret / tenant_id を使う。CI で旧来から使われた方式
- Managed Identity: Azure VM / App Service 等で動かす際に、リソース自身に割り当てた ID を使う
- 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"
}