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 はその違いを画面にレンダリングしています。プロバイダーは、この混乱を招く余分なノイズを表示しないように、 の表現方法について一貫性を保つ必要があります。

関連情報