🌐

[aws]Amazon SQSをlocal環境とgitHubActionで利用する

2025/03/05に公開

local環境とgitHubActionでAmazon SQSを使いたかったので、調べたところ

ElasticMQ

というツールが見つかったので検証しました。

https://github.com/softwaremill/elasticmq

システムにAmazon SQSを組み込んでいるけど、localでの開発やテストの自動化でボトルネックになって頭を悩ましている人はそれなりにいるのではないでしょうか。

こういった場合は

ElasticMQ

を使うことを検討すると良いと思います。

今回はElasticMQを使ったlocalでのsqsの利用方法とgitHubActionでのテスト方法を説明します。

ElasticMQとは

ElasticMQはメッセージキューシステムで、アクターベースのScalaとSQS互換のREST(クエリー)インターフェースを提供します。

利用方法

java or dockerを利用します。

javaを使った開発現場でなければdockerを使って、javaを意識させないようにして利用した方が良いと思います。

dockerで使う

docker-compose.ymlに記述します。

docker-compose.yml
  {app_name}-elasticmq:
    image: softwaremill/elasticmq:1.6.11
    container_name: {app_name}-elasticmq
    ports:
      - "9324:9324"
      - "9325:9325"

上記で起動するとelasticmqが作動します。

しかし、このままだとキューがないのでcustom.confを作成してキューを設定します

custom.conf

サンプルとしてfifoのキューを設定します。

custom.conf
queues {
  # http://localhost:9324/queue/test-1-runn.fifo
  test-1-runn {
    defaultVisibilityTimeout = 0 seconds # 可視性タイムアウトの設定
    delay = 0 seconds # 遅延キューの設定
    receiveMessageWait = 0 seconds # ロングポーリング
    fifo = true #FIFOキューの設定
    contentBasedDeduplication = true # 重複排除ID
  }
}

上記で作成したconfをdocker-compose.ymlに追加します

docker-compose.yml
  {app_name}-elasticmq:
    image: softwaremill/elasticmq:1.6.11
    container_name: {app_name}-elasticmq
    volumes:
      # 設定ファイル
      - ./custom.conf:/opt/elasticmq.conf:ro
    ports:
      - "9324:9324"
      - "9325:9325"

これでdocker-compose upをするとキューが追加されたelasticmqが立ち上がります。

"http://localhost:9325/"にアクセスするとUIでキューを確認できます。

実装言語と実装コスト

言語によって実装が結構異なります。

python or rubyが一番実装しやすいと思います。

逆にイマイチなのがGoで、elasticmqに接続するにはresolverを作成する必要があります。

gitHubAction

gitHubActionの場合はdockerでなくjavaで実行します。

sqs_test.yml
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Download ElasticMQ JAR
        run: wget https://s3-eu-west-1.amazonaws.com/softwaremill-public/elasticmq-server-1.6.11.jar

      - name: Run ElasticMQ
        run: java -Dconfig.file=./custom.conf -jar elasticmq-server-1.6.11.jar &

これでelasticmqが立ち上がります。

立ち上がると、"http://localhost:9324/health"にアクセスするとOKが返ってくるので、curlで立ち上げるまで待つスクリプトを実装することをお勧めします。

まとめ

elasticmqを使うと、Amazon SQSをlocalやgitHubActionで利用可能になります。

モックではカバーできないパターンも自動テストできるようになるので、是非試してみてください。

また、外部連携サービスが多すぎてテストの自動化がうまくいかない場合は、内製化できないかを考慮しましょう。

クラウドサービスはサービスを高速でスケールするのには役立ちますが、ある程度サービスが成長すると自動化を阻害する負債になります。

ストレージサービス・メールサービス以外は、支払うコストが価格と釣り合っているかを定期的に考えて見るのがよいと思います。

Discussion