ここでは、CloudFormationを使ってAPI Gatewayを設置した時に発生したエラーについて紹介します。なぜ、解決したのか納得はしていないのですが、一応、解決できなので、メモとして残しておきます。
エラーが起こった状況について
まず、CloudFormationでLambdaをキックするAPI Gatewayを作成しました。API Gatewayを含む必要なコンポーネントの作成自体にはエラーが発生しませんでした。作成したコンポーネントは、Lambda用IAM、Lambda関数、API Gateway一式(RestAPI、Resource、Method)、Lambdaをinvokeするためのpermissionです。
しかし、作成したMethodをAPI GatewayのWebコンソールからたどれるテスト実行の画面で実行したところ、次のようなエラーメッセージが表示されました。
簡単にいうと、API GatewayからLambda関数へアクセスできず、HTTP 403のレスポンス(Access Denied)が返ってきました。当初は、permissionの設定だろうと思い、色々と調べて複数のサイトを比較して作成したのですが、同じように設定してもエラーが発生し続けました。
エラーの原因と対処法
今回のエラーの原因は、API GatewayからHTTP GETリクエストによるLambda関数の実行は、許可されていないことでした。それは、ここやここ、ここに書かれており、実際にAWS::ApiGateway::Methodで定義していたHttpMethodの値と、Integrationの子要素であるIntegrationHttpMethodの値をGETからPOSTに変更することで、問題が発生しなくなりました。
納得いっていない点
ただ、一点、納得いっていない点があります。それは、Webコンソールを使って、API Gatewayが呼び出すLambda関数を再設定し、再設定の時に表示されるここのページにある「Lambda関数に権限を追加する」ダイアログでアクセス権を再設定するとGETリクエストであっても、アクセス拒否されなくなるという点です。
すなわち、CloudFormationから設定するとGETリクエストが設定できないが、Webコンソールから設定すると、GETリクエストでも設定できる点が理由がわかっていない点です。今後、その理由がわかれば、更新します。
参考サイト
- AWS::Lambda::Permissionの設定例1
- AWS::Lambda::Permissionの設定例2
- AWS::Lambda::Permissionの設定例3
- CloudFormationでのLambda-APIGateway連携のスクリプト例
- CloudFormationでのLambda-APIGateway連携のスクリプト例2
- HTTP GETでLambda関数を起動できない?
- HTTP GETでLambda関数を起動できない?2
- HTTP GETでLambda関数を起動できない?3
- WebコンソールでAPI GatewayとLambdaを連携させる方法