es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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 de for_each y la dependencia del argumento var.policies. Para resolver este problema, puedes utilizar count en lugar de for_each en el recurso aws_iam_role_policy_attachment y hacer referencia a la longitud de la lista var.policies. Aquí tienes un ejemplo:


    resource "aws_iam_role_policy_attachment" "me" { count = length(var.policies) role = aws_iam_role.me.name policy_arn = var.policies[count.index] }

    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:


    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, ] ... }

    ¡Espero que esto te sea útil!

Comments are closed.