Amazon API Gateway REST API から AWS Lambda 関数を呼び出すと、「Invalid permissions on Lambda function (Lambda 関数へのアクセス許可が無効です)」というエラーが発生するため、解決したいです。
簡単な説明
アクセス許可が欠けた状態で API Gateway REST API が Lambda 関数を呼び出すと、「Invalid permissions on Lambda function (Lambda 関数へのアクセス許可が無効です)」というエラーが発生します。
REST API に CloudWatch ログを設定した場合、API Gateway は Lambda 統合を使用する REST API に関する次のエラーメッセージもログに記録します。
「Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
設定エラーにより実行に失敗しました。 Lambda 関数へのアクセス許可が無効です
Method completed with status: 500 (ステータス 500 が発生し、メソッドは終了しました)」
Lambda オーソライザーを使用する REST API では、次のエラーメッセージが表示されます。
「Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
設定エラーにより実行に失敗しました。 Lambda 関数へのアクセス許可が無効です
Execution failed due to configuration error: (構成エラーにより実行に失敗しました) Authorizer error」
この問題を解決するには、Lambda のInvoke (呼び出し) 許可を REST API に追加する必要があります。
注: 「401 Unauthorized」 エラーが発生した場合は、「Lambda オーソライザーを作成した後に API Gateway で "401 Unauthorized" エラーが発生する理由を知りたいです」を参照してください。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Lambda 統合を使用する REST API に Lambda Invoke 許可を追加する
Invoke 許可の追加には、API Gateway コンソール、AWS CloudFormation テンプレート、または AWS CLI を使用できます。
注: 次のシナリオでは、以下のエラーが発生する場合もあります。「Execution failed due to configuration error: (構成エラーにより実行に失敗しました) Invalid permissions on Lambda function (Lambda 関数へのアクセス許可が無効です) Method completed with status: 500」
- API Gateway のテストコンソールから API Gateway を呼び出そうとした場合。
- 呼び出し URL で指定したステージとは異なるステージから API Gateway を呼び出した場合。
この問題を防ぐには、CloudFormation テンプレートと AWS CLI コマンドでは、ステージ名にワイルドカード (*) を使用してください。
API Gateway コンソールを使用する
次の手順を実行します。
- API Gateway コンソールを開きます。
- ナビゲーションペインで [API] を選択し、該当する REST API を選択します。
- [リソース] を選択し、HTTP メソッドを選択します。
- [メソッドの実行] を選択し、[統合リクエスト] を選択します。
- [統合タイプ] で [Lambda 関数] を選択します。
- [Lambda リージョン] のドロップダウンリストを展開し、Lambda 関数を配置した AWS リージョンを選択します。
- [Lambda 関数] のドロップダウンリストを選択し、該当する Lambda 関数を選択します。
- [保存] を選択します。
- [API をデプロイ] を選択します。
CloudFormation テンプレートを使用する
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) に、example-api-id を API ID に置き換えてください。
詳細については、「CloudFormation テンプレートスニペット」を参照してください。
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
注: 実際のものでそれぞれ、FUNCITON_NAME を Lambda 関数名に、ソースの ARN 例を API の ARN に、STATEMENT_ID をステートメントを一意に識別するステートメント識別子に置き換えてください。
特定のステージにのみアクセス許可を付与するには、次のコマンドを実行します。
--source-arn "arn:aws:execute-api:API_GW_REGION:YOUR_ACCOUNT:API_GW_ID/STAGE_NAME/METHOD/RESOURCE"
注: ソースの ARN 例を API の ARN に、STAGE_NAME をステージ名に置き換えてください。
Lambda オーソライザーを使用して REST API に Lambda 呼び出し許可を追加する
Invoke 許可の追加には、API Gateway コンソール、CloudFormation テンプレート、または AWS CLI コマンドを使用できます。
API Gateway コンソールを使用する
次の手順を実行します。
- API Gateway の IAM ロールを作成してから、lambda:InvokeFunction アクションを許可するポリシーを作成します。
注: 後のステップで使用するために、IAM ロールの ARN を書き留めてください。ポリシーの例については、「API 呼び出し用の API Gateway アクセス許可モデル」を参照してください。
- API Gateway コンソールを開きます。
- ナビゲーションペインで [API] を選択し、該当する REST API を選択します。
- [オーソライザー] を選択し、Lambda オーソライザーを選択します。
- [編集] を選択します。
- [Lambda 呼び出しロール] に IAM ロールの ARN を入力します。
- [保存] を選択します。
- [API をデプロイ] を選択します。
CloudFormation テンプレートを使用する
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 関数名に、example-api-id を API ID に、example-auth-id を Lambda オーソライザー ID に置き換えてください。
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
注: 実際のものでそれぞれ、FUNCITON_NAME を Lambda 関数名に、ソースの ARN 例を API の ARN に、STATEMENT_ID をステートメントを一意に識別するステートメント識別子に置き換えてください。
関連情報
Lambda でのリソースベースの IAM ポリシーを確認する
API Gateway でアクセスログを設定する方法を教えてください