如何解決 API Gateway REST API 的「Lambda 函數的權限無效」錯誤?
當我從 Amazon API Gateway REST API 調用 AWS Lambda 函數時,我收到「Lambda 函數的權限無效」錯誤訊息。
簡短說明
如果您的 API Gateway REST API 在沒有 Lambda 調用許可的情況下調用 Lambda 函數,則 API Gateway 會傳回錯誤「Lambda 函數的權限無效」。
如果您為 REST API 設定 CloudWatch 記錄,則 API Gateway 也會記錄下列其中一則錯誤訊息:
- Lambda 整合 REST API 的 CloudWatch 錯誤訊息範例:
「正在傳送請求到 https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
執行因組態錯誤失敗: Lambda 函數的許可無效
方法已完成,狀態碼為: 500」 - Lambda 授權者 REST API 的 CloudWatch 錯誤訊息範例:
「正在傳送請求到 https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
執行因組態錯誤失敗: Lambda 函數的許可無效
執行因組態錯誤失敗: 授權者錯誤」
解決方法
若要解決這些錯誤,請執行下列其中一個動作:
- 透過本文所述的其中一種方法,將資源型 Lambda 調用權限新增至您的 REST API。
- 設定 AWS Identity and Access Management (IAM) 執行角色,以便向您的 REST API 授予函數調用權限。
如需詳細資訊,請參閱用於調用 API 的 API Gateway 權限模型。
注意: 如果您收到 401 未經授權錯誤,請按照為什麼在建立 Lambda 授權者之後會收到 API Gateway「401 未授權」錯誤?的說明進行操作。
解決 Lambda 整合錯誤
使用 API Gateway 主控台,透過 Lambda 整合將 Lambda 調用權限新增至 REST API
完成下列步驟:
- 開啟 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) 以將 Lambda 調用權限新增至您的 API。
透過 CloudFormation 範本,使用 Lambda 整合將 Lambda 調用權限新增至 REST API
請將下列程式碼片段新增至您的 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"
注意: 取代上一個樣板中的以下內容:
以 Lambda 函數名稱取代 FunctionName 值
以 API 來源 Amazon Resource Name (ARN) 取代 SourceArn 值
在 SourceArn 值中,以您的 apiID 取代 example-api-id
如需有關如何宣告各種 CloudFormation 範本元件的詳細資訊,請參閱範本程式碼片段。
透過 AWS CLI,使用 Lambda 整合將 Lambda 調用權限新增至 REST API
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
執行下列 add-permission AWS CLI 命令:
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
注意: 取代上一個命令中的以下內容:
以 Lambda 函數名稱取代 function-name 值
以 API 的來源 ARN 取代 source-arn 值
以可唯一識別陳述式的陳述式識別碼,取代 statement-id 值
解決 Lambda 授權者錯誤
透過 API Gateway 主控台,使用 Lambda 授權者將 Lambda 調用權限新增至 REST API
完成下列步驟:
- 建立 API Gateway 的 IAM 角色並允許 lambda:InvokeFunction 動作。然後,將 IAM 角色 ARN 複製到剪貼簿。
- 開啟 API Gateway console (API Gateway 主控台)。
- 在 API 窗格中,選擇 REST API 的名稱。
- 在 Authorizers (授權者) 窗格中,選擇已設定的 Lambda 授權者。然後,選擇 Edit (編輯)。
- 對於 Lambda Invoke Role (Lambda 調用角色),請輸入您複製到剪貼簿的 IAM 角色 ARN。
- 選擇 Save (儲存)。然後選擇 Deploy the API (部署 API)。
透過 CloudFormation 範本,使用 Lambda 授權者將 Lambda 調用權限新增至 REST API
請將下列程式碼片段新增至您的 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"
注意: 取代上一個樣板中的以下內容:
以 Lambda 函數名稱取代 FunctionName 值
在 SourceArn 值中,以您的 apiID 取代 example-api-id
在 SourceArn 值中,以您的 Lambda 授權者 authorizerId 取代 example-auth-id
透過 AWS CLI,使用 Lambda 授權者將 Lambda 調用權限新增至 REST API
執行下列 add-permission AWS CLI 命令:
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
注意: 取代上一個命令中的以下內容:
以 Lambda 函數名稱取代 function-name 值
以 API 的來源 ARN 取代 source-arn 值
以可唯一識別陳述式的陳述式識別碼,取代 statement-id 值
相關資訊
相關內容
- 已提問 4 個月前lg...
- 已提問 7 個月前lg...
- 已提問 7 個月前lg...
- AWS 官方已更新 7 個月前
- AWS 官方已更新 2 個月前
- AWS 官方已更新 4 年前