如何解决来自 AWS Lambda 的 KMS AccessDeniedException 错误?
上次更新日期:2021 年 11 月 15 日
我的 AWS Lambda 函数返回 KMSAccessDeniedException 错误。我该如何解决此问题?
简短描述
根据错误消息更新 AWS Identity and Access Management (IAM) 身份的 AWS Key Management Service (AWS KMS) 权限。
重要提示:如果 AWS KMS 密钥和 IAM 角色属于不同的 AWS 账户,则必须更新 IAM 策略和KMS 密钥策略。
有关 AWS KMS 密钥和策略管理的更多信息,请参阅 AWS 托管 KMS 密钥和客户管理的密钥。
解决方法
注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
解决“KMS Exception: UnrecognizedClientExceptionKMS Message”错误
以下错误通常在以下情况下发生:当删除函数的执行角色,然后再使用相同名称和不同委托人重新创建时
Calling the invoke API action failed with this message: Lambda was unable to decrypt the environment variables because KMS access was denied. Please check the function's KMS key settings. KMS Exception: UnrecognizedClientExceptionKMS Message: The security token included in the request is invalid.
要解决该错误,您必须通过执行以下操作为函数的执行角色重置 AWS KMS 授权:
注意:创建和更新 Lambda 函数的 IAM 用户必须获得使用 KMS 密钥的权限。
1. 通过运行以下 AWS CLI 命令获取函数当前执行角色的 Amazon Resource Name (ARN):
$ aws lambda get-function-configuration --function-name yourFunctionName
2. 通过执行以下操作之一重置 AWS KMS 授权:
通过运行以下 update-function-configuration 命令将函数的执行角色更新为不同的临时值:
重要提示:请将 temporaryValue 替换为临时执行角色 ARN。
$ aws lambda update-function-configuration --function-name yourFunctionName --role temporaryValue
然后,通过运行以下命令将函数的执行角色更新回原始执行角色:
重要提示:请将 originalValue 替换为原始执行角色的 ARN。
$ aws lambda update-function-configuration --function-name yourFunctionName --role originalValue
– 或者 –
通过运行以下 update-function-configuration 命令将函数的 AWS KMS 密钥更新为不同的临时值:
重要提示:请将 temporaryValue 替换为临时 KMS key ARN。要使用默认服务密钥,请将 kms-key-arn 参数设为 ""。
$ aws lambda update-function-configuration --function-name yourFunctionName --kms-key-arn temporaryValue
然后,通过运行以下命令将函数的 KMS 密钥更新回原始 KMS 密钥的 ARN:
重要提示:请将 originalValue 替换为原始 KMS 密钥的 ARN
$ aws lambda update-function-configuration --function-name yourFunctionName --kms-key-arn originalValue
有关更多信息,请参阅 AWS KMS 中的密钥策略。
解决“KMS Exception: AccessDeniedException KMS Message”错误
以下错误指示 IAM 身份没有执行 kms:Decrypt API 操作所需的权限:
Lambda was unable to decrypt your environment variables because the KMS access was denied. Please check your KMS permissions. KMS Exception: AccessDeniedException KMS Message: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.
要解决该错误,请向 IAM 用户或角色添加以下策略语句:
重要提示:请将 "your-KMS-key-arn" 替换为 KMS 密钥 ARN。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "your-KMS-key-arn"
}
]
}
有关说明,请根据您的使用案例参阅向用户添加权限(控制台)或修改角色权限策略(控制台)。
解决“You are not authorized to perform”(您没有执行权限)错误
以下错误指示 IAM 身份没有访问 KMS 密钥所需的任何一项权限:
You are not authorized to perform: kms:Encrypt.
You are not authorized to perform: kms:CreateGrant.
User: user-arn is not authorized to perform: kms:ListAliases on resource: * with an explicit deny.
注意:如果使用默认密钥策略,则 IAM 身份或函数的执行角色无需 KMS 权限。
要解决这些类型的错误,请验证您的 IAM 用户或角色是否具有执行以下操作所需的权限:
有关说明,请根据您的使用案例参阅向用户添加权限(控制台)或修改角色权限策略(控制台)。
用于授予访问客户托管 KMS 密钥所需权限的示例 IAM 策略语句
重要提示:Resource 值必须为 "*"。kms:ListAliases 操作不支持低级别权限。另外,请确保将 "your-kms-key-arn" 替换为 KMS 密钥的 ARN。
"Statement": [
{
"Sid": "statement1",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:CreateGrant",
],
"Resource": "your-kms-key-arn"
},
{
"Sid": "statement2",
"Effect": "Allow",
"Action": "kms:ListAliases",
"Resource": "*"
}
]