我不明白为什么 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 会在屏幕上呈现这种差异。提供程序应该对如何表示这一点保持一致,以避免显示这种令人困惑的额外噪音。