如何解决来自 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": "*"
        }
    ]

这篇文章对您有帮助吗?


您是否需要账单或技术支持?