はじめに
開発環境でS3互換のモックサーバーが欲しいときにはMinIOやlocalstack等を使っていたケースもあるかと思いますが、ライセンスの変更や無料プランの機能制限などから、手軽に使えなくなってきた事情もあるようです。
そこで思ったのが「今の時代、こういうものはAIに作ってもらえばよいのでは」ということで、実際に自分でも作ってみました。
技術構成
使用ライブラリ
| ライブラリ | 用途 |
|---|---|
| ASP.NET Core Minimal API | S3互換REST APIサーバー |
| Blazor Server | Web管理UI |
| AWSSDK.S3 | 公式SDK、クライアントサイドのテスト用 |
アーキテクチャ概要
StorageServerプロジェクトは大きく2つのコンポーネントで構成されています。
- S3互換REST APIサーバー: ASP.NET Core Minimal APIをベースに実装したS3互換エンドポイント
- Blazor Server管理UI: ブラウザからバケット・オブジェクトを操作できるWeb UI
S3のREST APIはXMLベースのリクエスト・レスポンスと独特のルーティング規則を持ちますが、Minimal APIのルート定義でそのまま表現しています。
S3 API互換性
主要なS3オペレーションをカテゴリ単位でサポートしています。
| カテゴリ | サポート内容 |
|---|---|
| バケットCRUD | 作成・削除・一覧・存在確認 |
| オブジェクトCRUD | アップロード・ダウンロード・削除・一覧・コピー |
| 一括削除 | DeleteObjects |
| マルチパートアップロード | 作成・パートアップロード・完了・中断・一覧 |
| タグ | バケット・オブジェクト両方のタグ読み書き |
| ACL | バケット・オブジェクト両方のACL読み書き |
| CORS | バケットのCORSルール読み書き |
| バージョニング | 常に有効として扱う |
開発・テスト用ツールなので、Signature V4の検証は行わず、任意のクレデンシャルを受け付けます。
AWS SDKを使った主要なオペレーションの動作確認はしていますが、S3仕様の細かい部分(エラーレスポンスの厳密なフォーマット、エッジケースの挙動など)は確認できていません。
AWS SDKからの接続
AWS SDK for .NETから接続する場合はこんな感じで使えるようになっています。
var config = new AmazonS3Config
{
ServiceURL = "http://localhost:5280",
ForcePathStyle = true
};
var client = new AmazonS3Client(
new BasicAWSCredentials("dummy", "dummy"),
config
);
テスト結果
StorageServer.Clientというテスト用CLIを用意しており、AWS SDK for .NETを使った20シナリオのエンドツーエンドテストを実行できます。
| シナリオ | 内容 |
|---|---|
| 1 | バケット作成 |
| 2 | 階層キー・ユーザーメタデータ付きオブジェクトアップロード |
| 3 | 全オブジェクト一覧(フラット) |
| 4 | デリミタ付き一覧(ディレクトリ風ブラウズ) |
| 5 | ページネーション(MaxKeys) |
| 6 | オブジェクトコピー |
| 7 | Content-Typeとユーザーメタデータ(COPY / REPLACEディレクティブ) |
| 8 | Rangeリクエスト(部分ダウンロード) |
| 9 | 条件付きリクエスト(If-None-Match → 304) |
| 10 | マルチパートアップロード(3パーツ) |
| 11 | オブジェクトタギング |
| 12 | バケットタギング |
| 13 | ListMultipartUploads / ListParts / AbortMultipartUpload |
| 14 | ストレージクラス(STANDARD_IA) |
| 15 | ACL(バケット・オブジェクト) |
| 16 | バケットCORS |
| 17 | オブジェクト削除(404確認) |
| 18 | 一括削除(DeleteObjects) |
| 19 | バケット削除 |
| 20 | 仮想ホスト形式アクセス(DNS未設定の場合はスキップ) |
これらのシナリオはすべてAWS SDK for .NETを使って実行しており、テストが通ることを確認しています。
Web管理UI(Blazor)
独自の工夫として、Blazor Serverを使ったWeb管理UIを実装しています。
以下のような機能があります。
- バケット一覧表示
- バケット作製
- バケット削除
- ファイルアップロード
- 削除
- プレビュー
- メタデータ
- バージョン管理
ファイルブラウザではドラッグ&ドロップによるファイルアップロードも実装しています。
簡易的なプレビュー機能も実装して確認作業をしやすくしています。
AI生成
このプロジェクトは、ほぼほぼAIに作ってもらっています。
S3のAPIについて、XMLのレスポンスフォーマットやヘッダの細かい仕様を一から実装するのはかなり手間がかかります。
しかし今のAIコーディングアシスタントはこういった「仕様が公開されていてコードが長くなる実装」が非常に簡単に実装できます。
実際にやってみると、AWS SDKとの互換性を確認しながら実装を進めることができ、S3互換サーバーの実装がすぐに実装できました。
モックサーバーくらいの規模であれば、既製品に依存するよりも「自分のユースケースに合わせたものをAIに作ってもらう」という選択肢が十分現実的だと感じています。
以前、同じような発想でExcelテンプレートからPDFを出力するレポートライブ来をAIに作ってもらった話も書いているので、そちらもご参照ください。
うさコメ
「必要なものはAIに作ってもらえばよい」という選択肢が現実的になってきた時代だと実感します( ˙ω˙)
細かい部分まで完全にS3と互換性があるわけではありませんが、開発・テスト用途であればAWS SDKを使ったコードの動作確認には十分使えます。
自前で持つことで、ライセンスや機能制限を気にせず使えるのも気楽です。
テスト用のS3モックサーバーが欲しくなったときは、こういうアプローチも試してみてください。
まあ、自分はテスト用にモックサーバーは使っていないんですけど( ˙ω˙)


