HashiCorp Certified: Terraform Associate 無料問題 6 / 10 ・ 分野4: Terraform configuration
resource "aws_instance" "web" で、3つの名前の map に for_each をかけている。同僚は、splat 式でインスタンスの id をすべて集めたいと考えている。references のページが勧めるのはどれか。
- aws_instance.web.id と書く。for_each のインスタンスは1つのオブジェクトにまとまるため
- keys(aws_instance.web)[*].id と書く。for_each のキーからインスタンスの list を作るため
- values(aws_instance.web)[*].id と書く。インスタンスを list にして使う
- aws_instance.web[*].id と書く。splat はインスタンスの map にも働くため
正解と解説を見る
正解: C
正解の理由
references のページは、リソースに for_each 引数が設定されていると、リソースそのものが1つのオブジェクトではなくインスタンスのオブジェクトの map になり、インスタンスの属性はキーで指定するか、for 式で取り出す必要があると説明している。続けて、splat 式は値のリストに働く必要があるので、for_each で管理するリソースには splat 式をそのままは使えないと指摘している。ただし values() 関数でインスタンスをリストとして取り出し、そのリストに splat 式を使うことはでき、例は values(aws_instance.example)[].id である。
違う選択肢
「aws_instance.web.id と書く。for_each のインスタンスは1つのオブジェクトにまとまるため」… for_each を設定すると、リソースは1つのオブジェクトではなくインスタンスのオブジェクトの map になり、インスタンスの属性はキーで指定するか、for 式で取り出す必要がある。
「keys(aws_instance.web)[].id と書く。for_each のキーからインスタンスの list を作るため」… ページは、values() 関数でインスタンスを list として取り出し、その list を splat 式に使うと書いている。キーの集まりはインスタンスのオブジェクトではなく、id の属性を持たない。
「aws_instance.web[].id と書く。splat はインスタンスの map にも働くため」… ページは、splat 式は値のリストに働く必要があるので、for_each で管理するリソースには splat 式をそのままは使えないと書いている。for_each のリソースは map である。
for_each で map になる
for_each のリソースは、コレクションをキーにした map である。すべてをリストで得るなら [] の前に values() を通す。
HashiCorp Certified: Terraform Associateの演習アプリ(無料10問・全問は購入で)へ