如何为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
答案 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!
成功了