🔎

terraform で細かすぎて伝わらない小ネタ data source azurerm_subscriptions

2024/08/27に公開

tl;dr

  • 最近お仕事で Azure を触っている(AWSがメインだったのでAzureなんもわからん)
  • Azure CLI(az) と Terraform と同時進行で勉強中
  • Terraform の data source の使い方がいまいちなコードを見かけたので手直し

"s" のついたデータソース

  • 単一のデータソース

    • 実リソースから単一のリソースデータを取得する(description)
    • 対象のリソースが見つからない場合エラーになる(エラーにならないやつあるのかしら?)
  • 複数のデータソース

    • 複数のリソースデータがリスト形式で返る(list/search。違うやつ見たことないけどリスト以外で返るやつあるのかしら?)
    • 対象のデータが見つからなくても(データソース自体はエラーにならないものが多い。空のリストが返るはず)
  • 全部処理する場合には問題ないが、1つだけ使うなら単一のデータソースを使うのが望ましい

小技

  • 配列に入っていると目的のデータが何番目にあるのかわからない
  • (そして"s"を使って単一のデータを引っ張って[0]でアクセスしているコードを見かけた)
  • どうせまとめて取得するなら参照しやすくする
main.tf
data "azurerm_subscriptions" "available" {}

output "available_subscriptions" {
  value = data.azurerm_subscriptions.available.subscriptions
}

locals {
  subscriptions = { for i in data.azurerm_subscriptions.available.subscriptions : i.display_name => i }
}

output "my" {
  # mysubscription をサブスクリプションの displayName にすることができる
  # try() はエラーにならないようにしただけのおまけ
  value = try(local.subscriptions.mysubscription, null)
}

まとめ?

  • データソースを使用して既存リソースを参照する際には、単一で使う場合と複数で使う場合をわけて使うデータソースを選ぶ
  • 単一データソースをたくさん書くとAPIコールの数が増えるので注意する
  • 複数データソースの結果を参照しやすいmapに変えるコードを提示したが、そもそもこれを必要とする作りにしないほうがいい
  • 個人的にこれで実リソースのレポートを作成するために書いた
  • map に変換しておけばkeyでソートさせることができる
terraform-jp

Discussion