如何解决来自 AWS Lambda 的“KMSAccessDeniedException”错误?

3 分钟阅读
0

我的 AWS Lambda 函数返回“KMSAccessDeniedException”错误。

简短描述

根据错误消息更新 AWS Identity and Access Management(IAM)身份的 AWS Key Management Service(AWS KMS)权限

重要提示:如果 AWS KMS 密钥和 IAM 角色属于不同的 AWS 账户,则必须更新 IAM 策略和 AWS KMS 密钥策略

有关 AWS KMS 密钥和策略管理的更多信息,请参阅 AWS KMS 密钥

解决方案

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

解决“KMS Exception: UnrecognizedClientExceptionKMS Message”错误

以下错误通常在以下情况下发生:当删除 Lambda 函数的执行角色,然后再使用相同名称和不同委托人重新创建时

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 AWS KMS key settings. KMS Exception: UnrecognizedClientExceptionKMS Message: The security token included in the request is invalid.

要解决该错误,您必须通过执行以下操作为函数的执行角色重置 AWS KMS 授权

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

1.    通过运行以下 AWS CLI 命令获取函数当前执行角色的 Amazon Resource Name(ARN)和 AWS KMS 密钥:

**注意:**将 yourFunctionName 替换为函数的名称。

$ 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 替换为临时 AWS KMS 密钥 ARN。要使用默认服务密钥,请将 kms-key-arn 参数设为 ""

$ aws lambda update-function-configuration --function-name yourFunctionName --kms-key-arn temporaryValue

然后,通过运行以下命令将函数的 AWS KMS 密钥更新回原始 AWS KMS 密钥的 ARN:

**重要提示:**请将 originalValue 替换为原始 AWS 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" 替换为 AWS 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 身份没有访问 AWS 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 身份或函数的执行角色无需 AWS KMS 权限。

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

有关说明,请根据您的使用案例参阅向用户添加权限(控制台)修改角色权限策略(控制台)

用于授予访问客户托管 AWS KMS 密钥所需权限的示例 IAM 策略语句

**重要提示:**Resource 值必须为 "*"kms:ListAliases 操作不支持低级别权限。另外,请确保将 "your-kms-key-arn" 替换为 AWS KMS 密钥 ARN。

{
  "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": "*"
    }
  ]
}

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

以下错误表明 IAM 实体无权获取 AWS Secrets Manager 密钥:

Access to KMS is not allowed (Service: AWSSecretsManager; Status Code: 400; Error Code: AccessDeniedException; Request ID: 123a4bcd-56e7-89fg-hij0-1kl2m3456n78)

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

有关更多信息,请参阅如何解决访问加密的 AWS Secrets Manager 密钥时遇到的问题?


相关信息

在 AWS Lambda 返回 HTTP 502 和 HTTP 500 状态代码(服务器端)时如何进行问题排查?

如何排查 Lambda 函数的故障?

AWS 官方
AWS 官方已更新 1 年前