Facebook Twitter Google Maps RSS
Home Webアプリ AWS Lambda で Promiseを使ってコールバック地獄から脱却する
formats

AWS Lambda で Promiseを使ってコールバック地獄から脱却する

こんにちは。陽気なシステム屋のうっちーです。

4月になり、弊社にも元気な新卒社員が多数入社してきました。元気な新入社員から刺激をもらいながら負けないように頑張っていかなければいけませんね。

現在弊社ではAmazon Web Servicesのマネージドサービスを活用し、サーバーレス・アーキテクチャでメルマガ配信システムを開発しています。
サーバーレス・アーキテクチャと言えば、S3や DynamoDB、API Gatewayあたりが大活躍するわけですが、ロジックの中心はやはり、AWS Lambdaということになります。

しかし、AWS Lambdaを Javascriptで書いた場合、ちょっと処理が多くなってくると非常にソースコードが見づらくなる悩みがありました。新卒社員にはとても見せられない代物になっていたわけです。
中でも AWS SDKの APIは非同期処理が頻出しますから、いわゆる「コールバック地獄」に陥ることが多かったと思います。

 

つい先日、AWS Lambdaで従来の Node.js 0.10に加え、Node.js 4.3.2が利用可能になりました。
Node.js v4では、ES6(ECMAScript 2015、ES2015)の Promise が使えるわけですから、この機会にゴミコードはサクッと書き直してしまいましょう。

 

これは弊社で実際に使用しているロジックの一部を書き直したものです。

設定テーブルの内容を読んでから実際のデータテーブルを読み、加工・集約処理を行ってから、テンプレートエンジン「EJS」を使ってメール本文を作成します。
宛先アドレスの一覧を取得する処理とテキストメール本文作成処理、HTMLメール作成処理は並列に動いて構わないので、Promise.all しています。
結果を Simple Email Service (SES) を使ってメール送信して、最後に結果を DynamoDB に書き込んでいます。

書き直す前のプログラムがどんなだったかと言うと、、、
恥ずかしいので見せられないですが、Promiseを使って書くと、処理の流れ・フローが非常に分かりやすいと思います。

各関数は

のように Promiseオブジェクトを作って返す構文で包みます。

 

一度、Promiseの味を知ってしまうと、もう Promiseなしでは Lambda Functionは書けないですね。

Node.js 0.10のサポートは今年の 10月までらしいので、過去に作ったFunctionも できるだけ(新卒に見つからないうちに)書き直して保守しやすくしておきたいと思います。

 

※アイエンターではクラウドネイティブで運用コストを劇的に抑えたシステム構築、ソリューション提案を行っています。お気軽にアイエンターへご相談ください!

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">