Terraform:如何提供使用一个资源块创建的资源的属性?

时间:2019-11-29 00:12:42

标签: amazon-web-services terraform terraform-provider-aws

如何为subnet_ids属性提供多个值,如下所示?

resource "aws_subnet" "db_subnet" {
  for_each = var.db_subnet_cidrs

  vpc_id            = aws_vpc.default.id
  availability_zone = each.key
  cidr_block        = each.value
}

resource "aws_db_subnet_group" "default" {
  name       = "default-subnet-group"
  subnet_ids = ["aws_subnet.db_subnet.*.id"]

  tags = {
    Name = "database-subnet-group"
  }
}

正在正确创建子网,但是没有正确创建子网组。当我apply时,出现以下错误:

Error: Error creating DB Subnet Group: InvalidParameterValue: Some input subnets in :[aws_subnet.db_subnet.*.id] are invalid.
        status code: 400, request id: 0b68518f-e229-4f57-bf68-4ba46c1c75c2

2 个答案:

答案 0 :(得分:1)

您当前的代码正在尝试将DB子网组的子网ID设置为等于字符串aws_subnet.db_subnet.*.id的字符串,这显然不是有效的子网标识符。通常,Terraform会警告您它与子网ID格式不匹配(例如subnet-1234abcd),但看起来像aws_db_subnet_group resource doesn't currently validate this

第二,您尝试使用for_each循环资源的输出的方法也将不起作用。如果您使用count遍历正在创建的子网,则将具有以下内容:

resource "aws_subnet" "db_subnet" {
  count = length(var.db_subnet_cidrs)

  vpc_id            = aws_vpc.default.id
  availability_zone = count.index
  cidr_block        = var.db_subnet_cidrs[count.index]
}

resource "aws_db_subnet_group" "default" {
  name       = "default-subnet-group"
  subnet_ids = aws_subnet.db_subnet.*.id

  tags = {
    Name = "database-subnet-group"
  }
}

count循环资源具有splat operator输出,该输出已经具有所有输出作为列表,因此您可以将其直接传递到aws_db_subnet_group资源。

但是,如果您想使用for_each遍历事物,那么当前需要使用略有不同的语法来获取循环资源中的值:

resource "aws_subnet" "db_subnet" {
  for_each = var.db_subnet_cidrs

  vpc_id            = aws_vpc.default.id
  availability_zone = each.key
  cidr_block        = each.value
}

resource "aws_db_subnet_group" "default" {
  name       = "default-subnet-group"
  subnet_ids = values(aws_subnet.db_subnet)[*].id

  tags = {
    Name = "database-subnet-group"
  }
}

这将提取循环的aws_subnet资源的值,获取所有值,然后仅使用资源中的id属性。再次使用splat运算符创建一个列表,您可以将其直接传递到subnet_ids资源中的aws_db_subnet参数。

答案 1 :(得分:0)

我也遇到了同样的错误。我的架构设计包括一个带有 2 个子网的 VPC。这 2 个子网位于同一个可用区<svg width="250" height="250"> <g class="shape_text"> <circle cx="30" cy="45" r="25" /> <text class="text" x=0 y=100>That's a circle</text> </g> </svg>。 为了克服上述错误,我只是更改了 AZ 和子网[us-east-1a] 和 BOOM! 成功了