首页 > 解决方案 > 如何使用 Terraform 在 AWS SSM 参数中存储三元素元组?

问题描述

我正在使用 Terraform 创建私有子网:

resource "aws_subnet" "private" {
  count = length(data.aws_availability_zones.available.names)

  vpc_id                  = aws_vpc.main_vpc.id
  cidr_block              = cidrsubnet(var.vpc_cidr, 8, count.index + 10)
  availability_zone       = element(data.aws_availability_zones.available.names, count.index)
  map_public_ip_on_launch = false

  tags = {
    Name = "${var.client_code}-${var.environment}-private-${element(data.aws_availability_zones.available.names, count.index)}"
  }
}

后来我尝试使用以下方法创建 SSM 参数:

resource "aws_ssm_parameter" "private_subnets_ids" {
  name  = "/${var.client_code}-${var.environment}/backend/SUBNET_IDS"
  type  = "StringList"
  value = aws_subnet.private.*.id
}

由于子网资源正在创建三个子网,因此会引发以下错误:

   4:   value = aws_subnet.private.*.id
    |----------------
    | aws_subnet.private is tuple with 3 elements

Inappropriate value for attribute "value": string required.

我应该如何将这三个元素元组传递给StringList类型参数?

标签: amazon-web-servicesterraformterraform-provider-aws

解决方案


无论指定如何,资源value参数都必须是字符串类型。事实上,AWS 总是期望参数是一个字符串类型,如API 文档中所见并在这个答案中提到,并且该类型本质上是客户端的元数据,以期望它是一个包含由逗号字符连接在一起的其他字符串的字符串.aws_ssm_parametertypeStringList

要将元组类型从aws_subnet.private.*.id转换为列表,您可以使用如下join函数将其加入:

resource "aws_ssm_parameter" "private_subnets_ids" {
  name  = "/${var.client_code}-${var.environment}/backend/SUBNET_IDS"
  type  = "StringList"
  value = join(",", aws_subnet.private.*.id)
}

推荐阅读