#list #file #variables #terraform
#Список #файл #переменные #terraform
Вопрос:
- Я создаю список политик IAM, который хранится в формате .json.
- У меня есть только 1 блок ресурсов, с помощью
count = length(count)
я хочу создать политику множественного ввода-вывода. - Политики хранятся в формате .json. Я ссылаюсь на них в Terraform с помощью
file()
.
Если я создаю блок с несколькими ресурсами, программа работает.
main.tf:
resource "aws_iam_role_policy" "cloudcheckr" {
count = "${length(var.file_name)}"
role = "${aws_iam_role.cloudcheckr.id}" // An IAM role is created in another resource block
name = "${var.file_name[count.index]}"
policy = "${file("${var.file_name[count.index]}.json")}"
variables.tf:
variable "file_name" {
type = "list"
default = [
"xxxxxx",
"xxxxxx",
"xxxxxx",
"xxxxxx",
]
}
Ожидаемые результаты:
Создано несколько политик IAM.
Фактические результаты:
aws_iam_role_policy.cloudcheckr: 3 error(s) occurred:
* aws_iam_role_policy.cloudcheckr[3]: file: open iam_policy_cloudcheckr_security.json: no such file or directory in:
${file("${var.file_name[count.index]}.json")}
* aws_iam_role_policy.cloudcheckr[0]: file: open iam_policy_cloudcheckr_cloudwatchflowlogs.json: no such file or directory in:
${file("${var.file_name[count.index]}.json")}
* aws_iam_role_policy.cloudcheckr[2]: file: open iam_policy_cloudcheckr_inventory.json: no such file or directory in:
${file("${var.file_name[count.index]}.json")}
Комментарии:
1. Подумайте об использовании ‘Path’ : terraform.io/docs/configuration-0-11/interpolation.html Краткое описание: синтаксис — path.TYPE. ТИП может быть cwd, module или root. cwd интерполирует текущий рабочий каталог. модуль интерполирует путь к текущему модулю. root интерполирует путь к корневому модулю.
Ответ №1:
На первый взгляд проблем нет. Но есть еще несколько способов решить проблему с путем к файлу.
${path.module} полезно при использовании file()
изнутри модуля, обычно требуется указать путь относительно базы модуля, вот так: file("${path.module}/file")
.
Таким образом, ваш код может быть изменен на
resource "aws_iam_role_policy" "cloudcheckr" {
count = "${length(var.file_name)}"
role = "${aws_iam_role.cloudcheckr.id}" // An IAM role is created in another resource block
name = "${var.file_name[count.index]}"
policy = "${file("${path.module}/${var.file_name[count.index]}.json")}"
}
Если это не сработает, попробуйте с format()
policy = "${file(format("%s/%s.json", "${path.module}, ${var.file_name[count.index]}"))}"