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が使えるようになる。例えば、デプロイのコマンドは以下のような感じ。

1
$(npm bin)/serverless deploy

Credentialsを容易に追加

Credentialsコマンドを使っているだけだが、デプロイに必要なユーザーcredentialsをコマンドを流すだけで設定できるようにした。これにより複数人開発のときでも簡単に環境構築ができる。

1
$(npm bin)/serverless config credentials --provider aws --key KEY --secret SECRET --profile PROFILE

yarnコマンドで統一する

Serverless FrameworkのCLIを、yarnコマンドで流せるようにした。Serverless Frameworkに限った話ではないが、これでインターフェイスを統一でき、スクリプトの予測が容易となる。

1
2
3
4
5
6
7
8
{
"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でできるので、例えばデプロイのコマンドなどは以下のように設定した。

1
2
3
4
5
{
"scripts": {
"deploy": "$(npm bin)/serverless deploy --stage",
}
}

実際に流す時は以下のように実行する。

1
2
$ 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の設計を書いてみた。特に普段と変わらずに設計できたので、あとはクリーンコードを書いてゆくだけですね。╭( ・ㅂ・)و

参考

このエントリーをはてなブックマークに追加