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

如何在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/工作例如

+0

一)我不使用一个本地高管供应者,所以我不能用'echo',我需要使用'jsonencode'如上述答案B)我使用两次格式列表,两个列表,加入两个列表,我需要使用'concat',而不是'join' – junichiro

+0

然后在用concat创建组合列表之后,需要将它变成一个字符串加入。你提供的错误信息是“不要给我一个列表,给我一个字符串”。 Concat创建另一个列表,而不是一个字符串。 – Rachel