2017-04-20 55 views
0

是否可以連接由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}))}"] 
}, 

回答

6

它看起來像你想在這裏建一個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來解決它,因此在返回它之前將列表變成一個字符串。
0

該錯誤消息意味着您正在提供一個列表,您應該提供一個字符串。

$ 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

相關問題