Terraform: правильный способ привязать управляемые политики AWS к роли?

Я хочу прикрепить одну из существующих ранее управляемых ролей AWS к политике, вот мой текущий код:

resource "aws_iam_role_policy_attachment" "sto-readonly-role-policy-attach" {
  role       = "${aws_iam_role.sto-test-role.name}"
  policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

Есть ли лучший способ смоделировать управляемую политику и затем ссылаться на нее вместо жесткого кодирования ARN? Кажется, что всякий раз, когда я жестко кодирую ARN/пути или другие подобные вещи, я обычно узнаю, что есть лучший способ.

Есть ли в Terraform что-то, что моделирует управляемые политики? Или жесткое кодирование ARN - "правильный" способ сделать это?

Ответ 1

Источник данных политики IAM отлично подходит для этого. Ресурс данных используется для описания данных или ресурсов, которые не активно управляются Terraform, но на которые ссылается Terraform.

Для вашего примера вы должны создать ресурс данных для управляемой политики следующим образом:

data "aws_iam_policy" "ReadOnlyAccess" {
  arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

Имя источника данных, в данном случае ReadOnlyAccess, полностью зависит от вас. Для управляемых политик я использую то же имя, что и имя политики, для согласованности, но вы можете с легкостью назвать его только для readonly если это вас устраивает.

Затем вы прикрепите политику IAM к своей роли следующим образом:

resource "aws_iam_role_policy_attachment" "sto-readonly-role-policy-attach" {
  role       = "${aws_iam_role.sto-test-role.name}"
  policy_arn = "${data.aws_iam_policy.ReadOnlyAccess.arn}"
}

Ответ 2

При использовании значений, которые Terraform непосредственно не управляет напрямую, у вас есть несколько вариантов.

Первый, самый простой вариант - просто скорректировать значение, как вы это делали. Это простой ответ, если вы ожидаете, что значение никогда не изменится. Учитывая, что эти "законченные политики" документированы, встроенные функции AWS, они, вероятно, соответствуют этим критериям.

Второй вариант - создать модуль Terraform и записать в него значение, а затем ссылаться на этот модуль из нескольких других модулей. Это позволяет вам централизованно управлять стоимостью и использовать ее много раз. Модуль, который содержит только выходы, является общим шаблоном для такого рода вещей, хотя вы также можете выбрать модуль, содержащий ресурс aws_iam_role_policy_attachment с ролью, заданной из переменной.

Третий вариант заключается в том, чтобы поместить значение в некотором местоположении, которое Terraform может извлекать из таких значений, например Consul, а затем извлекать его оттуда с использованием источника данных. При использовании только Terraform в игре это в значительной степени эквивалентно второму варианту, хотя это означает, что Terraform будет перечитывать его при каждом обновлении, а не только при обновлении модуля с помощью terraform init -upgrade, и, таким образом, это может быть лучшим вариантом для значений, которые часто меняются.

Четвертый вариант - использовать специализированный источник данных, который может считывать значение непосредственно из источника правды. В настоящее время Terraform не имеет источника данных для получения информации об управляемых политиках AWS, поэтому это не является вариантом для вашей текущей ситуации, но может использоваться для извлечения других данных, определенных AWS, таких как диапазоны IP-адресов AWS, сервисные ARN и т.д..

Какое из них подходит для данной ситуации, будет зависеть от того, как обычно изменяется значение, кто управляет изменениями в нем и наличия специализированных источников данных Terraform.

Ответ 3

Как я могу прикрепить несколько ранее существовавших управляемых ролей AWS к политике?