¿Por qué Terraform quiere eliminar por completo aws_iam_policy_document?

¿Por qué Terraform quiere eliminar por completo aws_iam_policy_document?

No entiendo por qué Terraform quiere eliminar la política json. En otros casos, cuando los datos se leerán durante la aplicación, el plan muestra que la política json se elimina y se agrega en el mismo plan, pero no sucede, Terraform simplemente la elimina.

Esta es la política:

data "aws_iam_policy_document" "my_policy" {
  statement {
    sid = "S3"
    effect = "Allow"
    actions = ["s3:*"]
    resources = [
      aws_s3_bucket.some-bucket.arn,
      "arn:aws:s3:::another-bucket/*",
      "arn:aws:s3:::another-bucket/"
    ]
  }
  statement {
    sid = "CloudWatch"
    effect = "Allow"
    actions = ["logs:*"]
    resources = [
      aws_cloudwatch_log_group.some_lambda.arn,
      "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group:*",
      "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group"
    ]
  }
}

Y aquí está el plan:

  # data.aws_iam_policy_document.my_policy will be read during apply
  # (config refers to values not yet known)
 <= data "aws_iam_policy_document" "my_policy"  {
      ~ id      = "123456789" -> (known after apply)
      ~ json    = jsonencode(
            {
              - Statement = [
                  - {
                      - Action   = "s3:*"
                      - Effect   = "Allow"
                      - Resource = [
                          - "arn:aws:s3:::another-bucket/*",
                          - "arn:aws:s3:::another-bucket/",
                        ]
                      - Sid      = "S3"
                    },
                  - {
                      - Action   = "logs:*"
                      - Effect   = "Allow"
                      - Resource = [
                          - "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group:*",
                          - "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group",
                        ]
                      - Sid      = "CloudWatch"
                    },
                ]
              - Version   = "2012-10-17"
            }
        ) -> (known after apply)
      - version = "2012-10-17" -> null

      ~ statement {
          - not_actions   = [] -> null
          - not_resources = [] -> null
          ~ resources     = [
              + "arn:aws:s3:::some-bucket/",
                # (2 unchanged elements hidden)
            ]
            # (3 unchanged attributes hidden)
        }
      ~ statement {
          - not_actions   = [] -> null
          - not_resources = [] -> null
            # (4 unchanged attributes hidden)
        }
    }

1 - ¿Por qué Terraform quiere eliminar esta política json?

2 - Los not_actionsy not_resourcesson opcionales. Pensé que no aparecería en el plan. ¿Esto es normal?

Respuesta1

Lo que Terraform ha descrito aquí no esborrarla política JSON, pero para actualizarla en su lugar:

  ~ json = jsonencode(...) -> (known after apply)

Observe que la anotación en todo el atributo es ~, en lugar de -, lo que significa que se está actualizando en su lugar.

La (known after apply)parte de esto es la parte interesante: le dice que Terraform aún no sabe cuál será el documento de política final JSON. Esto suele suceder si alguno de los valores que contribuyen al documento son valores que no se conocerán hasta el paso de aplicación, que es lo que la nota en la parte superior del plan intenta decir:

  # (config refers to values not yet known)

Durante la fase de solicitud, Terraform intentará nuevamente evaluar este recurso de datos, momento en el cual se deberían conocer todos los valores y así podrá leerlos. Luego debería producir un documento de política válido para usar, que probablemente será similar al anterior, pero Terraform aún no lo sabe.

Si quieres ver la nueva política completaantesSi lo aplica a cualquier otro recurso, entonces podría usar la -targetopción para pedirle a Terraform que se concentre solo en realizar los cambios que permitirán decidir el documento JSON, como este:

terraform apply -target=aws_s3_bucket.some-bucket.arn -target=aws_cloudwatch_log_group.some_lambda.arn

Con esas -targetopciones, Terraform omitirá la planificación del recurso de datos y cualquier otra cosa que dependa de él, por lo que no verá ninguna mención al respecto data "aws_iam_policy_document" "my_policy"en el plan. Una vez que haya aplicado ese cambio parcial, podrá ejecutar terraform applysin ningún argumento de forma normal y luego Terraform debería poder evaluar el documento de política JSON durante la fase de planificación, porque ya se conocerán todos los valores de entrada.


Los cambios de [] -> nullpara esos not_actionsy not_resourcesargumentos parecen ser solo errores menores en el proveedor: el proveedor parece ser inconsistente acerca de si unset se representa como una lista vacía o como null, por lo que Terraform CLI muestra esa diferencia en la pantalla. El proveedor debe ser coherente acerca de cómo lo representa para evitar mostrar este ruido extra confuso.

información relacionada