如何使用 Lambda 整合或 Lambda 授權者疑難排解來自 API 閘道 HTTP API 的權限錯誤?

2 分的閱讀內容
0

我嘗試使用 API 閘道 HTTP API 叫用 AWS Lambda 函數時,出現「內部伺服器錯誤」訊息。我在 Amazon CloudWatch Logs 中看到「沒有呼叫整合的權限」或「沒有呼叫授權者的權限」錯誤訊息。

簡短描述

如果 API 閘道 HTTP API 嘗試在沒有 Lambda 叫用權限的情況下,叫用 Lambda 函數,則 API 閘道會傳回「內部伺服器錯誤」訊息。如果您啟動 HTTP API 的 CloudWatch 記錄,則 API 閘道也會在您的存取日誌中,記錄下列其中一個錯誤訊息:

  • 針對有 Lambda 整合的 HTTP API:「integrationError」: 「在整合或 API 閘道上設定的 IAM 角色沒有呼叫整合的權限。檢查權限,然後再試一次。」
  • 針對有 Lambda 授權者的 HTTP API:「authorizerError」: 「在授權者或 API 閘道上設定的 IAM 角色沒有呼叫授權者的權限。檢查權限,然後再試一次。」

要解決這些錯誤,執行下列其中一個動作:

使用 API 閘道主控台或 AWS Command Line Interface (AWS CLI) 以將資源式的 Lambda 叫用權限新增至您的 HTTP API。

-或-

設定 AWS 身份和存取管理 (IAM) 執行角色,以授予您的 HTTP API 權限以叫用您的函數。如需詳細資訊,請參閱叫用 API 的 API 閘道權限模型

如需在搭配 HTTP API 使用 Lambda 整合時發生錯誤的詳細資訊,請參閱疑難排解 HTTP API Lambda 整合的問題

解決方法

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

使用 API 閘道主控台,透過 Lambda 整合,將 Lambda 叫用權限新增至 HTTP API

  1. 開啟 API Gateway 主控台
  2. APIs 窗格,選擇您的 HTTP API 的名稱。
  3. 在左側導覽窗格,選擇整合
  4. 選擇管理整合
  5. 找出 Lambda 整合的名稱,然後選擇 Lambda 整合名稱旁的編輯按鈕。
  6. 針對叫用權限,選擇授予 API 閘道權限以叫用 Lambda 函數
    或者,提供 API 閘道可用來叫用 Lambda 函數的 IAM 角色 ARN
  7. 選擇儲存,然後選擇部署 API,將 Lambda 叫用權限新增至您的 API。

使用 AWS CLI,將 Lambda 叫用權限新增至具 Lambda 整合的 HTTP API

執行下列 add-permission AWS CLI 命令:

aws lambda add-permission \
--function-name "$YOUR_FUNCTION_ARN" \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/*/$METHOD/$RESOURCE" \
--principal apigateway.amazonaws.com \
--statement-id $STATEMENT_ID \
--action lambda:InvokeFunction

**注意:**使用 Lambda 函數的 ARN,取代 function-name 值。使用 API 的來源 ARN,取代 source-arn 值。使用可以區分相同政策中的陳述式的陳述式識別碼,取代 statement-id 值。

使用 API 閘道主控台,透過 Lambda 授權者將 Lambda 叫用權限新增至 HTTP API

  1. 開啟 API Gateway 主控台
  2. APIs 窗格,選擇您的 HTTP API 的名稱。
  3. 在左側導覽窗格,選擇授權
  4. 選擇管理授權
  5. 找出 Lambda 授權者的名稱,然後選擇 Lambda 授權者名稱旁的編輯按鈕。
  6. 針對叫用權限,選擇自動授予 API 閘道權限以叫用 Lambda 函數
    或者,提供 API 閘道可用來叫用 Lambda 函數的 IAM 角色 ARN
  7. 選擇儲存,然後選擇部署 API,將 Lambda 叫用權限新增至您的 API。

使用 AWS CLI,將 Lambda 叫用權限新增至具 Lambda 授權者的 HTTP API

執行下列 add-permission AWS CLI 命令:

aws lambda add-permission \
--function-name "$YOUR_FUNCTION_ARN" \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/authorizers/$AUTHORIZER_ID" \
--principal apigateway.amazonaws.com \
--statement-id $STATEMENT_ID \
--action lambda:InvokeFunction

**注意:**使用 Lambda 函數的 ARN,取代 function-name 值。使用 API 的來源 ARN,取代 source-arn 值。使用可以區分相同政策中的陳述式的陳述式識別碼,取代 statement-id 值。


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