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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:00:11