Serverless Framework+Node.jsで普通に設計する
最近はAWS Lambdaの関数をNode.jsで書いているので、その設計を紹介しようと思う。
目次
Serverless Frameworkで気をつけたこといくつか
まずServerless Frameworkでアプリケーションを作成してゆく。基本的にはドキュメントや[リンク](## 参考)をみれば迷うことはないと思うので省略するが、少し気をつけた点を書いてみる。
ローカルCLIを使用する
Serverless Frameworkでは、CLIのバージョンをプロジェクトごとに固定することができるが、複数のプロジェクトでServerless Frameworkをつかっていると、各自の環境でCLIのセットアップをするのが若干面倒になる。
そこで、ローカルのnode_modules
からCLIを走らせることにした。これで、yarn install
さえすれば各人の環境でCLIが使えるようになる。例えば、デプロイのコマンドは以下のような感じ。
$(npm bin)/serverless deploy
Credentialsを容易に追加
Credentialsコマンドを使っているだけだが、デプロイに必要なユーザーcredentialsをコマンドを流すだけで設定できるようにした。これにより複数人開発のときでも簡単に環境構築ができる。
$(npm bin)/serverless config credentials --provider aws --key KEY --secret SECRET --profile PROFILE
yarnコマンドで統一する
Serverless FrameworkのCLIを、yarnコマンドで流せるようにした。Serverless Frameworkに限った話ではないが、これでインターフェイスを統一でき、スクリプトの予測が容易となる。
{
"scripts": {
"deploy": "$(npm bin)/serverless deploy",
"deploy:list": "$(npm bin)/serverless deploy list",
"invoke": "$(npm bin)/serverless webpack invoke --function",
"serve": "$(npm bin)/serverless webpack serve"
}
}
stageを切り分ける
Lambdaではstageというものが指定できて、例えば、ステージング環境やプロダクション環境などを作成して、各々の環境で関数をテストすることができる。stageの切り分けはServerless Frameworkでできるので、例えばデプロイのコマンドなどは以下のように設定した。
{
"scripts": {
"deploy": "$(npm bin)/serverless deploy --stage",
}
}
実際に流す時は以下のように実行する。
$ yarn deploy staging
$ yarn deploy production
テスト
後述するが、関数のテストは基本的にAVAを使って行うことができるので、Serverless Frameworkでテストするのは、関数を結合したときの挙動がメインとなる。
クラウド環境ではInvokeコマンド、ローカル環境ではInvoke Localコマンドを使用することで、動作確認が可能となる。これをなにかしらのアサーションライブラリを使用して自動化すれば、インテグレーションテストをCI上でも流すことができる。
JavaScript側の設計
ここまではServerless Frameworkの設定だったが、ここから、普段の開発を活かしつつ、Serverless Framework上でどうNode.jsを書いてゆくか
というところを書こうと思う。基本的には他プラットフォームで使用した設計をそのまま流用できると考えている。
webpack+Babel
まずは、webpack+BabelでECMAScriptをビルドできるようにした。これはserverless-webpackを使用するが、基本的に大差はない。詳細は、[リンク](## 参考)を参考にして欲しい。
AVA
AVAでユニットテストを実行できるようにした。とはいっても、いつも通りユニットテストを書いてゆくだけである。
ひとつ気をつけた点は、責務をなるべく分離して、クラウド側に依存しないコードを書くことくらいだろうか(webpack+Babelを導入したことによって、小さなJSモジュールにわけて関数を書くことができる)。それに関しては、ドキュメントにも例が出ているので、参考にするといいと思う。
Flow
Flowによって静的型付けを導入した。
Lint
eslintにより、Lintを行うようにした。Lintはあとから導入すると、ルールを直していく作業が必要になってしまうので、もし小さいプロジェクトであっても最初から導入したほうがいいかもしれない。
State管理
State管理に関しては、なんらかのObserver Pattern(Reduxなど)で書けばいいと思うが、Stateを持つということが現時点ではないので、必要になったらなにかを導入しようと考えている。Lambda関数の性質上あまり必要になる場面が思い浮かばないが、State管理というよりも、RxJSなどでイベントストリームを扱うことがでてくるかもなと思っている。
まとめ
以上、Serverless Framework+Node.jsを使用したLambdaの設計を書いてみた。特に普段と変わらずに設計できたので、あとはクリーンコード
を書いてゆくだけですね。╭( ・ㅂ・)و
参考
- serverless + webpack + babel で AWS Lambda をナウく書く - scramble cadenza
- とことんサーバーレス①:Serverless Framework入門編 - Qiita
- Serverless Webpack の使い方まとめ - Qiita
- lambdaのソース管理をflcutからserverlessに切り替えて嬉しかったこと - Qiita