[aws]Amazon SQSをlocal環境とgitHubActionで利用する
local環境とgitHubActionでAmazon SQSを使いたかったので、調べたところ
ElasticMQ
というツールが見つかったので検証しました。
システムにAmazon SQSを組み込んでいるけど、localでの開発やテストの自動化でボトルネックになって頭を悩ましている人はそれなりにいるのではないでしょうか。
こういった場合は
ElasticMQ
を使うことを検討すると良いと思います。
今回はElasticMQを使ったlocalでのsqsの利用方法とgitHubActionでのテスト方法を説明します。
ElasticMQとは
ElasticMQはメッセージキューシステムで、アクターベースのScalaとSQS互換のREST(クエリー)インターフェースを提供します。
利用方法
java or dockerを利用します。
javaを使った開発現場でなければdockerを使って、javaを意識させないようにして利用した方が良いと思います。
dockerで使う
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のキューを設定します。
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に追加します
{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で実行します。
- 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