关于Terraform计划删除aws_iam_policy_document JSON策略及可选字段显示问题的咨询
关于Terraform计划删除aws_iam_policy_document JSON策略及可选字段显示问题的咨询
我来帮你拆解这两个常见的Terraform IAM策略问题,都是很容易让人困惑的细节点:
1. 为什么Terraform看起来要清空JSON策略?
其实这不是真的要“删除”策略后不重建,而是**data "aws_iam_policy_document" 资源的特性导致的显示逻辑问题**。
你的配置里引用了aws_s3_bucket.some-bucket.arn——这个值在plan阶段是未知的(因为S3桶还没创建,ARN要到apply时才生成)。按照Terraform的规则,如果data资源依赖了未确定的变量/资源属性,就会延迟到apply阶段才去读取解析这个data。
所以在plan输出里:
- 显示
- json = ...是展示当前状态里(或者之前解析的)旧的JSON内容 - 后面的
-> (known after apply)是告诉我们,Terraform会在apply时生成包含未知S3桶ARN的新JSON内容
你看到的“删除”只是计划在对比已知旧值和未来新值时的展示方式,实际执行apply时会正确生成包含新桶ARN的完整策略,不会真的把策略删掉。如果所有依赖资源都已经创建完成(比如第二次运行plan),这个data会在plan阶段就解析完成,就不会出现这种看起来要删除的显示了。
2. not_actions和not_resources显示变更是否正常?
这个是完全正常的,原因很简单:
- 这两个字段是可选的,你的配置里没有定义它们,所以Terraform会把它们的值设为
null - 但在之前的状态里,Terraform可能默认把未设置的可选数组字段存为
[](空数组) - 所以plan时就会显示
- not_actions = [] -> null,表示要把状态里的空数组更新为null(也就是移除这个字段的状态记录)
这种变更完全不会影响IAM策略的功能,只是Terraform在对齐配置和状态的细节表现。如果你不想看到这个,可以显式在statement块里加上not_actions = []和not_resources = [],不过完全没必要,不影响实际使用。
你的IAM策略配置:
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" ] } }
对应的Terraform Plan片段:
# 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) } }
备注:内容来源于stack exchange,提问作者Arrow Root
相关产品推荐
相关产品推荐

