1. HOME
  2. ブログ
  3. IT技術
  4. LocalStackを使ってファンアウトしてみた

LocalStackを使ってファンアウトしてみた

はじめに

先日業務でLocalStackを使ってSNS/SQSを利用したファンアウト構成の動作検証を実施しまして、その際に得た備忘録です.

単語の整理

LocalStack

AWSのエミュレータでローカルマシンにAWSテスト実行環境を構築できちゃう素敵なツール/サービス.

https://localstack.cloud/

※ 以前ハクさん書いた素敵記事にも記載されてます. 併せてどーぞ.

SNS/SQS

AWSのメッセージングサービス.

SNSはプッシュ通知やSMS(ショートメッセージサービス)通知で利用される.

SQSはキューイングサービスです.

※ メッセージングサービスはシステム間/コンポーネント間を非同期で通信する方法でマイクロサービスや疎結合な構成でよく利用されます

ファンアウト

メッセージングサービスの構成/パターンの1形態.

ざっくり言うと1箇所でメッセージを受け取りそれを複数箇所に通知するって仕組みです. 広義のブロードキャスト.

ECサイトの商品購入後で例えると 商品を購入した をトリガーに サンクスメール送信外部システム連携分析用データ登録 などを非同期に実施する仕組みとなります.

  • それ何がうれしーの ?
    • 複数箇所で同じメッセージを元に異なる処理を非同期/並行に実施できる → パフォーマンス向上、拡張性向上、依存性の排除などなどが見込める
  • 良いことずくしじゃないですか?
    • しかし前後の処理や並行処理との間に整合性が求めらる場合は大変になりがち. 運用でどう/どこまでカバーするかなどを調整する/決めるのが大事.

ファンアウトしてみる

ではローカルでファンアウトしてみます.

前提

  • docker / docker-compose、awscli を使用します.
  • トピックとキューは以下名前で作成. 各キューはトピックをサブスクライブ.
    • トピック
      • xxx-topic
    • キュー
      • do-queue
      • re-queue
      • mi-queue

準備

  • awscli の プロファイル(LocalStack用)を追加する

  • docker-compose.yml を定義する
    • 公式サイト上にdocker-compose.ymlの定義が記載されてまして、それをまるっとコピーしてローカルの任意の場所に配置します.

LocalStackを起動する

作成したdocker-compose.yml と同階層でdockerを起動するだけでツール起動します. 簡単です.

SNSトピックとSQSキューを作成しサブスクライブする

  • 補足
    • awscliでLocasStackを操作する場合 --endpoint-url http://localhost:4566 を指定しないとエラーになる
    • snsはrawメッセージ配信設定
      • sns publish時に送信したメッセージのみをsqsへリレーする. これしないとsqsで受け取ったペイロードにメッセージ意外の属性情報が付与される.

動作確認する

トピックへメッセージ送信し3つのキューそれぞれにメッセージが届くよね?の確認.

do-queue 受信確認

re-queue 受信確認

mi-queue 受信確認

おけー、できました.

まとめ

AWSのSNS/SQSを利用したファンアウト構成を非常に簡単にローカルで試すことができました. 興味ある方は是非やってみてください.

延長戦

上記だけだとちょっとつまらないのでプログラムで実際にキューを刈り取ってみるサンプル作ってみました.

みんな大好きpython、js/ts、phpの3つで (TIOBE Index (2023年10月時点)のLL言語上位3つだったのは偶然).

  • 仕様
    • sns/sqs は上記のを使用する.
    • awscliでsnsトピックへメッセージを送る.
    • 各プログラムでキューを刈り取り、メッセージをコンソール出力する、ただそれだけ.

で、作ってみたのがコチラ となります. 興味あるかたはどーぞ.

おまけ

  • どの言語も同じような書き方でメッセージを受け取れました. まぁですよね.
  • 単にキューを刈り取ってキューを削除しただけです. ほんとはもっと色々考慮が必要(デッドレターキューとかリトライとかなにやかや...).
  • 全てタイマー処理設定してます(1秒おきに刈り取り). これ設定しないとPCのファンがファンファンしちゃいまして. ファンアウトだけに.
  • jsのランタイムは Bun でしてみましたが、公式マスコットがかわいすぎる.

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア