如何解決從 API Gateway REST API 收到的「Lambda 函式的權限無效」錯誤?
我想解決從 Amazon API Gateway REST API 調用 AWS Lambda 函式時,出現的「Lambda 函式的權限無效」錯誤。
簡短描述
當您的 API Gateway REST API 未經許可調用 Lambda 函式時,您會收到「Lambda 函式的權限無效」錯誤。
如果您為 REST API 設定 CloudWatch 記錄,則 API Gateway 也會透過 Lambda 整合為 REST API 記錄下列錯誤訊息:
「Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
執行因組態錯誤失敗: Lambda 函數的許可無效
Method completed with status: 500」。
對於使用 Lambda Authorizer 的 REST API,您會收到以下錯誤訊息:
「Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
執行因組態錯誤失敗: Lambda 函數的許可無效
Execution failed due to configuration error: Authorizer error」。
若要解決此問題,您必須向 REST API 新增 Lambda 調用權限。
**注意:**如果您收到「401 未授權」錯誤,請參閱為什麼我在建立 Lambda Authorizer 後收到 API 閘道「401 未授權」錯誤?
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
使用 Lambda 整合向 REST API 新增 Lambda 調用權限
您可以使用 API Gateway 主控台、AWS CloudFormation 範本或 AWS CLI 來新增調用權限。
**注意:**您也可能在下列情況下收到「Execution failed due to configuration error: Invalid permissions on Lambda function Method completed with status: 500」錯誤訊息:
- 您嘗試從 API 閘道測試主控台調用 API 閘道。
- 您從一個階段調用 API Gateway,但該階段與您在調用 URL 中指定的階段不同。
若要防止此問題,請在 CloudFormation 範本和 AWS CLI 命令中對階段名稱使用萬用字元 (*)。
使用 API Gateway 主控台
請完成下列步驟:
- 開啟 API Gateway console (API Gateway 主控台)。
- 在導覽窗格中,選擇 API,然後選取您的 REST API。
- 選擇 Resources (資源),然後選取 HTTP 方法。
- 選擇 Method Execution (方法執行) 中,然後選擇 Integration request (整合請求)。
- 在 Integration type (整合類型),選擇 Lambda function (Lambda 函式)。
- 展開 Lambda Region (Lambda 區域) 下拉式清單,然後選擇您 Lambda 函式所在的 AWS 區域。
- 選擇 Lambda function (Lambda 函式) 下拉式清單,然後選取您的 Lambda 函式。
- 選擇 Save (儲存)。
- 選擇 Deploy the API (部署 API)。
使用 CloudFormation 範本
將以下程式碼片段新增至您的 CloudFormation 範本:
SampleApiPermission: Type: AWS::Lambda::Permission Properties: Action: "lambda:InvokeFunction" FunctionName: !Ref ExampleLambdaFunction Principal: "apigateway.amazonaws.com" SourceArn: !Sub "arn:aws:execute-api:{AWS::Region}:{AWS::AccountId}:example-api-id/*/example-method/example-resource"
**注意:**將 FunctionName 替換為您 Lambda 函式的名稱,將 SourceArn 替換為您的 API Amazon Resource Name (ARN),並將 example-api-id 替換為您的 API ID。
如需詳細資訊,請參閱 CloudFormation 範本片段。
使用 AWS CLI
執行以下 add-permission 命令:
aws lambda add-permission \--function-name "FUNCTION_NAME" \ --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
**注意:**將 FUNCITON_NAME 替換為您 Lambda 函式的名稱,將範例來源 ARN 替換為您的 API ARN,並將 STATEMENT_ID 替換為唯一標識該陳述式的陳述式識別碼。
若要僅為特定階段提供權限,請執行下列命令:
--source-arn "arn:aws:execute-api:API_GW_REGION:YOUR_ACCOUNT:API_GW_ID/STAGE_NAME/METHOD/RESOURCE"
**注意:**將範例來源 ARN 替換為您的 API ARN,並將 STAGE_NAME 替換為您的階段名稱。
使用 Lambda Authorizer 向 REST API 新增 Lambda 調用權限
您可以使用 API Gateway 主控台、CloudFormation 範本或 AWS CLI 命令來新增調用權限。
使用 API Gateway 主控台
請完成下列步驟:
- 為 API 閘道建立 IAM 角色,然後建立允許 lambda:InvokeFunction 動作的政策。
**注意:**請記下 IAM 角色 ARN,以便在後續步驟中使用。有關範例政策,請參閱用於調用 API 的 API 閘道權限模型。 - 開啟 API Gateway console (API Gateway 主控台)。
- 在導覽窗格中,選擇 API,然後選取您的 REST API。
- 選擇 Authorizers (授權者),然後選取 Lambda Authorizer。
- 選擇 Edit (編輯)。
- 在 Lambda 調用角色,輸入 IAM 角色 ARN。
- 選擇 Save (儲存)。
- 選擇 Deploy the API (部署 API)。
使用 CloudFormation 範本
將以下程式碼片段新增至您的 CloudFormation 範本:
SampleApiAuthPermission: Type: AWS::Lambda::Permission Properties: Action: "lambda:InvokeFunction" FunctionName: !Ref ExampleLambdaFunction Principal: "apigateway.amazonaws.com" SourceArn: !Sub "arn:aws:execute-api:{AWS::Region}:{AWS::AccountId}:example-api-id/authorizers/example-auth-id"
**注意:**將 FunctionName 替換為您 Lambda 函式的名稱,將 example-api-id 替換為您的 API ID,並將 example-auth-id 替換為您的 Lambda Authorizer ID。
使用 AWS CLI
執行以下 add-permission 命令:
aws lambda add-permission \--function-name "FUNCTION_NAME" \ --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
**注意:**將 FUNCITON_NAME 替換為您 Lambda 函式的名稱,將範例來源 ARN 替換為您的 API ARN,並將 STATEMENT_ID 替換為唯一標識該陳述式的陳述式識別碼。

