如何使用 Terraform 在 AWS SSM 参数中存储三元素元组?
Posted
技术标签:
【中文标题】如何使用 Terraform 在 AWS SSM 参数中存储三元素元组?【英文标题】:How can I store a three element tuple in AWS SSM parameter with Terraform? 【发布时间】:2021-03-03 02:12:23 【问题描述】:我正在使用 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
类型参数?
【问题讨论】:
【参考方案1】:aws_ssm_parameter
resource 的 value
parameter 必须是字符串类型,而不管指定的 type
是什么。事实上,AWS 总是希望参数是字符串类型,如 the API docs 和 this answer 中提到的那样,StringList
类型本质上是客户端的元数据,希望它是一个包含其他字符串连接在一起的字符串用逗号字符。
要将您的元组类型从 aws_subnet.private.*.id
转换为列表,您可以使用 join
function 加入它,如下所示:
resource "aws_ssm_parameter" "private_subnets_ids"
name = "/$var.client_code-$var.environment/backend/SUBNET_IDS"
type = "StringList"
value = join(",", aws_subnet.private.*.id)
【讨论】:
谢谢你,一如既往 :) 对 anwser 的小修正:value = join(",", aws_subnet.private.*.id)
- 缺少昏迷【参考方案2】:
这里是完整的例子:
resource "aws_ssm_parameter" "SubnetIDs"
name = "SubnetIDs"
description = "SubnetIDs"
type = "StringList"
value = join(", ", aws_subnet.private-subnet.*.id)
【讨论】:
以上是关于如何使用 Terraform 在 AWS SSM 参数中存储三元素元组?的主要内容,如果未能解决你的问题,请参考以下文章
Terraform 和 AWS ECS:类似于 Kubernetes 或 Docker swarm 的配置/秘密
如何在 local-exec 配置程序中从 terraform 继承 aws 凭据
如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施
如何在 terraform 中使用新引入的 aws_cloudfront_cache_policy 资源