★ 初級

12. データソース集

azurerm / azuread の代表 data ソース。既存リソースの参照ハードコード排除クロス Subscription のメタ情報取得 に使います。

アカウント・サブスクリプション

# 現在の認証主体(service principal / user)情報を取得
data "azurerm_client_config" "current" {}
# 現在のサブスクリプション情報を取得
data "azurerm_subscription" "current" {}

# よく使うパターン:local に集約して呼び出し側を短く
locals {
  subscription_id = data.azurerm_subscription.current.subscription_id
  tenant_id       = data.azurerm_client_config.current.tenant_id
  object_id       = data.azurerm_client_config.current.object_id   # 現在の認証主体
}

既存 Resource Group / VNet を引く

# 別の Terraform で作られた既存 RG を参照(Terraform 管理外でもよい)
data "azurerm_resource_group" "shared" {
  name = "rg-shared-network"
}

# 共有 VNet を参照(resource_group_name の指定が必要)
data "azurerm_virtual_network" "hub" {
  name                = "vnet-hub"
  resource_group_name = data.azurerm_resource_group.shared.name
}

# 共有 VNet 配下の Subnet を参照
data "azurerm_subnet" "shared_private" {
  name                 = "snet-shared-app"
  virtual_network_name = data.azurerm_virtual_network.hub.name
  resource_group_name  = data.azurerm_resource_group.shared.name
}

# 使い方:自分のリソースを既存 subnet にぶら下げる
resource "azurerm_network_interface" "myapp" {
  ip_configuration {
    subnet_id = data.azurerm_subnet.shared_private.id
  }
  # ...
}

Key Vault のシークレットを引く

# Key Vault の参照(Vault 名はテナント内で一意)
data "azurerm_key_vault" "shared" {
  name                = "kv-shared-prd-jpe"
  resource_group_name = "rg-shared-security"
}

# Vault 内の特定の Secret を参照
data "azurerm_key_vault_secret" "external_api_key" {
  name         = "external-api-key"
  key_vault_id = data.azurerm_key_vault.shared.id
}

# Container App から:Key Vault 参照を環境変数に展開
resource "azurerm_container_app" "api" {
  # ...
  template {
    container {
      env {
        name        = "API_KEY"
        # secret_name は下の secret ブロックの name と紐付く
        secret_name = "api-key"
      }
    }
  }

  # Container App の secret 定義(Key Vault の値を managed identity 経由で取る)
  secret {
    name                = "api-key"
    identity            = azurerm_user_assigned_identity.app.id   # 取得用 ID
    key_vault_secret_id = data.azurerm_key_vault_secret.external_api_key.id
  }
}

VM 用イメージを引く

# 最新の Ubuntu 24.04 を引く(実は azurerm では publisher/offer 直書きが普通)
# Marketplace のイメージは publisher / offer / sku の 3 階層で識別
data "azurerm_platform_image" "ubuntu" {
  location  = "Japan East"
  publisher = "Canonical"
  offer     = "ubuntu-24_04-lts"
  sku       = "server"
}

# 取得した image を VM の source_image_id に渡す
resource "azurerm_linux_virtual_machine" "web" {
  source_image_id = data.azurerm_platform_image.ubuntu.id
  # または source_image_reference { publisher offer sku version = "latest" }
}

# Shared Image Gallery にカスタム image がある場合
# 社内ベースイメージを Packer 等で配布する運用ではこちら
data "azurerm_shared_image_version" "internal" {
  name                = "latest"        # "1.0.0" などのバージョン指定も可
  image_name          = "myapp-base"
  gallery_name        = "internal_gallery"
  resource_group_name = "rg-shared-images"
}

Entra ID オブジェクト

azuread プロバイダで Entra ID のユーザー・グループ・アプリを参照できます。

# azuread プロバイダ(Entra ID 用)の宣言
# azurerm(Azure リソース)とは別プロバイダなので required_providers に追加
terraform {
  required_providers {
    azuread = {
      source  = "hashicorp/azuread"
      version = "~> 3.0"
    }
  }
}

provider "azuread" {}

# ユーザーを UPN で引く
data "azuread_user" "alice" {
  user_principal_name = "alice@example.com"
}

# グループを表示名で引く
data "azuread_group" "admins" {
  display_name = "myapp-admins"
}

# 使い方: RBAC ロール付与
# scope(範囲)に role を付与(Subscription 全体に対して Contributor を許可)
resource "azurerm_role_assignment" "admins_contributor" {
  scope                = data.azurerm_subscription.current.id
  role_definition_name = "Contributor"        # 組み込みロール
  principal_id         = data.azuread_group.admins.object_id
}

ハードコード排除のコツ

ハードコード置き換え先
"11111111-..."(subscription ID)data.azurerm_subscription.current.subscription_id
"22222222-..."(tenant ID)data.azurerm_client_config.current.tenant_id
"Japan East" を毎度書くvar or data.azurerm_resource_group.x.location
"vnet-shared" IDdata.azurerm_virtual_network
"db_password = ..."data.azurerm_key_vault_secret
Azure 編はここまで お疲れ様でした。これで HCL × AWS × GitHub × Azure が揃いました。次はクラウド比較として GCP セクション も学べます。