如何在 terraform 中将 concat 与 formatlist 结合起来?
How does one combine concat with formatlist in terraform?
是否可以连接由 formatlist 生成的列表?下面给出错误
At column 1, line 1: output of an HIL expression must be a string, or a single list (argument 6 is TypeList)
:
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Effect": "Allow",
"Resource": ["${concat(
formatlist("arn:aws:s3:::%s", ${var.data_pipeline_s3_buckets}),
formatlist("arn:aws:s3:::%s/*", ${var.data_pipeline_s3_buckets}))}"]
},
您似乎正在尝试在此处构建一个 JSON 数组,在这种情况下,类似以下内容应该可以工作:
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Effect": "Allow",
"Resource": ${jsonencode(
concat(
formatlist("arn:aws:s3:::%s", var.data_pipeline_s3_buckets),
formatlist("arn:aws:s3:::%s/", var.data_pipeline_s3_buckets)
)
)}
}
您的原始示例中有几个部分存在问题:
- 当您已经在
${ ... }
序列中引用变量时,您不能使用第二个 ${
分隔符。此标记指示从字符串上下文到插值表达式上下文的转换,因此当您已经在插值表达式上下文中时它无效。
- 使用模板时,所有插值表达式都必须 return 字符串,因为模板系统没有任何迭代构造。您在此处收到的错误消息有点不准确(它应该告诉您只允许使用一个字符串),但是通过在上面的示例中包含
jsonencode
解决了这个问题,从而将列表变成了 [ 之前的字符串=25=]正在处理它。
该错误消息意味着您提供了一个列表,您应该在其中提供字符串。
$concat 并没有按照您的想法去做;它不会连接列表中的项目以形成字符串,它连接两个列表以形成另一个列表。
您需要改用 $join。
我在 http://thecloudwoman.com/2017/05/how-to-use-a-terraform-list-variable/
有一个有效的例子
是否可以连接由 formatlist 生成的列表?下面给出错误
At column 1, line 1: output of an HIL expression must be a string, or a single list (argument 6 is TypeList)
:
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Effect": "Allow",
"Resource": ["${concat(
formatlist("arn:aws:s3:::%s", ${var.data_pipeline_s3_buckets}),
formatlist("arn:aws:s3:::%s/*", ${var.data_pipeline_s3_buckets}))}"]
},
您似乎正在尝试在此处构建一个 JSON 数组,在这种情况下,类似以下内容应该可以工作:
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Effect": "Allow",
"Resource": ${jsonencode(
concat(
formatlist("arn:aws:s3:::%s", var.data_pipeline_s3_buckets),
formatlist("arn:aws:s3:::%s/", var.data_pipeline_s3_buckets)
)
)}
}
您的原始示例中有几个部分存在问题:
- 当您已经在
${ ... }
序列中引用变量时,您不能使用第二个${
分隔符。此标记指示从字符串上下文到插值表达式上下文的转换,因此当您已经在插值表达式上下文中时它无效。 - 使用模板时,所有插值表达式都必须 return 字符串,因为模板系统没有任何迭代构造。您在此处收到的错误消息有点不准确(它应该告诉您只允许使用一个字符串),但是通过在上面的示例中包含
jsonencode
解决了这个问题,从而将列表变成了 [ 之前的字符串=25=]正在处理它。
该错误消息意味着您提供了一个列表,您应该在其中提供字符串。
$concat 并没有按照您的想法去做;它不会连接列表中的项目以形成字符串,它连接两个列表以形成另一个列表。
您需要改用 $join。
我在 http://thecloudwoman.com/2017/05/how-to-use-a-terraform-list-variable/
有一个有效的例子