Terraform aws_iam_policy_document与原IAM JSON策略是否等效?
结论
你的Terraform配置和原始JSON策略完全不等效,核心错误是condition块内的variable参数值填写错误,这也是执行plan时出现条件键变更的直接原因。
variable参数的作用逻辑
在aws_iam_policy_document数据源的condition块中:
test对应原始IAM JSON中Condition块下的条件运算符(比如你这里的ArnLike)variable对应该运算符下的IAM条件键名,必须和原始JSON里的键名逐字完全匹配,字符顺序、拼写都不能出错values是条件键匹配的目标值列表,即使只有一个值也用列表格式传入,Terraform渲染JSON时会自动适配IAM支持的单值/数组值格式,这部分你的写法没有问题。
具体错误点
原始JSON里ArnLike下的条件键是kms:EncryptionContext:aws:logs:arn,你写配置时把键名的字段顺序写反了,写成了kms:EncryptionContext:arn:aws:logs,相当于配置了一个完全不存在的条件键,和原始策略的逻辑完全不一致。
这也和你看到的plan输出完全对应:
- 被标记为删除(
-)的kms:EncryptionContext:aws:logs:arn才是原始策略里正确的条件键 - 被标记为新增(
+)的kms:EncryptionContext:arn:aws:logs是你写错的无效条件键
正确的配置写法
把variable参数的值改成和原始JSON完全一致的键名即可,修正后的condition块代码如下:
condition { test = "ArnLike" variable = "kms:EncryptionContext:aws:logs:arn" values = [ "arn:aws:logs:${var.region}:${data.aws_caller_identity.current.account_id}:*" ] }
修正后重新执行plan,就不会再出现Condition块的非预期变更了。
内容的提问来源于stack exchange,提问作者TheWalkingMalteser
相关产品推荐
相关产品推荐

