Terraform

Terraform azurerm Provider 実務&Associate対策:Azureでのよくある設定集

2026-04-19
NicheeLab編集部

azurerm Provider は Azure Resource Manager (ARM) API を呼び出す Terraform の拡張機能です。認証方式、サブスクリプションの切り替え、タグやリージョンの既定化など、現場でつまずきやすい箇所を試験観点と併せて解説します。

本稿は安定的な公式挙動を前提に書いています。バージョン依存の機能は注意書きを添えており、検証環境での確認を推奨します。

azurerm Provider の全体像とバージョン管理

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 を使用します。

  • Associate 試験では required_providers によるバージョンピン留めと features {} の必須性が頻出。
  • skip_provider_registration は企業ポリシーや事前登録が済んでいる環境でのみ使用。
  • プロキシ越しやクラウドシェル等の環境差で動作が変わるため、開発者ローカルと CI の両方で init/plan を検証する。

Terraform と azurerm Provider の関係と認証の流れ(概念図)

terraform applyazurerm ProviderAzure CLI / Managed Identity / Service PrincipalAzure Resource Manager (ARM) API

最小構成(バージョン固定と 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
}

認証方式の比較と選び方(CLI / マネージドID / サービスプリンシパル / OIDC)

azurerm では複数の認証方式を選べます。ローカル開発は Azure CLI、Azure 上のランナーはマネージド ID、CI/CD はシークレット不要のフェデレーション(OIDC)やサービスプリンシパルなど、実行環境に合わせて使い分けます。

環境変数 (ARM_CLIENT_ID 等) を使うと provider ブロックの機密情報埋め込みを避けられます。OIDC によるフェデレーションはバージョン依存の設定が含まれるため、利用時は該当バージョンの公式ドキュメントでオプション名を確認してください。

  • ローカル最小手順は az login 後に use_azure_cli = true。
  • マネージド ID はサブスクリプションやリソースへの RBAC 付与を忘れない。
  • CI ではシークレットレス運用(OIDC)が推奨傾向。非対応なら SP のクライアントシークレット/証明書を環境変数で渡す。
認証方式代表的な使い方強み注意点
Azure CLI開発者ローカルや Cloud Shell設定が最小、即時試せるCI では原則非推奨。実行ユーザーのコンテキストに依存
Managed IdentityAzure 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 など

サブスクリプション/テナントの切り替えと alias の使い分け

複数サブスクリプションにまたがるデプロイでは、provider の alias を使います。各 alias に subscription_id/tenant_id/認証方式を分離し、リソース単位で provider を明示するのが安全です。

同一実行で Azure CLI のアカウントコンテキストを頻繁に切り替えるのは不安定化の原因になります。CI では alias を定義し、plan/apply 時に明示的に使い分けましょう。

  • resource と data は provider = azurerm.alias で接続先を固定する。
  • 同名リソースを複数サブに作る場合は key や名前規則で衝突を避ける。
  • workspace で環境は分けつつ、subscription は alias で切り替えると管理しやすい。

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 の誤削除を防げます(デフォルト値はバージョンで異なる可能性があるため、意図を持って明示設定を推奨)。

  • ストレージアカウント名は小文字・英数字のみ、長さ制限あり。命名はリソース種別ごとにローカルで分岐させる。
  • タグは environment, owner, cost-center などを最小セットとしてプロジェクト共通化。
  • location は可能な限り単一変数から参照。マルチリージョン時は可読な map を利用。

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 の調整で一時的なスロットリングを回避することもできます。

  • az account show / az account list --refresh で CLI の現在コンテキストを確認。
  • 環境変数 ARM_CLIENT_ID/SECRET/TENANT_ID/SUBSCRIPTION_ID を明示して CLI 依存を排除。
  • 長時間実行の CI はトークン期限切れを起点に失敗することがあるため、ステップを分割。

デバッグのための環境変数とログ

# 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

リモートステート(Azure Storage backend)とロック

バックエンドの azurerm は Provider とは別物で、terraform ブロックの backend で宣言します。State は Azure Storage の Blob に保存され、ロックは Blob のリースで実現されます。

CI では Backend 用のリソースグループ/ストレージアカウント/コンテナを事前に IaC で用意し、アクセスは Azure AD(推奨)か SAS で与えます。バケット相当のコンテナには バージョニング/ソフトデリート を有効化すると復旧が容易です。

  • State 用ストレージは運用と権限を分離し、汎用の prod/tfstate 等の命名に統一する。
  • key は workspace ごとに分けると衝突を防げる。
  • 認証は Azure CLI/Managed Identity/Service Principal のいずれでも可。

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 で同時にデプロイします。最小限のリスクでリソースごとに接続先を切り替える推奨アプローチはどれか?

  1. provider の alias を用意し、resource 毎に provider = azurerm.<alias> を明示する
  2. terraform.workspace ごとに異なる subscription_id を resource に直接指定する
  3. az login で都度サブスクリプションを切り替えてから同一 provider を使う
  4. 変数で tenant_id だけ差し替え、subscription_id は共通のままにする

正解: 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 とは役割が異なります。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Terraform

Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける

Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...

Terraform

Terraform Authoring & Ops Pro: 上位資格の範囲と対策

上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...

Terraform

Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす

Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...

Terraform

Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義

Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...

Terraform

Terraform Data Source徹底理解:既存リソースの参照で壊さず足す

Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...

Terraformの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.