为什么Terraform要完全删除aws_iam_policy_document?

为什么Terraform要完全删除aws_iam_policy_document?

我不明白为什么 Terraform 要删除 json 策略。在其他情况下,当在应用期间读取数据时,计划显示 json 策略被删除并添加到同一计划中,但这并没有发生,Terraform 只是将其删除。

这是政策:

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

计划如下:

  # 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——为什么Terraform想要消除这个json策略?

2 -not_actionsnot_resources是可选的。我以为它不会出现在计划中。这是正常的吗?

答案1

Terraform 在此处描述的并不是删除策略 JSON,但要就地更新它:

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

请注意,整个属性的注释是~,而不是-,这意味着它正在就地更新。

这部分(known after apply)是有趣的部分:它告诉您 Terraform 尚不知道最终的策略文档 JSON 是什么。如果文档中的任何值都是直到应用步骤才会知道的值,则通常会发生这种情况,这就是计划顶部的注释试图表达的意思:

  # (config refers to values not yet known)

在应用阶段,Terraform 将再次尝试评估此数据资源,此时所有值都应该已知,因此它将能够读取它。然后它应该生成一个有效的策略文档以供使用,该文档可能与旧文档类似,但 Terraform 本身还不知道这一点。

如果你想完整了解新政策您将其应用于任何其他资源,然后您可以使用该-target选项让 Terraform 仅关注进行允许决定 JSON 文档的更改,如下所示:

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

使用这些-target选项,Terraform 将跳过规划数据资源以及依赖于它的任何其他内容,因此您不会data "aws_iam_policy_document" "my_policy"在计划中看到任何提及。应用该部分更改后,您可以terraform apply照常运行而无需任何参数,然后 Terraform 应该能够在规划阶段评估 JSON 策略文档,因为所有输入值都已经知道。


[] -> null对这些not_actions和参数的更改not_resources似乎只是提供程序中的小错误:提供程序似乎对 unset 是作为空列表还是作为 表示不一致null,因此 Terraform CLI 会在屏幕上呈现这种差异。提供程序应该对如何表示这一点保持一致,以避免显示这种令人困惑的额外噪音。

相关内容