example con aws amazon-web-services amazon-iam terraform

amazon-web-services - con - terraform aws example



Terraform: ¿la forma correcta de vincular las políticas administradas de AWS a un rol? (2)

Quiero adjuntar uno de los roles administrados de AWS preexistentes a una política, aquí está mi código actual:

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" }

¿Hay una mejor manera de modelar la política administrada y luego hacer referencia a ella en lugar de codificar de forma rígida el ARN? Simplemente parece que cada vez que codifico ARNs / caminos u otras cosas como esta, generalmente descubro que más tarde había una mejor manera.

¿Hay algo ya existente en Terraform que modela las políticas administradas? ¿O es hardcoding el ARN la forma "correcta" de hacerlo?


Cuando utiliza valores que Terraform no administra directamente, tiene algunas opciones.

La primera opción, la más sencilla, es simplemente codificar el valor como lo hizo aquí. Esta es una respuesta directa si espera que el valor nunca cambie. Dado que estas "políticas enlatadas" están documentadas, es probable que las características integradas de AWS se ajusten a este criterio.

La segunda opción es crear un módulo Terraform y codificar el valor en eso , y luego hacer referencia a este módulo desde otros módulos. Esto le permite administrar el valor centralmente y usarlo muchas veces. Un módulo que contiene solo salidas es un patrón común para este tipo de cosas, aunque también puede elegir hacer un módulo que contenga un recurso aws_iam_role_policy_attachment con el conjunto de roles de una variable.

La tercera opción es colocar el valor en alguna ubicación de la que Terraform pueda recuperar valores, como Cónsul, y luego recuperarlo desde allí utilizando una fuente de datos. Con solo Terraform en juego, esto termina siendo en gran medida equivalente a la segunda opción, aunque significa que Terraform lo volverá a leer en cada actualización en lugar de solo cuando actualice el módulo utilizando terraform init -upgrade , y por lo tanto esto podría ser una mejor terraform init -upgrade . Opción por valores que cambian a menudo.

La cuarta opción es usar una fuente de datos especializada que pueda leer el valor directamente de la fuente de la verdad. Actualmente, Terraform no tiene un origen de datos para obtener información sobre las políticas administradas de AWS, por lo que no es una opción para su situación actual, pero se puede usar para obtener otros datos definidos por AWS, como los rangos de direcciones IP de AWS, los ARN de servicio, etc. .

Cuál de estos es apropiado para una situación determinada dependerá de la frecuencia con la que cambie el valor, de quién gestione los cambios y de la disponibilidad de fuentes de datos especializadas de Terraform.


La fuente de datos de la Política IAM es excelente para esto Un recurso de datos se utiliza para describir datos o recursos que Terraform no administra activamente, pero Terraform hace referencia a ellos.

Para su ejemplo, crearía un recurso de datos para la política administrada de la siguiente manera:

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

El nombre de la fuente de datos, ReadOnlyAccess en este caso, depende completamente de usted. Para las políticas administradas, utilizo el mismo nombre que el nombre de la política por motivos de coherencia, pero usted podría simplemente nombrarlo de solo readonly si le conviene.

A continuación, adjuntará la política de IAM a su función de la siguiente manera:

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}" }