AWSでは様々な便利なサービスが提供されています。中にはRDSやElasticCacheのように既存のミドルウェアに対するマネージドサービスを提供するものもあり、これらについては既存のミドルウェアを使って開発することができますが、AWS固有のサービスについてはアプリケーションを動作させるには実際にサービスに接続する必要があり、開発環境が制限されてしまいます。
もちろんソフトウェア側で抽象化しておき、DIなどの手法を用いてモックに差し替えるという方法も考えられますが、特にストレージとして利用するサービスなどの場合はインタラクションが必要になるのでモックでは再現しづらいですし、やはり実際に動作するサービスに接続して開発やテストを行うほうが効率的です。
そこで、AWSのサービスを擬似的にローカルで再現することのできるプロダクトを集めてみました。
S3
node.jsで動作するs3-proxyが使えます。なぜかわかりませんが、この手のものはnode.js製のものが多いようです。npmコマンドで簡単にインストールできてコマンドも使えるようになるので便利です。
チームではAWScalaをラップしたScala用のS3クライアントを作っていて、実装を差し替えることでローカルファイルシステムで動かせるようにしていたりします。ただ、このクライアントを使えるケース限定ですし、サポートしていないオペレーションも多いので用途は限定されます。
SQS
ElasticMQというScalaで記述されたSQS互換インターフェースを持つインメモリのMQサーバがあります。
日本語の記事も見かけますね。
Kinesis
kinesaliteが使えます。これもnode.js製です。ストレージにはLevelDBを使用しているようです。
このブログでも以前紹介しました。試せていないのですが、DynamoDB Localやdynaliteと組み合わせればKCLを使用したKinesisアプリケーションも動作させることができるのでしょうか。
DynamoDB
AWS自身が出しているDynamoDB Localがありますし、Kinesaliteと同じ作者が作っているdynalite(kinesaliteと同じくnode.jsで動作します)というものもあります。
Lambda
これも触ったことはないのですが、node-lambdaとかが使えるのでしょうか。
こんな記事もありました。
その他
他によく使いそうなものとしてSESがありますが、AWSで提供されているメールボックスシミュレータを使うのが一般的なのでしょうか。また、SNSはRubyで書かれたfake_snsというダミーサーバがありました。
CloudSearchに関してもPythonでテスト用の実装を作っている人がいました。ちゃんと動くのかどうかわかりませんが…。
職場ではdockerでこれらのプロダクトを組み込んだコンテナを作って、なるべくローカルで開発環境を完結できるようにしています。CIもやりやすくなりますね。