Severlessをやってみた
AWS でちょっとした処理を実行するのに Lambdaはとても便利。
これまで、ちょっとしたことを Lambda で実装したことはあったのだが、 ちょっとしたこと以上のコードを AWS コンソール上で書くのはなかなかつらい。
そこで、Serverless Frameworkを使ってみようと思った。
当初、Serverless を使うメリットとして考えていたのは次のとおり。
- ローカルの使い慣れたエディタで Lambda を実装できる。
- Webpack + Babel プラグインを使えば、モダンな JavaScript の機能を使える。
- デプロイも楽になりそう
試しに簡単なアプリケーションを書いてみた。
サンプルアプリのシナリオ
試してみる課題シナリオは次のとおりとした。
- Github にプルリクを作ったり、プルリクにプッシュすると CodeBuild でビルドを実行する。
- プルリクには Github の Status API で状態を通知する
- ビルドの開始を Slack にも通知する
- CodeBuild の処理終了を CloudWatch Event で受け、その結果を Github の Status API で更新する
- 結果を Slack にも通知する。
作ってみたコードはこちら => HeRoMo/ServerlessSample: My First Serverless Application Sample
やってみて
やってみてどうだったのか?感想を以下に述べる。
関連リソースも一緒に定義可能
予備知識少なめで取り掛かったのでドキュメントを読みながら進めた。
最初はトリガーとなる Amazon SNS 等は別に登録して用意しないといけないのかな? と思っていたのだが、
SNS を始め、API Gateway など、Lambda をトリガーできるリソースは serverless.yml
の関数定義で一緒に定義できる。
これはとても便利。
また、Lambda から他の AWS のリソース・サービスにアクセスするのに必要な権限も serverless.yml
で Lambda の実行ロールに追加できる。
とにかく、Lambda の実行に必要なものが serverless.yml
で一元管理できるのが管理しやすくてよかった。
最初にデプロイした時、裏で Cloud Formation のスタックが作成、実行されてちょっと驚いたが、こういうことなら納得。
Cloud Formation の定義記法で、Lambda とは直接やり取りしない設定も定義できそうなので Cloud Formation も覚えねばと思った。
やはり async/await は便利
Webpack プラグインと babel を追加して、ES2015 から Node6.10 相当にトランスパイルするように設定した。 Lambda を使う動機としては AWS のサービス間の連携を開発するためのグルーコードとして便利というのもあると思う。 実際、AWS の SDK は組み込みで動作するので適切な権限が Lambda の実行ロールに付与されていれば、別サービスにアクセスするのは それほど難しくない。 しかし、AWS の実態は HTTP ベースの API なので、呼び出しはどうしても非同期となる。非同期を多用する必要がある場合には もう、async/await が使えないと辛い体になってしまっているので、これは助かった。 AWS SDK の関数は現状、コールバック式なので、早く Promise を返すようになればと思う。
全般的な感想
前述したメリットはすべて享受できたと思う。
私は JS を書くときには Atom エディタを使うことが多いが、やはり使い慣れたエディタだと実装しやすい。
webpack でビルドできると、babel でトラスアイルできるだけでなく、自由に node モジュールを使うこともできる。
そのため Github API や Slack API のライブラリを利用でき、その点でも効率的に実装できた。
デプロイも sls deploy
ワン・コマンドで済むのはとても楽だった。
テンプレートも作った
今後別のアプリケーションを実装するのに便利なように、webpack+babel を設定したアプリケーションの雛形を作った。 Serverless には Serverless アプリを GitHub から取ってきてそれをひな形に別のアプリを作成する機能が備わっている。 そこもよく考えられているなぁと感心した。
テンプレートはこちら。=> HeRoMo/sls-template: Serverless Framework application template