我嘗試使用 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
- 開啟 API Gateway 主控台。
- 在 APIs 窗格,選擇您的 HTTP API 的名稱。
- 在左側導覽窗格,選擇整合。
- 選擇管理整合。
- 找出 Lambda 整合的名稱,然後選擇 Lambda 整合名稱旁的編輯按鈕。
- 針對叫用權限,選擇授予 API 閘道權限以叫用 Lambda 函數。
或者,提供 API 閘道可用來叫用 Lambda 函數的 IAM 角色 ARN。
- 選擇儲存,然後選擇部署 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
- 開啟 API Gateway 主控台。
- 在 APIs 窗格,選擇您的 HTTP API 的名稱。
- 在左側導覽窗格,選擇授權。
- 選擇管理授權。
- 找出 Lambda 授權者的名稱,然後選擇 Lambda 授權者名稱旁的編輯按鈕。
- 針對叫用權限,選擇自動授予 API 閘道權限以叫用 Lambda 函數。
或者,提供 API 閘道可用來叫用 Lambda 函數的 IAM 角色 ARN。
- 選擇儲存,然後選擇部署 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 值。