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执行角色的权限不影响部署阶段的加密操作。
对应解决方案
- 若为部署身份权限缺失,给GitLab Runner关联的生产IAM身份新增如下权限:
{ "Sid": "AllowLambdaKMSForDeployment", "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Encrypt", "kms:Decrypt", "kms:DescribeKey" ], "Resource": "arn:aws:kms:<部署区域>:<生产账号ID>:key/aws/lambda" }
若为区域不匹配,直接在对应部署区域使用该区域的默认
aws/lambda密钥即可,AWS会自动生成对应区域的密钥策略,无需手动修改。若为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
相关产品推荐
相关产品推荐

