如何解決 AWS Lambda 中的「KMSAccessDeniedException」錯誤?

3 分的閱讀內容
0

我的 AWS Lambda 函數傳回了「KMSAccessDeniedException」錯誤。

簡短描述

根據錯誤訊息更新您的 AWS Identity and Access Management (IAM) 身分的 AWS Key Management Service (KMS) 權限

**重要:**如果 AWS KMS key 和 IAM 角色屬於不同的 AWS 帳戶,則必須同時更新 IAM 政策和 AWS KMS key 政策。

如需有關 AWS KMS key 和政策管理的詳細資訊,請參閱 AWS KMS keys

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您使用的是最新的 AWS CLI 版本

若要解決「KMS 例外狀況: UnrecognizedClientExceptionKMS 訊息」錯誤

當 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 key 的權限

1.    執行下列 AWS CLI 命令,取得函數目前執行角色的 Amazon 資源名稱 (ARN) 和 AWS KMS key:

**注意:**將 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 key 更新為不同的暫存值:

**重要:**將 temporaryValue 替換為臨時 AWS KMS key ARN。若要使用預設服務金鑰,請將 kms-key-arn 參數設為 ""

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

然後透過執行下列命令,將函數的 AWS KMS key 更新回原始 AWS KMS key:

**重要:**將 originalValue 替換為原始 AWS KMS key ARN。

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

如需詳細資訊,請參閱 AWS KMS 中的金鑰政策

若要解決「KMS 例外狀況: AccessDeniedException KMS 訊息」錯誤

以下錯誤表示您的 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 key ARN。

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

如需指示,請參閱根據您的使用案例,為使用者新增權限 (主控台)修改角色權限政策 (主控台)

若要解決「您無權執行」錯誤

以下錯誤表示您的 IAM 身分沒有存取 AWS KMS key 所需的權限:

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 key 所需權限的 IAM 政策陳述式範例

重要:****資源值必須為 "*"kms:ListAliases 動作不支援低階權限。另外,請確認將 "your-kms-key-arn" 替換為您的 AWS KMS key 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": "*"
    }
  ]
}

若要解決「不允許存取 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 官方已更新 2 年前