2017-04-20 20 views
0

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) 
    ) 
    )} 
} 

あなた元の例には、ここで問題となる部分がいくつかあります。

  • variaあなたが既に${ ... }シーケンス内にいるときは、もう一度${区切り文字を使用することはできません。このマーカは、文字列コンテキストから補間式コンテキストへの遷移を通知するので、補間式コンテキストにすでに入っているときは無効です。
  • テンプレートを使用する場合、テンプレートシステムに反復構造がないため、すべての補間式で文字列を返す必要があります。ここにあるエラーメッセージは少し正確ではありませんが(上記の例では1つの文字列しか許されていません)、上記の例ではjsonencodeを含めることで解決されています。
0

このエラーメッセージは、文字列を入力する必要がある場所のリストを提供していることを意味します。

$ concatは私があなたが思うと思いますがしません。リスト内の項目を連結して文字列を形成しない場合、2つのリストを連結して別のリストを形成します。

代わりに$ joinを使用する必要があります。

は私が http://thecloudwoman.com/2017/05/how-to-use-a-terraform-list-variable/で働いていた例があり

+0

a)のIので、私はecho' '使用することはできませんローカル-execのプロビジョニングを使用していないが、私は上記の回答Bのように' jsonencode'を使用する必要があります)私はformatlistを2回使用して2つのリストを作成しています.2つのリストに参加するには 'join 'ではなく' concat'を使用する必要があります。 – junichiro

+0

そして、concatで結合リストを作成した後、参加する。あなたが提供しているエラーメッセージは、 "私にリストを与えて、私に文字列を与えないでください"と言っています。 Concatは文字列ではなく別のリストを作成します。 – Rachel

関連する問題