はじめに
こんにちは!バックエンドチームの上原(@_uhzz_)です。
バックエンドチームでは、サーバレス開発を推進していて、開発ツールの1つにServerless Frameworkを使っています。
上記のキャッチコピーの通り、Serverless Frameworkを使用することで、インフラリソースの管理が少人数でも行いやすくなります。
以前の記事でも詳細に説明されているのでそちらもご覧ください!
そんな中、Serverless Frameworkのローカル開発について調べていたときに、おもしろい記事を見つけました。
サーバレス開発を進める上で、検証環境を用意するときの悩みはつきものだと思いますが、上記の記事で新しいアプローチが紹介されていたので、記事を引用しながらコメントしていきます。
結論
ローカル環境とリモート環境のいいとこどりしたハイブリッド開発がおすすめ
実際のLambdaイベントのコピーをユニットテストやインテグレーションテストの入力に使用する
ユニットテストでは、クラウドプロバイダーSDKをモックする
インテグレーションテストでは、実際のサービスをモックしない
ローカル環境はなにを解決するか
ローカル環境を構築する以前に、検証環境をメンバー間で共有したり、複製したりすると思いますが、それはスケーラブルではないとのことです。
そこで、可能な限り本番環境と同じ環境をローカルに用意するという流れになります。
ローカル環境の開発フロー
記事内では、以下の図で説明されています。
ローカルにて検証環境を作成し、開発・検証をオフラインで行うことができるので、デプロイによる待ち時間が発生しません。
現状、バックエンドチームの開発フローもこれに近い方法で運用しています。
しかし、記事内ではこれを古い習慣として言及しています。
クラウドプロバイダーを完全にエミュレートするのは不可能
これはバックエンドチームでもたびたび話に上がる問題で、記事内で言及されている、serverless-offlineを使用していますが、同じようにエミュレートできない機能に関しては、実際にクラウド上で検証するという方法で運用しています。
私自身、エミュレートするコードの修正プルリクエストを過去に送ったことがあり、このコメントは耳が痛いと思いつつ、たしかにすべてをエミュレートしようとするのは途方もないよなと感じています。
リモート環境というアプローチ
なぜリモート環境を使うべきか
Serverless Frameworkを使ってインフラリソースをコードで管理しているなら、リモート環境にメンバーごとの環境を用意しようよ、の精神ですね。
ローカル環境とリモート環境を合わせたハイブリッド開発というアプローチ
リモート環境によって、ローカル環境で課題だった本番環境との差分を解消できるものの、検証環境を完全にリモート環境へ切り替えるのではなく、両者のいいとこ取りをした、ハイブリッド開発というアプローチが提案されています。
1. すべてのイベントをログに記録する空の関数をデプロイ
ここで言及しているのは、実際の機能を開発する前に、トリガーされたイベントをログに入力するLambdaをデプロイすることです。
2. 可能な限りのイベントをローカルにコピー
ログに入力されたトリガーイベント、つまりLambdaのトリガーとなるJSONがログから確認できるので、それをコピーしておきます。
3. 実際のサービスと統合した、テスト駆動開発を行う
コピーしておいたJSONを入力データとすることで、テスト駆動開発を進めることができるようです。
たしかに、Lambda関数を開発する際、機能の実装を進めながら都度デプロイを行い、実際のサービスのトリガーが正常に動作するかを確認していましたが、機能を実装する前にトリガーの設定を済ませておくことで、検証におけるデプロイ頻度は少なくなりそうですね。
テスト方法についても言及されています。
4. 実装した機能をデプロイ
まとめ
ローカル環境ではクラウドプロバイダーを完全にエミュレートできないので、リモート環境と組み合わせて検証環境を構築するアプローチは新鮮でした!
また、リモート環境だけで構成する場合のウィークポイントを、テスト駆動開発を必須にすることで解決したいというアプローチは、リファクタリングのしやすさにもつながりますね。
さいごに
バックエンドチームでは、サーバレスやGoを使った開発に興味のある方を絶賛募集しています!
カジュアル面談もやっているのでお気軽にご連絡ください!