👻

AWSで各サービスを非同期化することで疎結合にするというベストプラクティス

2023/12/15に公開

ポケットスタディ AWS認定 デベロッパーアソシエイトという本を使ってAWS DVAの取得に向けて勉強しているのですが、「ベストプラクティスとデザインパターン」という章に表題のような内容があって「なるほど〜」と思ったので、自分なりにまとめたりコスト概算してみようと思います。

SQSを活用した疎結合化

例えばRDSを利用したアプリケーションを考えます。
外部からのリクエストに応じてRDSにクエリを発行するような、直接的かつ同期的な接続の場合、RDSのフェイルオーバー中にリクエストを受けるとリクエストが拒否されてしまいます。
ここで、間にSQSを噛ませて、ユーザーからのリクエストを受けたらSQSのキューにメッセージを送信し、バックエンドはメッセージをポーリングして処理するという構成にすれば、フェイルオーバー中でリクエスト拒否が発生した場合でもメッセージはキューに残るので、リトライが可能です。
フェイルオーバーが完了後、リクエストは正常に処理されます。
自前で失敗時のリトライ処理を実装することも可能ですが、SQSを噛ませた方がトータルの労力は少なそうだし、モニタリングもしやすそうです。

さらにSNSを活用した疎結合化

上記の改善に加え、SQSの手前にSNSを噛ませることで並列化も可能です。
外部からのリクエストをSNSトピックで受けて、複数のSQSキューに振り分けるという構成をとることで、一つのトリガーから複数の処理を並列に進めることができ、後から機能を追加する場合も簡単になるので拡張性が高まります。
このような構成をファンアウトと呼ぶそうです。

料金はどれくらい?

SQSキューとSNSトピックを噛ませた場合のコスト増分ってどれくらいなんでしょうか?

  • SQS料金表
    • 毎月最初の100万件のリクエストは無料、その後は100万リクエストあたり0.4USD(FIFOキューだと0.5USD)
    • 上記に加えて、データ転送については送信について月あたり最初の10TBは0.114USD/GB
  • SNS料金表
    • 標準トピックの場合、APIリクエストについて月最初の100万件が無料、0.5USD/100万件、エンドポイントがSQSなら通知については無料
    • FIFOトピックの場合、APIリクエストについて0.39USD/100万件、およびペイロードデータ量に対し0.0221USD/GB
    • 上記に加えて、データ転送については送信について月あたり最初の10TBは0.114USD/GB
      • これと上記のペイロードデータ量の何が違うのかちょっとよくわかってない

若干不明点ありますが、いずれにしても激安ですね・・・。
よほど大規模なプロジェクトでない限り、コストは考えなくて良さそうです。
とはいえ、SQSポーリング時の受信リクエストでメッセージが0件だった場合でも課金対象となるので、CloudWatchでNumberOfEmptyReceivesメトリクスを確認したり、WaitTimeSecondsで適切な待ち時間を設定しておくなどの配慮は必要みたいです。
参考

感想

サービスを非同期化することで疎結合にし、拡張性を高められる場合があること、そしてその際のコストの心配は要らなそうなことを確認できました。
本書の中には「サーバーではなくサービスを設計する」という言葉がありました。
AWSのサービスをうまく組み合わせることで効率的なアプリケーションを実現できるというわけですね。
アプリを作る際、頭に入れておきたいと思います。

Discussion