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

AWS Lambda出现"AccessDeniedExceptionKMS"错误的原因是什么?

首先澄清表述矛盾问题

AWS官方对客户主密钥(CMK)的范畴包含AWS托管密钥、客户自主管理密钥两类,报错中提到的“客户主密钥”不代表你使用了自行创建的客户管理密钥,该表述不存在矛盾。


核心排查方向

  • 首先确认权限配置主体错误:你当前配置的是Lambda执行角色的KMS权限,但部署阶段加密环境变量的操作主体是GitLab Runner关联的AWS IAM身份,并非Lambda执行角色,这是跨环境部署最常见的配置遗漏。
  • 检查区域匹配性:你贴出的aws/lambda密钥策略中kms:ViaService限定为lambda.us-east-1.amazonaws.com,确认你生产环境Lambda的部署区域是否为us-east-1。KMS密钥为区域级资源,跨区域部署时无法找到对应密钥。
  • 检查密钥策略账号匹配:密钥策略中kms:CallerAccount字段、root principal中的账号ID是否为你的生产账号ID,若直接复制dev/test环境的密钥配置未修改账号ID,部署身份会被策略拦截。
  • 检查Terraform配置是否硬编码密钥ARN:确认Lambda配置中是否写死了dev/test环境的aws/lambda密钥ARN,若硬编码非当前生产账号的密钥会触发资源不存在报错。
  • 检查部署身份权限校验:GitLab Runner关联的生产账号IAM身份是否拥有KMS加密相关权限,仅Lambda执行角色的权限不影响部署阶段的加密操作。

对应解决方案

  1. 若为部署身份权限缺失,给GitLab Runner关联的生产IAM身份新增如下权限:
{
    "Sid": "AllowLambdaKMSForDeployment",
    "Effect": "Allow",
    "Action": [
        "kms:GenerateDataKey",
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:DescribeKey"
    ],
    "Resource": "arn:aws:kms:<部署区域>:<生产账号ID>:key/aws/lambda"
}
  1. 若为区域不匹配,直接在对应部署区域使用该区域的默认aws/lambda密钥即可,AWS会自动生成对应区域的密钥策略,无需手动修改。

  2. 若为Terraform硬编码密钥问题,修改配置动态获取当前账号当前区域的默认密钥:

# 动态获取当前环境默认lambda KMS 密钥
data "aws_kms_key" "lambda_default" {
  key_id = "alias/aws/lambda"
}

resource "aws_lambda_function" "this" {
  // 其他Lambda配置保持不变
  environment {
    variables = var.environment_variables
    kms_key_arn = data.aws_kms_key.lambda_default.arn
  }
}

内容的提问来源于stack exchange,提问作者208_man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:45:04