為什麼 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 在螢幕上呈現該差異。提供者應該對其表示方式保持一致,以避免顯示這種令人困惑的額外噪音。

相關內容