Создайте политику AWS IAM, используя функцию var{count.index} в file() в Terraform

#list #file #variables #terraform

#Список #файл #переменные #terraform

Вопрос:

  1. Я создаю список политик IAM, который хранится в формате .json.
  2. У меня есть только 1 блок ресурсов, с помощью count = length(count) я хочу создать политику множественного ввода-вывода.
  3. Политики хранятся в формате .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]}"))}"