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 呼び出しアクセス許可を追加する
次の手順を実行します。
- API Gateway コンソールを開きます。
- [API] ペインで、REST API の名前を選択します。
- [リソース] ペインで、設定されている HTTP メソッドを選択します。
- [メソッド実行] ペインで、[統合リクエスト] を選択します。
- [統合タイプ] で、[Lambda 関数] を選択します。
- [Lambda リージョン] のドロップダウンリストを展開します。次に、Lambda 関数が置かれている AWS リージョンを選択します。
- [Lambda 関数] ドロップダウンリストを選択します。次に、Lambda 関数の名前を選択します。
- [保存] を選択します。次に、[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 呼び出しアクセス許可を追加する
次の手順を実行します。
- lambda:InvokeFunction アクションを許可する、API ゲートウェイ用の IAM ロールを作成します。次に、IAM ロールの ARN をクリップボードにコピーします。
- API Gateway コンソールを開きます。
- [API] ペインで、REST API の名前を選択します。
- [オーソライザー] ペインで、設定した Lambda オーソライザーを選択します。次に、[編集] を選択します。
- [Lambda 呼び出しロール] には、クリップボードにコピーした IAM ロールの ARN を入力します。
- [保存] を選択します。次に、[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 のアクセスログを設定する方法を教えてください