Node.js で AWS SQS を使ったコードの自動テストを記述する
Sunday, December 18, 2022 02:53:00 PM
前回のNode.js で BigQuery を使ったコードの自動テストを記述すると同じように外部サービスを使った部分の自動テストについてです。 今回は AWS SQS を使ったコードの自動テストを書く場合です。
BigQuery と違い、 AWS SQS のエミュレータは検索するとすぐに見つかりました。 たとえば roribio16/alpine-sqs というもの。 こちらは日本語の使ってみた記事もいくつか出ています。
roribio16/alpine-sqs
さっそく上記の記事や、公式ドキュメントを参考に動かしてみます。
Dockerコンテナをあげて aws cli から実行してみると、簡単に利用することができたので、 Node.js + Jest のテストコードを書いて試してみます。 すると ECONNRESET エラーとなって動きません。おやぁ?
GitHub のリポジトリを見てみると、関連する issue が出てました。 どうも Apple Silicon (いわゆるM1とかM2とか)からだとエラーになるようです。 解決するための Pull Request も出てるんですが、マージされる気配がないようです。 現在、開発用の端末は M1 MacBook Pro を使っているので、困ってしまいました。
alpine-sqs の Dockerfile を見ると elasticmq-server
を使っているようなので、それを調べてみます。
elasticmq-server
ElasticMQ の GitHub を見てみると、普通に
Amazon SQS-compatible interface
って書いてありました。 これだけで良いのでは?という感じです。 (alpine-sqs の利点は何だったんだろう?)
で、それっぽいキーワードで検索すると、記事もありました。
- Amazon SQS互換のElasticMQを使って、Temoporary Queue+RPCを試してみる
- Amazon SQSをDockerを使ってローカルで実行
- LocalでSQS(ElasticMQ)を動かしてみた
- ElasticMQでAmazon SQSのローカルテスト環境を作る
調べ方の問題ですかね?キーワードの指定の方法によっては、こっちの方がたくさん出てきました。
さてこちらも Docker コンテナがあるので、それを使って起動します。
$ docker run -d -rm -p 9324:9324 -p 9325:9325 softwaremill/elasticmq-native
起動時にキューを作っておくには config ファイルを記述してファイルをマウントします。
$ docker run -d -rm -p 9324:9324 -p 9325:9325 -v `pwd`/custom.conf:/opt/elasticmq.conf softwaremill/elasticmq-native
config の書き方は、 GitHub に例が書いてあるので、そちらを参考にしてください。
Node.js からの接続
まず aws-sdk のクレデンシャルに適当な値を設定しておきます。 あとは SQS クラスのインスタンスを生成するだけです。
import * as AWS from 'aws-sdk';
import { SQS } from 'aws-sdk';
AWS.config.credentials = {
secretAccessKey: 'secretAccessKey',
accessKeyId: 'accessKeyId',
sessionToken: 'sessionToken',
};
let sqs: SQS;
beforeAll(() => {
sqs = new SQS({
region: 'ap-northeast-1',
endpoint: 'http://localhost:9324',
})
});
キューのURLはデフォルト設定だと http://localhost:9324/000000000000/キュー名
のようになります。
このあたりは aws-cli などでキュー一覧を取得してもわかるので、そこから情報を取得しても大丈夫でしょう。
さいごに
はい。 これで AWS SQS を使ったコードの UnitTest も書けるようになりますね。 どんどん UnitTest を充実させていきましょう。
Recent Articles
- tsyringe を TypeScript 5 で使う方法 2023/05/02
- LocalStack を使って aws-sdk の Integration Test を実行する 2023/04/19
- AWS SDK v3 のモジュールと利用方法 2023/04/18
- ts-jest が esbuild/swc をトランスフォーマーに使って高速化していた 2023/04/13
- aws-sdk v3 を使うライブラリを作ったときは、なるべく peerDependencies に設定しよう 2023/04/11
- aws-sdk v2 が 2023 年中にメンテナンスモードになる 2023/04/06
- Node.js v18 / aws-sdk v3 の Lambda アプリが突然動かなくなる 2023/04/05
- aws-sdk v3 でコンパイルエラーになる - その2 2023/04/04
- aws-sdk v3 で TS2345 が出てコンパイルエラーになる 2023/04/03
- aws-sdk-client-mock はどのように aws-sdk をモックしているのか? 2023/02/02