azurerm Provider は Azure Resource Manager (ARM) API を呼び出す Terraform の拡張機能です。認証方式、サブスクリプションの切り替え、タグやリージョンの既定化など、現場でつまずきやすい箇所を試験観点と併せて解説します。
本稿は安定的な公式挙動を前提に書いています。バージョン依存の機能は注意書きを添えており、検証環境での確認を推奨します。
azurerm Provider は Terraform から Azure Resource Manager (ARM) に対してリソースの作成・更新・削除を行うためのコンポーネントです。Terraform 本体は宣言・依存解決・差分計算を担い、実際の API 呼び出しは Provider が担当します。
実務では必ず required_providers でバージョンを固定し、provider ブロックに features {} を明示します。features は azurerm で必須の空ブロックで、消すと初期化時にエラーになります。また、デフォルトで Provider は ARM の Resource Provider (Microsoft.Compute 等) を自動登録します。組織のガードレールで自動登録が禁止されている場合は skip_provider_registration を使用します。
Terraform と azurerm Provider の関係と認証の流れ(概念図)
最小構成(バージョン固定と features、登録スキップの制御)
terraform {
required_version = ">= 1.5.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.100"
}
}
}
provider "azurerm" {
features {}
# 事前にRP登録済みなら true を検討
# skip_provider_registration = true
}
azurerm では複数の認証方式を選べます。ローカル開発は Azure CLI、Azure 上のランナーはマネージド ID、CI/CD はシークレット不要のフェデレーション(OIDC)やサービスプリンシパルなど、実行環境に合わせて使い分けます。
環境変数 (ARM_CLIENT_ID 等) を使うと provider ブロックの機密情報埋め込みを避けられます。OIDC によるフェデレーションはバージョン依存の設定が含まれるため、利用時は該当バージョンの公式ドキュメントでオプション名を確認してください。
| 認証方式 | 代表的な使い方 | 強み | 注意点 |
|---|---|---|---|
| Azure CLI | 開発者ローカルや Cloud Shell | 設定が最小、即時試せる | CI では原則非推奨。実行ユーザーのコンテキストに依存 |
| Managed Identity | Azure VM/VMSS、ACI、Functions、Pipeline Agent など | シークレット不要・ローテーション不要 | 実行リソースに適切な RBAC を付与。外部環境では使えない |
| Service Principal (秘密/証明書) | 多くの CI/CD で汎用利用 | 挙動が安定、権限を最小化しやすい | シークレット管理/ローテ必須。期限切れに注意 |
| OIDC フェデレーション | GitHub Actions / Azure DevOps 等の最新CI | シークレットレス、セキュアかつ運用負荷小 | Provider バージョンとオプションが依存。事前に SP 側で Federated Credential を作成 |
代表的な認証設定例
# 1) Azure CLI を利用
provider "azurerm" {
features {}
use_azure_cli = true
}
# 2) Managed Identity(システム割り当て)
provider "azurerm" {
features {}
use_msi = true
subscription_id = var.subscription_id
tenant_id = var.tenant_id
}
# 3) Service Principal(環境変数で供給)
# export ARM_CLIENT_ID=... ARM_CLIENT_SECRET=... ARM_TENANT_ID=... ARM_SUBSCRIPTION_ID=...
provider "azurerm" {
features {}
}
# 4) OIDC(フェデレーション)
# バージョンによりオプション名が異なるため公式を要確認
# 例: use_oidc = true, oidc_token_file_path = var.oidc_token_file_path など
複数サブスクリプションにまたがるデプロイでは、provider の alias を使います。各 alias に subscription_id/tenant_id/認証方式を分離し、リソース単位で provider を明示するのが安全です。
同一実行で Azure CLI のアカウントコンテキストを頻繁に切り替えるのは不安定化の原因になります。CI では alias を定義し、plan/apply 時に明示的に使い分けましょう。
alias によるマルチサブスクリプション配置
provider "azurerm" {
alias = "hub"
features {}
subscription_id = var.hub_subscription_id
tenant_id = var.tenant_id
use_azure_cli = true
}
provider "azurerm" {
alias = "spoke"
features {}
subscription_id = var.spoke_subscription_id
tenant_id = var.tenant_id
use_azure_cli = true
}
resource "azurerm_resource_group" "rg_hub" {
name = "rg-hub-shared"
location = var.location
provider = azurerm.hub
}
resource "azurerm_resource_group" "rg_spoke" {
name = "rg-spoke-app"
location = var.location
provider = azurerm.spoke
}
リージョンは variables で一元管理し、命名は locals で規則化するのが定石です。これにより review しやすく、試験でも再現性・可読性の観点が評価されます。
azurerm は provider レベルの default_tags をサポートします。default_tags とリソース個別の tags はマージされ、キーが重複した場合はリソース側の値が優先されます。タグの横展開やガバナンスに有効です。
features.resource_group.prevent_deletion_if_contains_resources を使うと、リソースを抱えた RG の誤削除を防げます(デフォルト値はバージョンで異なる可能性があるため、意図を持って明示設定を推奨)。
location/命名/デフォルトタグのパターン
variable "location" {
type = string
default = "japaneast"
}
variable "env" { type = string }
variable "owner" { type = string }
locals {
name_prefix = lower(join("-", [var.env, "app01"]))
rg_name = "rg-${local.name_prefix}"
}
provider "azurerm" {
features {
resource_group {
prevent_deletion_if_contains_resources = true
}
}
default_tags {
tags = {
environment = var.env
owner = var.owner
}
}
}
resource "azurerm_resource_group" "main" {
name = local.rg_name
location = var.location
tags = {
# 同じキーがある場合はこの値が優先される
owner = var.owner
}
}
Resource Provider の自動登録が抑止されていると、特定のリソース作成で 404/AuthorizationFailed が発生します。この場合は skip_provider_registration を true にしても根本解決にならないことがあるため、運用設計として事前登録 or 自動登録許可のいずれかを明確化します。
Service Principal 利用時は期限切れ・権限不足が典型。Contributor では足りないケース(Key Vault のデータプレーン等)に注意。Azure CLI 認証は現在の az account set のサブスクリプションに依存するため、CI では非推奨です。
障害切り分けは Terraform のデバッグログと ARM のエラーメッセージを突き合わせます。まず plan で再現し、再試行時は -parallelism の調整で一時的なスロットリングを回避することもできます。
デバッグのための環境変数とログ
# Service Principal(シークレット)の例
export ARM_CLIENT_ID=00000000-0000-0000-0000-000000000000
export ARM_CLIENT_SECRET=********
export ARM_TENANT_ID=11111111-1111-1111-1111-111111111111
export ARM_SUBSCRIPTION_ID=22222222-2222-2222-2222-222222222222
# 詳細ログ(必要な時だけ)
export TF_LOG=TRACE
export TF_LOG_PATH=./terraform.trace.log
# Azure CLI の現在サブスクリプションを明示
az account set --subscription $ARM_SUBSCRIPTION_ID
バックエンドの azurerm は Provider とは別物で、terraform ブロックの backend で宣言します。State は Azure Storage の Blob に保存され、ロックは Blob のリースで実現されます。
CI では Backend 用のリソースグループ/ストレージアカウント/コンテナを事前に IaC で用意し、アクセスは Azure AD(推奨)か SAS で与えます。バケット相当のコンテナには バージョニング/ソフトデリート を有効化すると復旧が容易です。
azurerm Backend の例(provider ではなく terraform ブロックに記述)
terraform {
backend "azurerm" {
resource_group_name = "rg-tfstate"
storage_account_name = "sttfstate1234"
container_name = "tfstate"
key = "${terraform.workspace}.tfstate"
}
}
# 認証は実行環境に依存(例:az login、Managed Identity、ARM_* 環境変数)
Associate
問題 1
組織では 2 つの Azure サブスクリプション(hub と spoke)に異なる RBAC で同時にデプロイします。最小限のリスクでリソースごとに接続先を切り替える推奨アプローチはどれか?
正解: A
複数サブへの同時デプロイは provider alias による分離が最も安全で再現性が高い。resource 側で provider を明示すれば、実行時コンテキストや CLI に依存せずに確実に接続先を切り替えられる。resource で subscription_id を直接差し替える方法は一般的ではなく、CLI の手動切替は不安定要因。tenant のみ差し替える手法も要件を満たさない。
features ブロックはなぜ必須ですか?空でも必要ですか?
azurerm は Provider 初期化時に内部機能の有効化を features ブロックで表現します。内容が空でも仕様上必須で、未指定だと初期化でエラーになります。
default_tags とリソース個別 tags の競合はどちらが優先されますか?
同一キーがある場合はリソース側の tags が優先されます。組織共通の既定値は default_tags に置き、例外はリソース側で上書きするのが実務的です。
azurerm Backend の設定は provider に書きますか?
いいえ。Backend は terraform ブロックの backend で定義し、provider とは独立しています。State の保存先・ロック方法の指定であり、API 呼び出しを担う provider とは役割が異なります。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける
Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...
Terraform Authoring & Ops Pro: 上位資格の範囲と対策
上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...
Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす
Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...
Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義
Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...
Terraform Data Source徹底理解:既存リソースの参照で壊さず足す
Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...