API Gateway REST API から「Lambda 関数の無効なアクセス許可」エラーをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2021 年 5 月 26 日

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 に追加します。

- または -

関数を呼びだすアクセス権限を REST API に付与する AWS Identity and Access Management (IAM) 実行ロールを設定します

詳細については、 API を呼びだすための API Gateway アクセス権限モデルをご参照ください。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

API Gateway コンソールを使用して Lambda 統合で REST API に Lambda 呼び出しアクセス許可を追加するには

1.    API Gateway コンソールの [API] ペインで、作成した API の名前を選択します。

2.    [Resources] ( リソース ) ペインで、構成済みの HTTP メソッドを選択します。

3.    [Method Execution ( メソッドの実行 )] ペインで、[Integration Request ( 統合リクエスト )] を選択します。

4.    [統合タイプ] で、[Lambda 関数] を選択します。

5.    [Lambda リージョン] ドロップダウンリストを展開します。次に、Lambda 関数がある AWS リージョンを選択します。

6.    [Lambda 関数] ドロップダウンリストを選択します。次に、Lambda 関数の名前を選択します。

7.    Lambda 関数にアクセス許可を追加するオプションを提供するプロンプトが表示されます 。[OK] を選択します。

8.    [Save] (保存) を選択します。次に、[API をデプロイ] を選択して、Lambda 呼び出しアクセス許可を API に追加します。

CloudFormation テンプレートを使用して Lambda 統合で REST API に Lambda 呼び出しアクセス許可を追加するためには

CloudFormation テンプレートに次のコードスニペットを追加します。

重要: <api-id>をお使いの ApiID に置き換えてください。FunctionName の値を Lambda 関数の名前に置き換えます。SourceArn の値を API のソース Amazon リソースネーム (ARN) に置き換えます。

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 統合で REST API に Lambda 呼び出しアクセス許可を追加するには

次のアクセス許可が追加された AWS CLI コマンドを実行します。

重要:関数名の値を Lambda 関数の名前に置き換えてください。Source-arn 値を API のソース 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.    「lambda:InvokeFunction」アクションを許可する API Gateway の IAM ロールを作成します次に、IAM ロール ARN をクリップボードにコピーします。

2.    API Gateway コンソールの [API] ペインで、作成した API の名前を選択します。

3.    [認証者] ペインで、設定された Lambda 認証を選択します。次に、[編集] を選択します。

4.    [Lambda 呼び出しロール] で、クリップボードにコピーした IAM ロール ARN を入力します。

5.    [Save] (保存) を選択します。次に、[API をデプロイ] を選択します。

CloudFormation テンプレートを使用して 、Lambda 認証を使って Lambda 呼び出しアクセス許可を REST API に追加するには

CloudFormation テンプレートに次のコードスニペットを追加します。

重要: お使いの ApiID <api-id> に置き換えてください。FunctionName の値を Lambda 関数の名前に置き換えます。Lambda 認証の authorizerID <auth-id> に置き換えてください。

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 に追加するには

次のアクセス許可が追加された AWS CLI コマンドを実行します。

重要:関数名の値を Lambda 関数の名前に置き換えてください。Source-arn 値を API のソース 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

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?