跳至内容

如何解决 Lambda 函数的“KMS Exception”(KMS 异常)权限错误?

3 分钟阅读
0

我的 AWS Lambda 函数返回了“KMS Exception”(KMS 异常)、“You are not authorized to perform”(您无权执行)或“Access to KMS is not allowed”(不允许访问 KMS)错误。

解决方法

根据错误消息更新您的 AWS Identity and Access Management (IAM) 身份的 AWS Key Management Service (AWS KMS) 权限。如果 AWS KMS 密钥和 IAM 角色属于不同的 AWS 账户,则必须同时更新 IAM 策略和 AWS KMS 密钥策略

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

解决“KMS Exception: UnrecognizedClientExceptionKMS Message”(KMS 异常:UnrecognizedClientExceptionKMS 消息)错误

当删除 Lambda 函数的执行角色,然后使用相同的名称但使用不同的主体重新创建该角色时,将会发生以下错误:

“调用调用 API 操作失败并显示以下消息: 由于 KMS 访问被拒绝,Lambda 无法解密环境变量。请检查函数的 AWS KMS 密钥设置。KMS 异常: UnrecognizedClientExceptionKMS 消息: 请求中包含的安全令牌无效。”

要解决此错误,必须重置该函数执行角色的 AWS KMS 授权

**注意:**创建和更新 Lambda 函数的 IAM 用户必须拥有使用 AWS KMS 密钥的权限

  1. 要获取函数当前执行角色的 Amazon 资源名称 (ARN) 和 AWS KMS 密钥,请运行以下 get-function-configuration 命令:
    aws lambda get-function-configuration --function-name your-function-name
    **注意:**请将 yourFunctionName 替换为您的函数名称。
  2. 要重置 AWS KMS 授权,请执行以下操作之一:
    要将函数的执行角色更新为不同的临时值,请运行以下 update-function-configuration 命令:
    aws lambda update-function-configuration --function-name yourFunctionName --role temporaryValue
    **注意:**请将 temporaryValue 替换为临时执行角色的 ARN。
    要将函数的执行角色更新回原始执行角色,请运行以下 update-function-configuration 命令:
    aws lambda update-function-configuration --function-name yourFunctionName --role originalValue
    **注意:**请将 originalValue 替换为原始执行角色的 ARN。
    -或-
    要将函数的 AWS KMS 密钥更新为不同的临时值,请运行以下 update-function-configuration 命令:
    aws lambda update-function-configuration --function-name yourFunctionName --kms-key-arn temporaryValue
    **注意:**请将 temporaryValue 替换为临时 AWS KMS 密钥的 ARN。要使用默认服务密钥,请将 kms-key-arn 参数设置为 ""
    要将函数的 AWS KMS 密钥更新回原始 AWS KMS 密钥的 ARN,请运行以下 update-function-configuration 命令:
    aws lambda update-function-configuration --function-name yourFunctionName --kms-key-arn originalValue
    
    **注意:**请将 originalValue 替换为原始 AWS KMS 密钥的 ARN。

解决“KMS Exception: AccessDeniedException KMS Message”(KMS 异常:AccessDenieException KMS 消息)错误

以下错误表明您的 IAM 身份没有执行 kms:Decrypt API 操作所需的权限:

“由于 KMS 访问被拒绝,Lambda 无法解密您的环境变量。请检查您的 KMS 权限。KMS 异常: AccessDenieException KMS 消息: 加密文字指的是不存在、此区域不存在或者您无权访问的客户主密钥。”

要解决此错误,请向您的 IAM 用户或角色添加以下策略语句:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "your-KMS-key-arn"
        }
    ]
}

**注意:**请将 your-KMS-key-arn 替换为您的 AWS KMS 密钥的 ARN。

有关说明,请参阅向用户添加权限(控制台)

解决“You are not authorized to perform”(您无权执行)错误

以下错误表明您的 IAM 身份没有访问 AWS KMS 密钥所需的权限:

“您无权执行 kms:Encrypt。”

“您无权执行 kms:CreateGrant。”

“用户 user-arn 无权对资源 * 执行 kms:ListAliases,且存在显式拒绝。”

**注意:**如果您使用默认密钥策略,则您的 IAM 身份或函数的执行角色不需要 AWS KMS 权限。

要解决这些类型的错误,请验证您的 IAM 用户或角色是否具有执行以下 AWS KMS API 操作所需的权限:

有关说明,请参阅向用户添加权限(控制台)

授予访问客户自主管理型 AWS KMS 密钥所需权限的示例 IAM 策略语句

{
    "Version": "2012-10-17",
    "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": "*"
        }
    ]
}

**注意:**Resource(资源)值必须为 "*"kms:ListAliases 操作不支持低级权限。此外,请务必将 "your-kms-key-arn" 替换为您的 AWS KMS 密钥的 ARN。

解决“Access to KMS is not allowed”(不允许访问 KMS)错误

以下错误表明 IAM 实体没有获取 AWS Secrets Manager 密钥的权限:

“不允许访问 KMS(服务: AWSSecretsManager;状态代码: 400;错误代码: AccessDeniedException;请求 ID: 123a4bcd-56e7-89fg-hij0-1kl2m3456n78)”

确保您的 IAM 用户或角色具有执行以下 AWS KMS API 操作所需的权限:

有关详细信息,请参阅在我尝试检索加密的 Secrets Manager 密钥后,如何解决 AWS KMS 密钥访问错误?

相关信息

如何对来自 AWS Lambda 的 HTTP 502 和 HTTP 500 状态代码(服务器端)错误进行故障排除?

如何排查 Lambda 函数故障?

AWS 官方已更新 8 个月前