terraform 0.12 以降は以下のように for が使えるのでこの記事の方法はいりません。
variable list_variables {
type = "list"
default = [ "var1", "var2", "var3" ]
}
locals {
new_list = [for item in var.list_variables : "${item}_suffix"]
}
Rubyならこんなに簡単に書ける。
list_variables = [ 'var1', 'var2', 'var3' ]
new_list = list_variables.map { |var| var + '_suffix' }
# p new_list
# [ 'var1_suffix', 'var2_suffix', 'var3_suffix' ]
terraformでやろうと頑張ってみて、こんな感じでできた。
variable list_variables {
type = "list"
default = [ "var1", "var2", "var3" ]
}
new_list = ["${split( ",", "${join("_suffix,", var.list_variables)}_suffix" )}"]
上の処理シーケンスをJava
で実装するとこんな感じ。
final List<String> listVariables = Arrays.asList("var1", "var2", "var3");
final String combinedVariables = listVariables
.stream()
.collect(Collectors.joining("_suffix,"))
+ "_suffix";
final String[] newVariables = combinedVariables.split(",");
実際にありそうな使い方としては、S3バケット名のリストがあるけど、その配下のオブジェクトに対して権限を付与したいときなど。
data aws_iam_policy_document "bucket_policy" {
statement {
actions = ["s3:GetObject", "s3:PutObject"]
resources = ["${split( ",", "${join("/*,", var.bucket_names)}/*" )}"]
}
}
もっといいやり方あったら教えてください。