Terraform、Docsに沿って書いたのに動かない?
2019-06-25
azblob://2022/11/11/eyecatch/2019-06-25-as-documented-terraform-defs-fail-000.jpg

TerraformでAzureリソースを作る時にハマった事例をご紹介します。

VMSS(仮想マシン スケールセット)の作成時のエラー

VMSSの作成のため、下記のドキュメントを参考にTerraform定義を作成しました。

https://www.terraform.io/docs/providers/azurerm/r/virtual_machine_scale_set.html

記事執筆時点の最新のterraform.exe(0.12系)を使用してterraform planを実行すると、エラーが発生します。

Error: Reference to "count" in non-counted context

  on test.tf line 146, in resource "azurerm_virtual_machine_scale_set" "test":
 146:       load_balancer_inbound_nat_rules_ids    = ["${element(azurerm_lb_nat_pool.lbnatpool.*.id, count.index)}"]

The "count" object can be used only in "resource" and "data" blocks, and only
when the "count" argument is set.

え…なんで公式ドキュメント通り書いてるのにエラー?
elementの中でcountが参照できないみたいです。

こちら、Terraformのバージョンアップ(0.11 ⇒ 0.12)の際に仕様変更があったようです。
古いバージョンのTerraformを使用するか、別の記述に変更する必要があります。
今回はとりあえず、Terraformのバージョンを0.11系に下げて対処しました。

AGW(Application Gateway)のSSLPolicy設定でエラー

Application GatewayをTerraformで作る時、設定が多いので泣きそうになります。
そんな中でどうしても下記のエラーが出て困りました。

Error: module.application_gateway.azurerm_application_gateway.network: : invalid or unknown key: ssl_policy

要は「ssl_policyって、何?」と言われてます。

調べてみた結果、ssl_policyの設定はazurermプロバイダーのバージョン1.29.0以降で使えるようでした。

具体的に書くと、providerの設定部分が下記のようになっていたので、

provider "azurerm" {
  version         = "=1.28.0"
 }

下記のように変更すれば解消しました。

provider "azurerm" {
  version         = "=1.29.0"
 }

まとめ

Terraformでエラーが出た時、基本的にはtfファイル等の記述ミスを疑うべきです。
しかしエラーの内容によっては、使用しているterraform.exeやproviderのバージョンを確認してみるのが良さそうです。