Edited at

AWS 謹製 aws-serverless-express を使って APIGateway + Lambda + Node + Express で RESTful サービスの雛形を最速で作る

More than 1 year has passed since last update.


はじめに

AWS と言えば Lambda、Lambda と言えば サーバレス ですが、サーバレスでサービス全体を作るのはしんどいなと思っている昨今、皆様いかがお過ごしですか。

そんな折、10/04付け AWS ブログで以下の記事がポストされました。

「AWS Lambda と Amazon API Gateway で Express アプリケーションを実行」

https://aws.amazon.com/jp/blogs/news/running-express-applications-on-aws-lambda-and-amazon-api-gateway/

Lambda で Express が動くだと!? なんて日だ!


手順



  1. ローカル環境

    Lambda の Node は 4.3.2 なので、ローカル開発環境も、念のため、合わせておく

    $ nodebrew use v4.3.2
    
    $ node -v
    v4.3.2



  2. サンプルコード取得

    GitHub からサンプルコードを取得する

    $ git clone https://github.com/awslabs/aws-serverless-express.git
    
    $ cp -r ./aws-serverless-express/example ~/projects/yourProject
    $ cd ~/projects/yourProject



  3. コンフィグレーション

    以下で、コンフィグレーションを行う

    $ npm run config <アカウントID> <バケット名> ap-northeast-1
    

    パラメータ
    意味

    アカウントID
    AWS コンソールの アカウント情報で表示されている ID

    バケット名
    S3 のバケット名。全世界で唯一の名前である必要がある。
    指定したバケットが存在していないなら、自動で作成してくれる。
    Lambda にコード一式をアップロードするために使用されるだけ。

    スクリーンショット_2016-10-09_16_36_33.png




  4. セットアップ

    たった、これだけ。

    $ npm run setup
    



  5. 動作確認

    CloudFormation が CREATE_COMPLETE になれば、成功。

    Outputs タブに、作成された画面へのリンクが、表示されている。

    スクリーンショット_2016-10-09_16_35_08.png


    • ApiUrl

      サンプル users の RESTful API が表示されている。

      動く、動くよ!
      スクリーンショット_2016-10-09_16_21_48.png

    • APIGateway
      スクリーンショット_2016-10-09_16_35_33.png

    • Lambda

      このような Lambda 関数が生成される。これ自体は、たった4行。この Lambda 関数をいじることはない。
      スクリーンショット_2016-10-09_16_35_49.png




カスタマイズ


  1. カスタマイズ

    app.js をカスタマイズしていけばよい。

    ここは、今まで通りの、普通の Node + Express だ。



  2. 反映

    次のコマンドで、AWSに反映できる。これだけだ。なんて日だ!

    $ npm run package-upload-update-function
    



ローカル テスト

70行目付近を修正して、ローカルの node で起動してテストできるようにしておきます。



  1. コード修正

    // The aws-serverless-express library creates a server and listens on a Unix
    
    // Domain Socket for you, so you can remove the usual call to app.listen.
    //app.listen(3000)
    process.env.PORT && app.listen(process.env.PORT)



  2. 起動

    $ export PORT=3000
    
    $ node app.js



おわりに


  • コマンドを 3,4 個実行するだけで、ここまでできるとは驚きです。

  • aws-serverless-express の登場で、いきなり、サーバレスでサービスを実現できる気がしてきた。

  • あとは、MongoDB のマネージドサービスがあればなぁ。


TODO

ぱっと思いつくだけでも、まだ先は長い。わかり次第、追記していきます。



  • Lambda での params, context の扱い


  • ローカルでの実行方法、デバッグ方法など