You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:02:42