SAM Local (Beta)を使ってローカルにAPI Gatewayを構築する

APIGateway, AWS, Lambda, serverless

この記事は最終更新日から1年以上が経過しています。

SAM Local (Beta)が発表されローカル環境でサーバレスアプリケーションをデバッグできるようになったので試してみました。
ちなみにリンク先の記事はそのままでは動かそうとすると情報が足りなかったので、試したい人はGitHubの方のチュートリアルやサンプルを触ってみるのが良いと思います。

ローカルにLambdaを作成

チュートリアル用のHelloWorld関数をローカルに作ってみます。

template.yml

index.js

event.json

実行結果

HelloWorldをAPI Gatewayに対応させる

sam local start-api でAPI Gatewayが起動しますが、上の設定のまま実行するとAPIの定義が足りなくてエラーになります。

Lambda関数の設定に Events を追加します。
Type: Api でAPI GatewayのAPIの定義になります。

Events の設定を追加すると Path に指定したpathにAPI Gatewayがデプロイされます。

APIを呼ぶとLambda関数が呼ばれるのですが以下のエラーが出ます。

API GatewayのProxy Integrationを使用しているため statusCode がないとエラーになるそうです。
レスポンスに statusCode を追加します。

ここまでで実行には成功しますが event.nameundfined となってしまいます。

APIにパラメータを渡す

curlで渡したデータはAPI Gatewayのイベントでラップされるので、API Gatewayのイベントをパースして使用する必要があります。

post も使いたい場合はAPIの定義を get から any に変更します。
getpost を両方マッピングする方法が見つからなかったので。
(2個定義すれば良いのかもですが今回はお試しなので簡単にanyで)

ソースコードもGET/POSTの両方に対応するよう修正します。

まとめ

ホットリロードはソースの更新の度に行われるのではなくAPIの呼び出し毎にソースを読み込み直しているような動きをしているのでそこまでサクサク開発できないんじゃないかなという印象です。

サーバレスのアプリケーションをローカルでデバッグできるだけで楽といえば楽ですが、呼び出しに5秒くらいかかるので1画面で複数のAPIを呼び出すような場合は結構待たされると思います。

また、ホットリロードによりLambda関数のソース変更は再起動不要ですが、MethodをGETからPOSTに変更してみましたが反映されなかったのでAPIの定義を更新するには再起動が必要みたいです。