読者です 読者をやめる 読者になる 読者になる

AWS上で動作するアプリケーションをいかにローカルで開発するか?

AWSでは様々な便利なサービスが提供されています。中にはRDSやElasticCacheのように既存のミドルウェアに対するマネージドサービスを提供するものもあり、これらについては既存のミドルウェアを使って開発することができますが、AWS固有のサービスについてはアプリケーションを動作させるには実際にサービスに接続する必要があり、開発環境が制限されてしまいます。

もちろんソフトウェア側で抽象化しておき、DIなどの手法を用いてモックに差し替えるという方法も考えられますが、特にストレージとして利用するサービスなどの場合はインタラクションが必要になるのでモックでは再現しづらいですし、やはり実際に動作するサービスに接続して開発やテストを行うほうが効率的です。

そこで、AWSのサービスを擬似的にローカルで再現することのできるプロダクトを集めてみました。

S3

node.jsで動作するs3-proxyが使えます。なぜかわかりませんが、この手のものはnode.js製のものが多いようです。npmコマンドで簡単にインストールできてコマンドも使えるようになるので便利です。

github.com

チームではAWScalaをラップしたScala用のS3クライアントを作っていて、実装を差し替えることでローカルファイルシステムで動かせるようにしていたりします。ただ、このクライアントを使えるケース限定ですし、サポートしていないオペレーションも多いので用途は限定されます。

github.com

SQS

ElasticMQというScalaで記述されたSQS互換インターフェースを持つインメモリのMQサーバがあります。

github.com

日本語の記事も見かけますね。

qiita.com

Kinesis

kinesaliteが使えます。これもnode.js製です。ストレージにはLevelDBを使用しているようです。

github.com

このブログでも以前紹介しました。試せていないのですが、DynamoDB Localやdynaliteと組み合わせればKCLを使用したKinesisアプリケーションも動作させることができるのでしょうか。

takezoe.hatenablog.com

DynamoDB

AWS自身が出しているDynamoDB Localがありますし、Kinesaliteと同じ作者が作っているdynalite(kinesaliteと同じくnode.jsで動作します)というものもあります。

docs.aws.amazon.com

github.com

Lambda

これも触ったことはないのですが、node-lambdaとかが使えるのでしょうか。

github.com

こんな記事もありました。

medium.com

その他

他によく使いそうなものとしてSESがありますが、AWSで提供されているメールボックスシミュレータを使うのが一般的なのでしょうか。また、SNSRubyで書かれたfake_snsというダミーサーバがありました。

github.com

CloudSearchに関してもPythonでテスト用の実装を作っている人がいました。ちゃんと動くのかどうかわかりませんが…。

github.com

職場ではdockerでこれらのプロダクトを組み込んだコンテナを作って、なるべくローカルで開発環境を完結できるようにしています。CIもやりやすくなりますね。