👨🏼‍💻

開発効率UP!Amazon S3のモックアプリを作ってS3をシミュレートする

2024/07/11に公開

はじめに

Amazon S3のモックアプリケーション「MOS3」を開発しました。モススリーと読みます。
LocalStackのように、ローカル環境で動作するS3ライクなアプリケーションになります。

MOS3はブラウザ上でファイル操作ができるGUIアプリケーションです。CLIからaws s3 cp等のコマンドを打つことなく、ファイルアップロードが可能です。
alt text

また、MOS3とAWS SDKを接続することでSDKからのS3操作リクエストをMOS3で受け付けることが可能です。

ソースコードはこちらです。
https://github.com/tttol/mos3

開発背景

自分はアプリエンジニアです。
Java等を使ってWebアプリケーションを作ることが多いです。

自分が作るアプリは外部ストレージとしてS3を使うことが多く、ローカル環境での動作確認にもS3との接続が必要になることが多いです。
開発用のAWSアカウントを用意して本物のS3バケットを使うこともありますが、小規模なアプリだとアカウントをわざわざ用意するのが面倒なときもあります。そのときは今までLocalStackをS3のモックとして使っていました。

LocalStackは優秀で便利なOSSなんですが、個人的に以下の課題を感じていました。

  • CLIからの操作が基本となるため、GUIでのファイル操作が難しい
    • GUI機能がないわけではないが、自分の求めるものではなかった
  • LocalStackはS3以外のAWSリソースも提供しているが、自分の場合S3以外のリソースを使うことはあまりない。多機能過ぎる。

「課題を感じてるなら納得いくものを自分で作ればいいのでは?!」という発想になり、MOS3を作ることにしました。

機能

ローカル環境でS3の代わりとして利用可能

MOS3は http://localhost:33333/s3 で起動します。
※インストール方法の詳細はREADMEを参照ください。

MOS3はそれ単体でS3ライクなローカルファイルサーバーとして利用できますが、AWS SDKからのリクエストを受け付けることも可能です。
例えば、AWS SDK for JavaのgetObjectsメソッドからMOS3にリクエストを送ると、指定されたkeyのオブジェクトをレスポンスとして返却します。

AWS SDK for JavaからMOS3を呼び出す場合、S3Clientのエンドポイントにhttp://localhost:3333を指定する必要があります。以下はそのコードサンプルです。

S3Client s3 = S3Client.builder()
        .region(region)
        .endpointOverride(new URI("http://localhost:3333"))
        .build();

ブラウザからファイル操作

MOS3はブラウザからファイル・ディレクトリの操作が可能です。

ファイルアップロードは「New File」ボタンから実行します。
alt text

新規ディレクトリの作成は「New Dir」ボタンから実行します。
alt text

ファイルのダウンロードはファイルをクリックすると実行されます。
alt text

ファイル・ディレクトリ削除は右端のゴミ箱アイコンから実行します。
alt text

PCのローカルディレクトリとの紐づけ

docker run -p 3333:3333 -v ./upload:/app/upload -it --rm tttol/mos3:latest

上記はMOS3の実行コマンドです。(READMEより引用)
MOS3はDockerコンテナ上で稼働します。

ここで注目すべき点は、-vオプションでマウントを行っている点です。
MOS3にアップロードされたファイルは内部的には/app/uploadというディレクトリに保存されます。
コンテナ起動時に-v ./upload:/app/uploadでマウントすることで、./uploadディレクトリにMOS3上のファイルが同期されます。
そのため、MacのFinderやWindowsのExplorerからMOS3上のファイルを直接操作することが可能です。

将来実装予定の機能

MOS3はまだまだ発展途上のアプリケーションです。
将来実装したい機能の一部を下記に示します。

Java以外のAWS SDKリクエストの受付

私はJavaをよく使うので、AWS SDK for Javaからのリクエストは基本的に受け付けるよう実装しています。
逆に、Java以外のSDKに関しては動作するものとしないものがあり、そこの動作は保証できていません。
ゆくゆくはJava以外のSDKリクエストも受け付けるよう拡張したいですが、これは将来の課題です。

AWS CLIリクエストの受付

AWS CLIからのls, mb, cp, rmなどのコマンドリクエスト受付については、まだ実装途中です。
最低限lsとcpは受け付けますが、それ以外のコマンドの受付は将来の課題です。

さいごに

MOS3はOSSです(MIT License)。Issue, Pull Requestは歓迎します。
もっと使いやすいアプリになるよう、コツコツと育てていきます。

GitHubで編集を提案

Discussion