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" ID | data.azurerm_virtual_network |
"db_password = ..." | data.azurerm_key_vault_secret |
Azure 編はここまで
お疲れ様でした。これで HCL × AWS × GitHub × Azure が揃いました。次はクラウド比較として GCP セクション も学べます。