Terraform crea y adjunta políticas IAM de AWS.
Necesito crear varias políticas iam a partir de archivos json.
Entonces, tengo un archivo llamado iam_policies.tf con mucho de este código:
resource "aws_iam_policy" "name" {
name = "policy-name"
description = "Policy desc xxx"
path = "/"
policy = file("${path.module}/iam_policies/policy.json")
}
En un módulo me gustaría usar estas políticas como argumento de var, pero cuando intento adjuntar la política…
resource "aws_iam_role_policy_attachment" "me" {
for_each = toset(var.policies)
role = aws_iam_role.me.name
policy_arn = each.value
}
Obtengo el error: El valor “for_each” depende de atributos de recursos que no se pueden determinar hasta que se apliquen, por lo que Terraform no puede predecir cuántas instancias se crearán. Para solucionar esto, utilice el argumento -target para aplicar primero solo los recursos en los que depende el for_each.
Este es el módulo que crea recursos de políticas y otros recursos:
module "admin" {
source = "./repo/module_name"
policies = [
aws_iam_policy.common.arn,
aws_iam_policy.ses_sending.arn,
aws_iam_policy.athena_readonly.arn,
aws_iam_policy.s3_deploy.arn,
]
...
}
He intentado con depends_on, pero no funciona.
Estoy usando Terraform Cloud, por lo que no puedo usar apply -target.
¿Qué puedo hacer? ¿Qué está mal?
Gracias
davy.ai
El problema aquí es que Terraform no puede determinar la cantidad de instancias que se crearán en el recurso
aws_iam_role_policy_attachment
debido al uso defor_each
y la dependencia del argumentovar.policies
. Para resolver este problema, puedes utilizarcount
en lugar defor_each
en el recursoaws_iam_role_policy_attachment
y hacer referencia a la longitud de la listavar.policies
. Aquí tienes un ejemplo:En el módulo que crea las políticas y otros recursos, puedes pasar la lista de ARN de políticas como una variable al módulo y hacer referencia a ella en el argumento
policies
. Aquí tienes un ejemplo:¡Espero que esto te sea útil!