Terraform 地形元组到地图的转换
我是Terraform的新手,我正在使用此功能重新使用相同的子网列表来启动比我拥有的子网更多的实例。(只需循环)如果我提供自己的子网地图,效果会很好,但远程状态下的数据是元组,我得到以下错误:Terraform 地形元组到地图的转换,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我是Terraform的新手,我正在使用此功能重新使用相同的子网列表来启动比我拥有的子网更多的实例。(只需循环)如果我提供自己的子网地图,效果会很好,但远程状态下的数据是元组,我得到以下错误: 参数“inputMap”的值无效:lookup()需要一个映射作为第一个 论点data.terraform\u remote\u state.vpc.outputs.private\u子网是包含4个元素的元组 我还尝试了tomap(功能,但在以下情况下失败: 无效的“v”参数值:无法将元组转换为任何单个参
参数“inputMap”的值无效:lookup()需要一个映射作为第一个
论点data.terraform\u remote\u state.vpc.outputs.private\u子网是包含4个元素的元组
我还尝试了tomap(功能,但在以下情况下失败:
无效的“v”参数值:无法将元组转换为任何单个参数的映射
类型。
这是我的密码:
count = var.instance_count
ami = var.ami
instance_type = "t2.medium"
subnet_id = lookup(data.terraform_remote_state.vpc.outputs.private_subnets, count.index%length(data.terraform_remote_state.vpc.outputs.private_subnets))
vpc_security_group_ids = ["${data.terraform_remote_state.foo_sg.outputs.foo_sg_id}"]
key_name = var.key_name
iam_instance_profile = var.iam_instance_profile
user_data = <<-EOF
#!/bin/bash
hostnamectl set-hostname --static "${var.app_name}-${count.index + 1}.${data.terraform_remote_state.vpc.outputs.private_zone_domain_name}"
echo "127.0.0.1 localhost.localdomain localhost4 localhost4.localdomain4 ${var.app_name}-${count.index + 1}.${data.terraform_remote_state.vpc.outputs.private_zone_domain_name} localhost" > hosts
echo "::1 localhost localhost.localdomain localhost6 localhost6.localdomain6" >> hosts
EOF
tags = {
Name = "${var.app_name}-${count.index +1}.${data.terraform_remote_state.vpc.outputs.private_zone_domain_name}"
}
count=var.instance\u count
ami=var.ami
实例_type=“t2.中等”
subnet_id=查找(data.terraform_remote_state.vpc.outputs.private_子网,count.index%长度(data.terraform_remote_state.vpc.outputs.private_子网))
vpc_security_group_id=[“${data.terraform_remote_state.foo_sg.outputs.foo_sg_id}]
key\u name=var.key\u name
iam_实例_配置文件=var.iam_实例_配置文件
用户\数据=>主机
EOF
标签={
Name=“${var.app\u Name}-${count.index+1}.${data.terraform\u remote\u state.vpc.outputs.private\u zone\u domain\u Name}”
}
就像我说的,我的目标是在我拥有的远程状态下重复使用4个子网,因此如果我想要6个实例,它将通过我拥有的4个子网进行循环,第5和第6个实例将位于元组中的子网1和2。如果您有任何建议,我们将不胜感激!您有3个表单来进行循环 1º使用…示例:
resource "aws_security_group" "ecc_default" {
count = length(var.clusters)
vpc_id = var.vpc_id
name = "${terraform.workspace}.ecc-${var.clusters[count.index].engine}.sg"
description = "${terraform.workspace}.ecc-${var.clusters[count.index].engine}.sg"
ingress {
from_port = var.clusters[count.index].port
to_port = var.clusters[count.index].port
protocol = "tcp"
cidr_blocks = [var.vpc_cidr]
}
dynamic "ingress" {
iterator = item
for_each = var.enable_vpn ? var.vpn_cidr : []
content {
from_port = var.clusters[count.index].port
to_port = var.clusters[count.index].port
protocol = "tcp"
cidr_blocks = [item.value["cidr"]]
description = item.value["description"]
}
}
...
...
}
resource "aws_security_group_rule" "ecc_internal" {
count = length(var.ingress_security_groups) > 0 ? length(var.ingress_security_groups) * length(var.clusters) : 0
security_group_id = aws_security_group.ecc_default[count.index % length(var.clusters)].id
type = "ingress"
from_port = var.clusters[count.index % length(var.clusters)].port
to_port = var.clusters[count.index % length(var.clusters)].port
protocol = "tcp"
source_security_group_id = var.ingress_security_groups[floor(count.index / length(var.clusters))]
}
2º使用…()
3º使用算术迭代…()示例:
并且,对于转换错误:尝试使用带有伪替换的。如下所示:
resource "aws_lb_listener_certificate" "default" {
count = (coalescelist(data.aws_alb_listener.https, [{ certificate_arn = "" }])[0].certificate_arn != var.certificate_arn) ? local.enabled : 0
listener_arn = coalescelist(data.aws_alb_listener.https, [{ arn = "" }])[count.index].arn
certificate_arn = var.certificate_arn
}
元组([N1,N2,N3]
)到映射({N1=“”,N2=“”}
)的转换,确实是不允许的。但是,您可以使用一个伪替换来执行此作业。需要一个对象作为参数。需要多个参数才能生成结果。请尝试操作列表,在地图中转换,使用类似的另一种形式(如果您只想转换,而不是解决问题):
我向您推荐:如果数据存储在您的远程状态,那么您可以控制其类型,并可以根据需要预先定义它。
environment_vars = jsonencode([
for key in sort(keys(data.external.environment_vars.result)) : {
name = key
value = lookup(data.external.environment_vars.result, key)
}])