如何解決 AWS Lambda 的 KMSAccessDeniedException 錯誤?

上次更新日期︰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 命令,以取得函數目前執行角色和 KMS 金鑰的 Amazon 資源名稱 (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 金鑰 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 政策聲明範例

重要事項:資源值必須是 "*"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": "*"
        }
    ]

此文章是否有幫助?


您是否需要帳單或技術支援?