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