如何将concat与terraform中的formatlist结合起来?

时间:2017-04-20 08:18:12

标签: 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}))}"]
},

2 个答案:

答案 0 :(得分:9)

看起来你正在尝试在这里构建一个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来解决,因此在返回之前将列表转换为字符串它。

答案 1 :(得分:1)

该错误消息表示您提供了一个应该提供字符串的列表。

$ concat没有做我认为你认为的事情;它不会连接列表中的项目以形成字符串,它会连接两个列表以形成另一个列表。

您需要使用$ join。

我在http://thecloudwoman.com/2017/05/how-to-use-a-terraform-list-variable/

有一个有效的例子