如何解決 API Gateway REST API 的「Lambda 函數的許可無效」錯誤?

3 分的閱讀內容
0

當我使用 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.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations
執行因組態錯誤失敗: Lambda 函數的許可無效
方法已完成,狀態碼為: 500」

Lambda 授權者 REST API 的 CloudWatch 錯誤訊息範例

「正在傳送請求到 https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xxx:function:xx/invocations
執行因組態錯誤失敗: Lambda 函數的許可無效
執行因組態錯誤失敗: 授權者錯誤」

解決方法

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

使用本文所述的其中一種方法,將資源型 Lambda 調用許可新增至您的 REST API。

設定 AWS Identity and Access Management (IAM) 執行角色,以便向您的 REST API 授予函數調用許可。

如需詳細資訊,請參閱用於調用 API 的 API Gateway 許可模型

注意:

若要使用 API Gateway 主控台,透過 Lambda 整合將 Lambda 調用許可新增至 REST API

1.    在 API Gateway 主控台API 窗格中,選擇 REST API 名稱。

2.    在資源窗格中,選擇已設定的 HTTP 方法。

3.    在方法執行窗格中,選擇整合請求

4.    對於整合類型,請選擇 Lambda 函數

5.    展開 Lambda 區域下拉式清單。然後,選擇 Lambda 函數所在的 AWS 區域。

6.    選擇 Lambda 函數下拉式清單。然後,選擇 Lambda 函數的名稱。

7.    此時將顯示一則提示,讓您可以選擇新增 Lambda 函數的許可。選擇確定

8.    選擇儲存。然後,選擇部署 API 以將 Lambda 調用許可新增至您的 API。

若要使用 CloudFormation 範本,透過 Lambda 整合將 Lambda 調用許可新增至 REST API

請將下列程式碼片段新增至您的 CloudFormation 範本

**重要事項:**請將 <api-id> 替換為您的 apiID。請以 Lambda 函數名稱取代 FunctionName 值。請以 API 來源 Amazon Resource Name (ARN) 取代 SourceArn 值。

SampleApiPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !Ref MyLambdaFnA1
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/*/<method>/<resource>"

如需有關如何宣告各種 CloudFormation 範本元件的詳細資訊,請參閱範本程式碼片段

若要使用 AWS CLI,透過 Lambda 整合將 Lambda 調用許可新增至 REST API

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

**重要事項:**請以 Lambda 函數名稱取代 function-name 值。請以 API 的來源 ARN 取代 source-arn 值。請使用可區分相同政策中陳述式的陳述式識別符,取代 statement-id 值。

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

若要使用 API Gateway 主控台,透過 Lambda 授權者將 Lambda 調用許可新增至 REST API

1.    建立 API Gateway 的 IAM 角色並允許 "lambda:InvokeFunction" 動作。然後,將 IAM 角色 ARN 複製到剪貼簿。

2.    在 API Gateway 主控台API 窗格中,選擇 REST API 名稱。

3.    在授權者窗格中,選擇已設定的 Lambda 授權者。然後,選擇編輯

4.    對於 Lambda 調用角色,請輸入您複製到剪貼簿的 IAM 角色 ARN。

5.    選擇儲存。然後選擇部署 API

若要使用 CloudFormation 範本,透過 Lambda 授權者將 Lambda 調用許可新增至 REST API

請將下列程式碼片段新增至您的 CloudFormation 範本

**重要事項:**請將 <api-id> 替換為您的 apiID。請以 Lambda 函數名稱取代 FunctionName 值。請將 <auth-id> 替換為 Lambda 授權者的 authorizerId

SampleApiAuthPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !Ref MyLambdaFnA1
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/authorizers/<auth-id>"

如需有關如何宣告各種 CloudFormation 範本元件的詳細資訊,請參閱範本程式碼片段

若要使用 AWS CLI,透過 Lambda 授權者將 Lambda 調用許可新增至 REST API

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

**重要事項:**請以 Lambda 函數名稱取代 function-name 值。請以 API 的來源 ARN 取代 source-arn 值。請使用可區分相同政策中陳述式的陳述式識別符,取代 statement-id 值。

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 使用資源型政策

如何設定 API Gateway 的存取記錄?