LocalStack を使って aws-sdk の Integration Test を実行する
Wednesday, April 19, 2023 04:12:00 PM
AWS Lambda の Node.js 14 を 18 に移行する(aws-sdk v3 移行編) の中でも書いたように、aws-sdk v3 を使ったコードを UnitTest するには AWS SDK v3 Client mock を利用してモックした方が簡単です。
一方で少し IntegrationTest をしたいと思うこともあるでしょう。そうしたときは LocalStack の利用が便利です。 手元も環境なら Docker の Extension で動きます。 CI 環境、たとえば GitHub Actions ならサービスでコンテナ起動すれば大丈夫です。
インテグレーションテストでのエンドポイント
こんな感じでテストコードで endpoint を切り替えられるようにしておくとローカルとCI環境のどちらでもテストを実行しやすくなります。
const options = {
credentials: { accessKeyId: 'dummy', secretAccessKey: 'summy' },
endpoint: `http://${process.env.TEST_AWS_HOSTNAME ?? 'localhost'}:4566`,
region: 'ap-northeast-1',
};
const stepFunctions = new SFNClient(options);
手元では localhost で良いし、CI環境(たとえば GitHub Actions ) なら、以下のようにしておくと良いです。
container: node:18
services:
localstack:
image: localstack/localstack
env:
TEST_AWS_HOSTNAME: localstack
steps:
- run: npm t
LocalStack v2.0 以降での変更点
最近バージョンが 2.0 になった LocalStack ですが Lambda 関連で大きな変更がありました。 基本的に Lambda を利用しなければ問題はありませんが、特に問題なければ localstack サービスを以下のように設定しておくと安心です。
container: node:18
services:
localstack:
image: localstack/localstack
env:
LAMBDA_SYNCHRONOUS_CREATE: 1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Actions のホストコントローラの docker.sock をマウントすることで LocalStack の中で Lambda が起動できるようになります。
詳しくは公式の v2.0.0 リリースノート の Lambda
部分に書いてありますので、読んでみてください。
さいごに
単体テストで LocalStack 使うのはやりすぎだと思いますが、部分的にインテグレーションテストしたい、といった場合には有用な方法かな、と思いますので、用途に応じて使い分けられると良いですね。
Recent Articles
- マルチプルレポをモノレポへコミットログを残しながら移行する 2023/09/27
- 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