我不明白为什么 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
是可选的。我以为它不会出现在计划中。这是正常的吗?
Terraform 在这里描述的不是删除策略 JSON,而是原地更新:
请注意,整个属性上的注释是
~
,而不是-
,这意味着它正在就地更新。这部分
(known after apply)
是有趣的部分:它告诉您 Terraform 还不知道最终的政策文档 JSON 是什么。如果对文档有贡献的任何值是直到应用步骤才知道的值,通常会发生这种情况,这就是计划顶部的注释试图说明的内容:在应用阶段,Terraform 将再次尝试评估此数据资源,此时所有值都应该是已知的,因此它将能够读取它。然后它应该生成一个有效的策略文档供使用,这可能与旧文档类似,但 Terraform 本身还不知道。
如果您想在将新策略应用到任何其他资源之前
-target
完整地查看它,那么您可以使用该选项让 Terraform 只关注进行允许决定 JSON 文档的更改,如下所示:使用这些
-target
选项,Terraform 将跳过规划数据资源和依赖于它的任何其他内容,因此您不会data "aws_iam_policy_document" "my_policy"
在规划中看到任何提及。一旦您应用了该部分更改,您就可以terraform apply
像往常一样在没有任何参数的情况下运行,然后 Terraform 应该能够在规划阶段评估 JSON 策略文档,因为所有输入值都已经知道。[] -> null
那些not_actions
和参数的变化not_resources
似乎只是提供者中的小错误:提供者似乎不一致关于 unset 是表示为空列表还是表示为null
,因此 Terraform CLI 在屏幕上呈现这种差异。提供者应该对其表示方式保持一致,以避免显示这种令人困惑的额外噪音。