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

如何在terraform中将concat与formatlist结合起来?,terraform,Terraform,是否可以合并formatlist生成的列表?下面给出了错误 第1列第1行:HIL表达式的输出必须是字符串或单个列表(参数6是TypeList): 看起来您正在尝试在此处构建JSON数组,在这种情况下,应该可以执行以下操作: { "Action": [ "s3:Get*", "s3:List*" ], "Effect": "Allow", "Resource": ${jsonencode( concat( form

是否可以合并formatlist生成的列表?下面给出了错误

第1列第1行:HIL表达式的输出必须是字符串或单个列表(参数6是TypeList)


看起来您正在尝试在此处构建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)
     )
   )}
}
您的原始示例有几个部分在这里有问题:

  • 当您已经在
    ${…}
    序列中引用变量时,不能使用第二个
    ${
    分隔符。此标记表示从字符串上下文到插值表达式上下文的转换,因此当您已经在插值表达式上下文中时,它无效
  • 使用模板时,所有插值表达式都必须返回字符串,因为模板系统没有任何迭代构造。您在此处收到的错误消息有点不准确(它应该告诉您只允许一个字符串)但通过在上面的示例中包含
    jsonecode
    解决了这个问题,从而在返回列表之前将列表转换为字符串

该错误消息表示您正在提供一个列表,其中应提供一个字符串

$concat并不像我认为的那样,它不会将列表中的项目连接起来形成字符串,而是将两个列表连接起来形成另一个列表

您需要改用$join


我在

a)我没有使用本地exec provisioner,所以我不能使用
echo
,我需要使用
JsoneCode
,正如上面的答案b)我使用了两次formatlist,这给了我两个列表,来连接两个列表,我需要使用
concat
,而不是
join
,然后在您创建联合收割机之后d使用concat创建列表,您需要使用join将其转换为字符串。您提供的错误消息是“不要给我列表,给我字符串”。concat创建另一个列表,而不是字符串。
{
    "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)
     )
   )}
}