【Terraform】countで作成したリソースの参照はインデックスを指定しないとダメみたい

エラー

 

Terraformでcountを使用してValidateしたらエラーになりました。

文法的なエラーになったので、原因調査⇒修正の過程をまとめていきます

 

結論

 

タイトル通りですが、

Terraformでcountを使用して作成したリソースを参照するにはインデックスを指定しないとダメ

みたいです

 

countとは?

 

countとは数値型で、指定した数だけリソースを作成します。

 

例えば、↓のようにcountを使用するとEC2を2つ作成します

 

複数同じものを作成するときに便利ですよね~

 

でも、これもうひとつ素晴らしい使い方があります

リソースを作成するかのフラグとしても使えるんです!!

 

例えば↓のように変数を使用して

 

作成しない→count_ec2 は0

作成する →count_ec2 は作成したい個数

とすることで簡単に作成するしないを制御することができます

 

やりたいこと

 

 

このインフラを構築するTerraformのコードを↓の要件に沿って作成

  • 2つのAZで同じようなSubnetなどを作成するのでmodule化する
  • ただし、片方のAZのみNAT Gatewayを作成する

 

これを満たすようにmoduleを作ろうと思ったら、countを使ってみるかとなった

 

作ったmodule

ディレクトリ構成

 

./modules/subnet
├── README.md
├── main.tf
├── outputs.tf
└── variables.tf

 

コード

 

NAT Gatewayに関したところだけ切り出します

 

・main.tf

 

・variables.tf

 

・README.mdとoutputs.tf

本記事の内容に関係ないため省略します

 

エラー内容

 

先ほどのコードでterraform validateをすると、エラーになりました

 

EIPでcountを使用しているため、

aws_nat_gatewayブロック内でEIPを指定する際にインデックスが必要そう。

 

ちゃんと調べてみましょう!

 

原因調査

 

公式ドキュメントのcountのページに答えがありました

 

When count is set, Terraform distinguishes between the block itself and the multiple resource or module instances associated with it. Instances are identified by an index number, starting with 0.

  • <TYPE>.<NAME> or module.<NAME> (for example, aws_instance.server) refers to the resource block.
  • <TYPE>.<NAME>[<INDEX>] or module.<NAME>[<INDEX>] (for example, aws_instance.server[0]aws_instance.server[1], etc.) refers to individual instances.

 

DeepLさんに翻訳してもらいました

countを設定すると、Terraformはブロックそのものと、それに関連する複数のリソースやモジュールのインスタンスを区別する。インスタンスは0から始まるインデックス番号で識別される。

・<TYPE>.<NAME>またはmodule.<NAME>(例えばaws_instance.server)はリソースブロックを指します。
・<TYPE>.<NAME>[<INDEX>]またはmodule.<NAME>[<INDEX>](例えばaws_instance.server[0]、aws_instance.server[1]など)は個々のインスタンスを指します。

 

countを使用して作成したリソースについて、

個々のインスタンス(作成したもの?)を指定するにはインデックスが必要ということ。

 

(「リソースブロックを指します。」はよくわかりません。)

 

修正して再度確認

 

原因わかったので、インデックスを指定します

 

・main.tf

 

修正したらterraform validateに通り、applyも無事終わりました!!

 

最後に

 

countを使用したときにエラーに立ち向かいました。

やはり公式ドキュメントは偉大ですね。

 

参考

 

The count Meta-Argument - Configuration Language | Terraform | HashiCorp Developer
Count helps you efficiently manage nearly identical infrastructure resources without writing a separate block for each one.
Command: validate | Terraform | HashiCorp Developer
The `terraform validate` command is used to validate the syntax of the terraform files.
【Terraform】色々な条件分岐方法メモ - Qiita
概要Terraformにはif文がない。しかし、環境ごとに値を変えたいなど条件分岐的な記述をしたい時がある。Terraformでは、三項演算子と特定のプロパティを組み合わせることによって、条件…

コメント

タイトルとURLをコピーしました