API Gateway REST API で発生する、Lambda 関数のアクセス許可が無効というエラーを解決する方法を教えてください。

所要時間3分
0

Amazon API Gateway REST API から AWS Lambda 関数を呼び出すと、「Lambda 関数へのアクセス許可が無効です」というエラーが表示されます。

簡単な説明

Lambda 呼び出しアクセス許可のない API Gateway REST API が Lambda 関数を呼び出すと、API Gateway は「Lambda 関数へのアクセス許可が無効です」というエラーを返します。

REST API に CloudWatch ログ記録を設定すると、API ゲートウェイは次のいずれかのエラーメッセージも記録します。

  • Lambda 統合を使用した REST API での、CloudWatch エラーメッセージの例
    " にリクエストを送信中
    設定エラーにより実行に失敗しました。 Lambda 関数へのアクセス許可が無効です
    メソッドはステータス: 500 で完了しました"
  • Lambda オーソライザーを使用した REST API での、CloudWatch エラーメッセージの例
    " にリクエストを送信中
    設定エラーにより実行に失敗しました。 Lambda 関数へのアクセス許可が無効です
    設定エラーにより実行に失敗しました。 オーソライザーエラー"

解決策

これらのエラーを解決するには、次のいずれかを実行してください。

詳細については、「API を呼び出すための API Gateway アクセス許可モデル」を参照してください。

注: 401 Unauthorized エラーが発生した場合は、「Lambda オーソライザーを作成した後に API Gateway で "401 Unauthorized" エラーが発生する理由を知りたいです」の手順に従ってください。

Lambda 統合エラーの解決

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

次の手順を実行します。

  1. API Gateway コンソールを開きます。
  2. [API] ペインで、REST API の名前を選択します。
  3. [リソース] ペインで、設定されている HTTP メソッドを選択します。
  4. [メソッド実行] ペインで、[統合リクエスト] を選択します。
  5. [統合タイプ] で、[Lambda 関数] を選択します。
  6. [Lambda リージョン] のドロップダウンリストを展開します。次に、Lambda 関数が置かれている AWS リージョンを選択します。
  7. [Lambda 関数] ドロップダウンリストを選択します。次に、Lambda 関数の名前を選択します。
  8. [保存] を選択します。次に、[API をデプロイ] を選択し、API に Lambda 呼び出しアクセス許可を追加します。

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

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 リソースネーム (ARN) に置き換えます
SourceArn 値において、example-api-id を実際の apiID に置き換えます

複数の CloudFormation テンプレートパーツを宣言する方法について詳しくは、「テンプレートスニペット」を参照してください。

AWS CLI 経由で、Lambda 統合を使用して REST API に Lambda 呼び出しアクセス許可を追加する

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

次の 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

注: 上記のコマンドで、次の内容を置き換えます。
function-name 値は、お使いの Lambda 関数の名前で置き換えます
source-arn 値は、お使いの API の ソース ARN に置き換えます
statement-id 値は、ステートメントを一意に識別するステートメント識別子に置き換えます

Lambda オーソライザーのエラーを解決する

API Gateway コンソール経由で、Lambda オーソライザーを使用して REST API に Lambda 呼び出しアクセス許可を追加する

次の手順を実行します。

  1. lambda:InvokeFunction アクションを許可する、API ゲートウェイ用の IAM ロールを作成します。次に、IAM ロールの ARN をクリップボードにコピーします。
  2. API Gateway コンソールを開きます。
  3. [API] ペインで、REST API の名前を選択します。
  4. [オーソライザー] ペインで、設定した Lambda オーソライザーを選択します。次に、[編集] を選択します。
  5. [Lambda 呼び出しロール] には、クリップボードにコピーした IAM ロールの ARN を入力します。
  6. [保存] を選択します。次に、[API をデプロイ] を選択します。

CloudFormation テンプレート経由で、Lambda オーソライザーを使用して REST API に Lambda 呼び出しアクセス許可を追加する

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 関数の名前で置き換えます
SourceArn 値において、example-api-id を実際の apiID に置き換えます
SourceArn 値において、example-auth-id をお使いの Lambda オーソライザーの authorizerId に置き換えます

AWS CLI 経由で、Lambda オーソライザーを使用して REST API に Lambda 呼び出しアクセス許可を追加する

次の 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

注: 上記のコマンドで、次の内容を置き換えます。
function-name 値は、お使いの Lambda 関数の名前で置き換えます
source-arn 値は、お使いの API の ソース ARN に置き換えます
statement-id 値は、ステートメントを一意に識別するステートメント識別子に置き換えます

関連情報

Lambda で、リソースベースの IAM ポリシーを使用する

API Gateway のアクセスログを設定する方法を教えてください

コメントはありません

関連するコンテンツ