Terraform配置AWS KMS Key遇策略格式错误及自引用问题求助
解决Terraform中KMS密钥策略引用自身ARN的循环依赖问题
在Terraform中配置AWS KMS密钥并为Kinesis Firehose角色添加权限时,直接硬编码密钥ARN不够灵活,尝试的两种方案均存在问题:
- 使用
key/*作为Resource值:KMS策略不支持这种格式,会触发「malformed policy document exception」错误,Resource字段需指定完整ARN或*。 - 在
aws_kms_key的policy中直接引用aws_kms_key.key.arn:会导致循环依赖,因为Terraform需要先创建密钥才能生成ARN,但创建密钥又依赖于包含ARN的策略,因此报错「Configuration for aws_kms_key.key may not refer to itself」。
推荐解决方案:使用单独的aws_kms_key_policy资源
将KMS密钥的策略管理与密钥创建分离,通过独立的aws_kms_key_policy资源配置权限,即可安全引用已创建密钥的ARN,彻底避免循环依赖。
示例代码如下:
# 先创建KMS密钥,可包含基础IAM权限策略 resource "aws_kms_key" "key" { description = var.description key_usage = var.key_usage is_enabled = true policy = jsonencode({ Version = "2012-10-17", Id = "key-default-1", Statement = [ { Sid = "Enable IAM User Permissions", Effect = "Allow", Principal = { AWS = "*" }, Action = [ "kms:Create*", "kms:CancelKeyDeletion", # 补充你需要的其他基础权限 ], Resource = "*", } ] }) } # 单独配置密钥策略,添加Firehose角色的访问权限 resource "aws_kms_key_policy" "key_firehose_policy" { key_id = aws_kms_key.key.id policy = jsonencode({ Version = "2012-10-17", Id = "key-firehose-permissions", Statement = [ # 保留原有的基础IAM权限语句 { Sid = "Enable IAM User Permissions", Effect = "Allow", Principal = { AWS = "*" }, Action = [ "kms:Create*", "kms:CancelKeyDeletion", # 补充你需要的其他基础权限 ], Resource = "*", }, # 新增Firehose角色的权限 { Sid = "Allow firehose role", Effect = "Allow", Principal = { AWS = "arn:aws:iam::${local.account_id}:role/${var.somerole}" }, Action = [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], Resource = aws_kms_key.key.arn } ] }) } # 提前定义账号ID(若未定义) data "aws_caller_identity" "current" {} locals { account_id = data.aws_caller_identity.current.account_id }
注意事项
aws_kms_key_policy会完全替换KMS密钥上的现有策略,因此需将所有必要的权限语句(包括原有的基础权限)都包含在该资源的policy中。- 确保
local.account_id已正确定义,可通过aws_caller_identity数据源自动获取当前AWS账号ID。
内容的提问来源于stack exchange,提问作者Wonderhost
相关产品推荐
相关产品推荐

