Я пытаюсь использовать вложенный цикл в Terraform. У меня есть две переменные списка list_of_allowed_accounts
и list_of_images
, и глядя на перебор списка, list_of_images
а затем перебрать список list_of_allowed_accounts
.
Вот мой терраформный код.
variable "list_of_allowed_accounts" {
type = "list"
default = ["111111111", "2222222"]
}
variable "list_of_images" {
type = "list"
default = ["alpine", "java", "jenkins"]
}
data "template_file" "ecr_policy_allowed_accounts" {
template = "${file("${path.module}/ecr_policy.tpl")}"
vars {
count = "${length(var.list_of_allowed_accounts)}"
account_id = "${element(var.list_of_allowed_accounts, count.index)}"
}
}
resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" {
count = "${length(var.list_of_images)}"
repository = "${element(aws_ecr_repository.images.*.id, count.index)}"
count = "${length(var.list_of_allowed_accounts)}"
policy = "${data.template_file.ecr_policy_allowed_accounts.rendered}"
}
Это bash эквивалент того, что я пытаюсь сделать.
for image in alpine java jenkins
do
for account_id in 111111111 2222222
do
// call template here using variable 'account_id' and 'image'
done
done
account_id = var.list_of_allowed_accounts[floor(count.index / length(var.list_of_images))]
Ответы здесь работают (я использовал их изначально), но я думаю, что у меня есть лучшее решение, использующее функцию setproduct от Terraform . Я не видел много примеров его использования в паутинах, но setproduct берет два набора (или, что более важно, два списка) и создает список наборов с каждой перестановкой входных данных. В моем случае я создаю параметры SSM:
Это создает параметры SSM с именем:
Мой слабый маленький мозг может разобрать это немного легче, чем магия по модулю в других ответах!
источник
${length(var.list1) * length(var.list2)}
вместо${length(local.product)}
для подсчета?${length(local.product)}
вероятно, делает больше с тех пор. Кроме того, я вполне уверен, чтоsetproduct()
существует до 0.12 (сообщение в верхней части связанной страницы является просто общим предупреждением для всех их документов 0.11, я думаю?)К вашему сведению, если кто-нибудь придет сюда из Google, если вы используете terraform 0.12, вам нужно будет использовать функцию floor в любом месте, где вы делите, иначе вы получите ошибку о частичных индексах.
источник
for
,for_each
и / или динамические вложенные блоки языковые конструкции , чтобы реализовать что - то чуть меньше толку?В основном проблема заключается в данных «template_file», account_id не может быть установлен так, как вы думаете, так как count в вашем случае - это просто еще одна переменная, которая никогда не будет увеличена / изменена. Просто говорю, потому что я скучаю, чтобы узнать, что именно ваш вопрос.
источник
У меня недостаточно очков репутации, чтобы добавить комментарий к ответу, предоставленному @ Martin Atkins , поэтому я публикую его ответ с небольшим изменением, которое решает проблему Terraform 20567
источник