

### 前提・実現したいこと

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

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

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

[code]

    $ 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.
    
[/code]

[code]

    ■ディレクトリ構成
    
    └─VPC
        ├─modules
        │  └─vpc
        │          output.tf
        │          vpc-main.tf
        │          vpc-variavles.tf
        │
        └─resource
            │  backend.tf
            │  provider.tf
            │  resource-main.tf
            │  resource-variables.tf
            │  terraform.tfstate
            │  terraform.tfstate.backup
            └─prd
                    resource-prd-vars.tfvars
    
[/code]

■modules/vpc/vpc-main.tf

[code]

    # ---------------------------------------------
    # VPC
    # ---------------------------------------------
    resource "aws_vpc" "vpc" {
      for_each   = var.vpc
      cidr_block = lookup(each.value, "cidr_block", null)
      tags       = lookup(each.value, "tags", null)
    }
    
    # ---------------------------------------------
    # Subnet
    # ---------------------------------------------
    resource "aws_subnet" "subnet" {
      for_each                = var.subnet
      vpc_id                  = aws_vpc.vpc[each.key].id
      availability_zone       = lookup(each.value, "availability_zone", null)
      cidr_block              = lookup(each.value, "cidr_block", null)
      map_public_ip_on_launch = lookup(each.value, "map_public_ip_on_launch", null)
      tags                    = lookup(each.value, "tags", null)
    }
    
[/code]

■modules/vpc/vpc-variables.tf

[code]

    # ---------------------------------------------
    # VPC作成時に利用する変数
    # ---------------------------------------------
    
    variable "vpc" {
      default = {}
    }
    
    # ---------------------------------------------
    # subnet作成時に利用する変数
    # ---------------------------------------------
    
    variable "subnet" {
      default = {}
    }
    
[/code]

■resource/resource-main.tf

[code]

    # ---------------------------------------------
    # 各種モジュールの呼び出し
    # ---------------------------------------------
    module "create_vpc_module" {
      source = "../modules/vpc"
      vpc    = var.vpc
      subnet = var.subnet
    }
    
[/code]

■resource/resource-variables.tf

[code]

    # ---------------------------------------------
    # 変数の呼び出し
    # ---------------------------------------------
    variable "vpc" {}
    
    variable "subnet" {}
    
[/code]

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

[code]

    # vpc tfvars
    # 実際の変数値を宣言する内容
    
    # ---------------------------------------------
    # VPC
    # ---------------------------------------------
    
    vpc = {
      vpc01 = {
        description = "テスト用vpc"
        cidr_block  = "10.0.0.0/16"
        tags = {
          "Name" : "prd-vpc",
          "Env" : "prd"
        }
      }
    }
    
    subnet = {
      subnet01 = {
        availability_zone       = "ap-northeast-1a"
        cidr_block              = "10.0.0.0/20"
        map_public_ip_on_launch = "true"
        tags = {
          "Name" : "subnet",
          "Env" : "prd"
        }
      }
    }
    
[/code]

### 試したこと

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

### 補足情報（FW/ツールのバージョンなど）

terraform_version": "0.14.6"


CC BY-SA 4.0
2021-06-05T13:21:36.987
77356
2021-09-19T13:09:26.123
46690
question
aws terraform
vpc_idをサブネットリソースに渡す際のTerraformでの記載方法について

[code]

    resource "aws_subnet" "subnet" {
      for_each                = var.subnet
      vpc_id                  = aws_vpc.vpc[each.key].id
    
[/code]

変数`subnet`のkeyは`subnet01`なので、`each.key`は`subnet01`を返します。

そのため、`vpc_id = aws_vpc.vpc["subnet01"].id`となりますが、正しくは`vpc_id =
aws_vpc.vpc["vpc01"].id`です。

質問者さんの設計意図に沿っているかわかりませんが、.tfvarsを修正して、変数`vpc`と`subnet`のkeyを一致させれば、とりあえず動くはずです（動作確認はしていません）。

[code]

    vpc = {
      01 = {
      ...
      }
    }
    
    subnet = {
      01 = {
      ...
      }
    }
    
[/code]


CC BY-SA 4.0
2021-09-19T13:09:26.123
82583
2021-09-19T13:09:26.123
4982
77356
answer