イベント駆動の基礎を理解してコスト効率の良い設計を行う

AWS Lambda は AWS のコンピューティングリソースを使用するサービスの一つです。AWS Lambda を利用する上で、その料金体系が従量課金制(pay-per-use)であることを意識することはとても重要だと言えます。実行時間を可能な限り減らすための工夫と設計を行うことで、コストメリットだけでなく、システム構成全体における最適化につながることが多いからです。

本記事では、このように AWS Lambda を最適に利用するためのイベント駆動な設計について紹介していきます。

イベント駆動とは?

一般的にイベント駆動とは何らかのアクションや状態の変化をトリガーとして処理を実行するタイプのプログラミングモデルを言います。AWS サーバーレスアーキテクチャにおいては、様々な AWS サービスからのアクションや状態によって AWS Lambda 等を呼び出すケースが多く、これらの仕組みを上手く組み合わせた形でシステム設計を行っていきます。

例えば、以下のような状況で AWS Lambda が起動し、後続の処理を進めていくことが多いです。

  • S3 にファイルがアップロードされた(→ ファイルを読み込み変換処理を行う)
  • API Gateway にリクエストが到達した(→ リクエストを受け、適切なレスポンスを返す)
  • DynamoDB のデータに更新があった(→ データの更新に伴う通知など関連処理を行う)

イベント駆動な設計のメリット

  • Lambda と各 AWS サービスがイベントで数珠つなぎのようにつながっている構成になる
  • コンピューティングリソース(Lambda)の実行時間はイベント発生からそのイベントの処理が完了するまでに限られ、不必要に待機する時間がなくなる
  • SQS などのキューイングサービスを利用することで、耐障害性やエラーハンドリングがしやすくなるといったメリットもある

ポーリングと比較して考えてみる

ポーリングの場合、他のサービスや連携先システムなどの状態変化を検知するため、一定の間隔でリクエストを送って状態を確認する形となります。状態が変化したタイミングを的確に捉えることはできないため、コンピューティングリソースを利用する時間が長くなり、サーバーレスな構成においては Lambda のコスト増の原因の一つになります。

イベントドリブンな構成の場合、必要なときだけ処理が実行されるので、何もせず待機する時間がなくなり、実行時間を最小限に抑えられます。またこの仕組を応用して時間がかかるような処理は別途切り出し、別のAWSサービスまたはマルチスレッドに対応した実装を含む Lambda に任せることで、さらなる最適化を図ることも可能です。

イベントドリブンな設計にするコストメリット

従量課金制のサービスをコスト効率よく活用するためには、状態変更や外部からのアクションに対する処理の実行をただ待つのではなく、必要なタイミングでのみ起動させることがポイントになってきます。その結果、処理の実行時間が減るため、実行時間に大きく左右される Lambda の料金を抑えることができます。つまり、無駄に待機している時間に対する課金は発生させないように設計できるということになります。

また、システム構成が複雑な場面においては、例えば Step Functions などのサービスを利用することで、イベントドリブンな設計がよりしやすくなります。このように、常にイベントドリブンな設計を心がけることで、AWS 料金の大部分を占めるコンピューティングリソースの料金を抑えることができます。