如何解決 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.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 函數的許可無效
    執行因組態錯誤失敗: 授權者錯誤」

解決方法

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

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

注意: 如果您收到 401 未經授權錯誤,請按照為什麼在建立 Lambda 授權者之後會收到 API Gateway「401 未授權」錯誤?的說明進行操作。

解決 Lambda 整合錯誤

使用 API Gateway 主控台,透過 Lambda 整合將 Lambda 調用權限新增至 REST API

完成下列步驟:

  1. 開啟 API Gateway console (API Gateway 主控台)。
  2. API 窗格中,選擇 REST API 的名稱。
  3. Resources (資源) 窗格中,選擇已設定的 HTTP 方法。
  4. Method Execution (方法執行) 窗格中,選擇 Integration Request (整合請求)。
  5. 對於 Integration type (整合類型),請選擇 Lambda Function (Lambda 函數)。
  6. 展開 Lambda Region (Lambda 區域) 下拉式清單。然後,選擇 Lambda 函數所在的 AWS 區域。
  7. 選擇 Lambda Function (Lambda 函數) 下拉式清單。然後,選擇 Lambda 函數的名稱。
  8. 選擇 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

完成下列步驟:

  1. 建立 API Gateway 的 IAM 角色並允許 lambda:InvokeFunction 動作。然後,將 IAM 角色 ARN 複製到剪貼簿。
  2. 開啟 API Gateway console (API Gateway 主控台)。
  3. API 窗格中,選擇 REST API 的名稱。
  4. Authorizers (授權者) 窗格中,選擇已設定的 Lambda 授權者。然後,選擇 Edit (編輯)。
  5. 對於 Lambda Invoke Role (Lambda 調用角色),請輸入您複製到剪貼簿的 IAM 角色 ARN。
  6. 選擇 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

相關資訊

在 Lambda 中使用資源型的 IAM 政策

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