如何在terraform中将concat和formatlist结合起来?
问题描述:
是否可以连接由formatlist生成的列表?下面给出了错误如何在terraform中将concat和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)
)
)}
}
你原始示例有几个部分在此处存在问题:
- 当提及变量如果您已经在
${ ... }
序列中,则无法使用第二个${
分隔符。此标记表示从字符串上下文到插值表达式上下文的转换,因此当您已经处于插值表达式上下文中时,该标记无效。 - 使用模板时,所有插值表达式都必须返回字符串,因为模板系统没有任何迭代构造。你在这里得到的错误信息有点不准确(它应该告诉你只允许一个字符串),但是通过在上面的例子中包含
jsonencode
来解决它,因此在返回它之前将列表变成一个字符串。
答
该错误消息意味着您正在提供一个列表,您应该提供一个字符串。
$ concat不会做我认为你认为它的功能;它不会连接列表中的项目以形成一个字符串,它会连接两个列表以形成另一个列表。
您需要改为使用$ join。
我有一个http://thecloudwoman.com/2017/05/how-to-use-a-terraform-list-variable/工作例如
一)我不使用一个本地高管供应者,所以我不能用'echo',我需要使用'jsonencode'如上述答案B)我使用两次格式列表,两个列表,加入两个列表,我需要使用'concat',而不是'join' – junichiro
然后在用concat创建组合列表之后,需要将它变成一个字符串加入。你提供的错误信息是“不要给我一个列表,给我一个字符串”。 Concat创建另一个列表,而不是一个字符串。 – Rachel