bha*_*chi 5 terraform terraform-provider-aws
使用 terraform,我尝试使用 count.index 将计数包含在我的资源标签中,但出现此错误:
\n\n\n错误:资源“aws_subnet”“prod_sn”中 ..\\modules\\sn\\ressources.tf 第 16 行上的属性值类型\n\xe2\x94\x82\n\xe2\x94\x82 不正确:\n \xe2\x94\x82 16: 标签 = var.sn_tags[count.index]\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2 \x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\xe2\x94\x82 \xe2\x94\x82 count.index 是一个数字,已知仅在 apply\n\xe2\x94\x82 \xe2\x94\x82 var.sn_tags 是字符串列表,仅在 apply\n\xe2\x94\x82\n\xe2\x94\x82 后才知道 属性值不合适“tags”:所需字符串的映射。
\n
变量.tf
\nvariable "sn_tags" {\n type = list (string)\n default = ["aa", "bb"]\n}\nRun Code Online (Sandbox Code Playgroud)\n资源.tf
\nresource "aws_subnet" "prod_sn" {\n count = length(var.sn_cidr)\n vpc_id = var.vpc_id\n cidr_block = var.sn_cidr[count.index]\n availability_zone = data.aws_availability_zones.azs.names[count.index]\n tags = var.sn_tags[count.index] \n}\nRun Code Online (Sandbox Code Playgroud)\n主.tf
\n# Create Public Subnet on availability_zone "3a"\nmodule "publicSn-a" {\n source = "../modules/sn"\n vpc_id = module.vpc.vpcId \n sn_cidr = ["10.0.1.0/24", "10.0.2.0/24"]\n sn_tags = ["prodPublicA","prodPublicB"]\n \n}\nRun Code Online (Sandbox Code Playgroud)\n
您的问题是每次循环迭代都尝试将string类型传递给tags参数。如果您将其分解为没有计数的单个资源(现在使用第一个元素),那么您当前的代码基本上是这样的:
resource "aws_subnet" "prod_sn" {
vpc_id = var.vpc_id
cidr_block = "10.0.1.0./24"
availability_zone = "eu-west-1a" # Note may not be this but the data source and the index will at least resolve to a single string AZ
tags = "prodPublicA"
}
Run Code Online (Sandbox Code Playgroud)
如果我们查看资源的文档,aws_subnet我们可以看到该tags参数需要 a ,而不是错误所暗示的mapa 。string
您可以通过将list(string)变量更改为 a来解决此问题list(map),因此您可以使用类似以下内容:
variable "sn_tags" {
type = list(map)
}
Run Code Online (Sandbox Code Playgroud)
和
# Create Public Subnet on availability_zone "3a"
module "publicSn-a" {
source = "../modules/sn"
vpc_id = module.vpc.vpcId
sn_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
sn_tags = [
{
name = "prodPublicA"
},
{
name = "prodPublicB"
},
]
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想Name向所有子网添加标签,并且不希望标签具有更大的灵活性,您可以像这样重新设计:
variable "sn_names" {
type = list(string)
}
resource "aws_subnet" "prod_sn" {
count = length(var.sn_cidr)
vpc_id = var.vpc_id
cidr_block = var.sn_cidr[count.index]
availability_zone = data.aws_availability_zones.azs.names[count.index]
tags = {
Name = var.sn_names[count.index]
}
}
Run Code Online (Sandbox Code Playgroud)
并这样称呼它:
# Create Public Subnet on availability_zone "3a"
module "publicSn-a" {
source = "../modules/sn"
vpc_id = module.vpc.vpcId
sn_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
sn_names = ["prodPublicA","prodPublicB"]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5157 次 |
| 最近记录: |