質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

Amazon VPC

Amazon VPC(Amazon Virtual Private Cloud) は、仮想的なネットワークです。 独自の IP アドレスレンジの選択、サブネットの作成、ルートテーブル、 ネットワークゲートウェイの設定など、仮想ネットワーク環境を完全にコントロール可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

2559閲覧

vpc_idをサブネットリソースに渡す際のTerraformでの記載方法について

yusuke_san

総合スコア1

Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

Amazon VPC

Amazon VPC(Amazon Virtual Private Cloud) は、仮想的なネットワークです。 独自の IP アドレスレンジの選択、サブネットの作成、ルートテーブル、 ネットワークゲートウェイの設定など、仮想ネットワーク環境を完全にコントロール可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/06/05 13:19

前提・実現したいこと

TerraformにてAWS環境上でVPCとSubnetの簡単な構成を作成したく思っております。
VPCで作成したvpc_idをSubnetに上手く渡せていないように見受けられるので
解決方法についてアドバイスなど提示いただけますと幸いです。

構成については、複数リソースを作成することを想定して
for_eachとlookupを利用して呼び出しを行っております。

発生している問題・エラーメッセージ

$ terraform plan -var-file=prd/resource-prd-vars.tfvars module.create_vpc_module.aws_vpc.vpc["vpc01"]: Refreshing state... [id=vpc-0419f19a0980c568f] Error: Invalid index on ..\modules\vpc\vpc-main.tf line 15, in resource "aws_subnet" "subnet": 15: vpc_id = aws_vpc.vpc[each.key].id |---------------- | aws_vpc.vpc is object with 1 attribute "vpc01" | each.key is "subnet01" The given key does not identify an element in this collection value.

Terraform

1■ディレクトリ構成 2 3└─VPC 4 ├─modules 5 │ └─vpc 6 │ output.tf 7 │ vpc-main.tf 8 │ vpc-variavles.tf 910 └─resource 11 │ backend.tf 12 │ provider.tf 13 │ resource-main.tf 14 │ resource-variables.tf 15 │ terraform.tfstate 16 │ terraform.tfstate.backup 17 └─prd 18 resource-prd-vars.tfvars

■modules/vpc/vpc-main.tf

Terraform

1# --------------------------------------------- 2# VPC 3# --------------------------------------------- 4resource "aws_vpc" "vpc" { 5 for_each = var.vpc 6 cidr_block = lookup(each.value, "cidr_block", null) 7 tags = lookup(each.value, "tags", null) 8} 9 10# --------------------------------------------- 11# Subnet 12# --------------------------------------------- 13resource "aws_subnet" "subnet" { 14 for_each = var.subnet 15 vpc_id = aws_vpc.vpc[each.key].id 16 availability_zone = lookup(each.value, "availability_zone", null) 17 cidr_block = lookup(each.value, "cidr_block", null) 18 map_public_ip_on_launch = lookup(each.value, "map_public_ip_on_launch", null) 19 tags = lookup(each.value, "tags", null) 20}

■modules/vpc/vpc-variables.tf

Terraform

1# --------------------------------------------- 2# VPC作成時に利用する変数 3# --------------------------------------------- 4 5variable "vpc" { 6 default = {} 7} 8 9# --------------------------------------------- 10# subnet作成時に利用する変数 11# --------------------------------------------- 12 13variable "subnet" { 14 default = {} 15}

■resource/resource-main.tf

Terraform

1# --------------------------------------------- 2# 各種モジュールの呼び出し 3# --------------------------------------------- 4module "create_vpc_module" { 5 source = "../modules/vpc" 6 vpc = var.vpc 7 subnet = var.subnet 8}

■resource/resource-variables.tf

Terraform

1# --------------------------------------------- 2# 変数の呼び出し 3# --------------------------------------------- 4variable "vpc" {} 5 6variable "subnet" {}

■resource/prd/resource-prd-vars.tfvars

Terraform

1# vpc tfvars 2# 実際の変数値を宣言する内容 3 4# --------------------------------------------- 5# VPC 6# --------------------------------------------- 7 8vpc = { 9 vpc01 = { 10 description = "テスト用vpc" 11 cidr_block = "10.0.0.0/16" 12 tags = { 13 "Name" : "prd-vpc", 14 "Env" : "prd" 15 } 16 } 17} 18 19subnet = { 20 subnet01 = { 21 availability_zone = "ap-northeast-1a" 22 cidr_block = "10.0.0.0/20" 23 map_public_ip_on_launch = "true" 24 tags = { 25 "Name" : "subnet", 26 "Env" : "prd" 27 } 28 } 29}

試したこと

outputを利用しmoduleに値を渡す、data形式で値を渡す、など
やってみましたが、正常に受け取れていないように見受けられます。

補足情報(FW/ツールのバージョンなど)

terraform_version": "0.14.6"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mike2mike4

2022/06/21 09:16

同じ問題で悩んだのですが変数に””を入れることで回避できました。詳しい方に聞くと、vpc_idは予約後として登録されているのではないかとのことです。ご参考まで。。。
guest

回答1

0

ベストアンサー

for_each = var.subnet

vpc_id = aws_vpc.vpc[each.key].id

ここのとこで参照しているeach.keyvar.subnetのものです。
エラーメッセージに出ている通り、呼び出されているときはaws_vpc.vpc[subnet01].idとなっているはずですが、aws_vpc.vpcにはsubnet01というkeyがないのでエラーになっているということでしょう。

そもそもですが現状のこの変数の渡し方だとVPCとサブネットを紐付ける情報が変数側にないので、複数のVPCとサブネットを定義したときに複数のVPCに対して同じCIDRのサブネットを作ろうとしてしまうと思います。
サブネット側にVPCの情報を何かしら定義した上で、変数をネストさせるような感じでflattenでまとめれば実現したいことは一応出来なくはないみたいです。
Iterate over nested data with for / for_each at resource level

ただ、Terraformは0.13以降でmoduleのfor_eachができるようになったので、個人的にはモジュール自体には1つのVPCを作成する(※)機能を定義しておいて、module呼び出しのほうでループさせるべきかなと思います。
※サブネット等々はモジュール内部でループして複数作成することになるかとは思います。

投稿2021/06/06 21:29

yu_1985

総合スコア7588

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問