冬休みにオブジェクトストレージをAIと作った

冬休みにオブジェクトストレージをAIと作った

成果物: https://github.com/kamijin-fanta/massive-storage

作ったもの

S3互換のオブジェクトストレージサービス「Massive Storage」を実装しました。AWS SDKやs3cmdなど標準的なS3クライアントから利用できます。

主な特徴

  • S3互換API: 既存のS3クライアントがそのまま使える
  • プラガブルアーキテクチャ: バックエンドの切り替えが可能
  • 2つの動作モード:
    • ローカルモード: 開発・小規模運用向け(外部依存なし)
    • 分散モード: クラウドスケール向け(TiKV + SeaweedFS)
  • 機能対応: Object Versioning, Multipart Upload, Range Request など割と対応している

使用技術

  • Go言語で実装
  • メタデータ: TiKV(分散KVストア)またはローカルファイルシステム
  • Blobストレージ: SeaweedFS(分散オブジェクトストレージ)またはローカルファイルシステム
  • 認証: AWS Signature V4

実際にAWS CLIで以下のようなコマンドが動作します:

# バケット作成
aws --endpoint-url http://localhost:8080 s3 mb s3://my-bucket

# ファイルアップロード
aws --endpoint-url http://localhost:8080 s3 cp file.txt s3://my-bucket/

# ファイルダウンロード
aws --endpoint-url http://localhost:8080 s3 cp s3://my-bucket/file.txt downloaded.txt

オブジェクトストレージのmetaストア

一瞬使ったこと無いしFoundationDBを使おうと思ったんですが、以下の理由から一旦採用を諦めました。そしていつも通りTiKVを使いました。

  • GoライブラリがPure GoではなくBinding(これはいい)
  • クラスタとクライアントライブラリが割と厳密にバージョンを合わせる必要がある
  • FoundationDBのクラスタ間通信はマイナーバージョンアップで互換性がなくなるので、アップグレードの際にはクラスタ停止が必要
  • すごいスケールするわけでもなさそう
  • そこまで頑張って入れる必要は今回はなさそうに思えた
  • TiKVが雑に使えて楽すぎる

今回はTiKVをトランザクションを持たないRawKVでアクセスしました。 しかしながら、S3,GCSで対応している強整合性を実現するためには恐らくトランザクションが必須であり、TxAPIを使ったほうが良いなとは思います。 具体的にはListObjectsV2のレスポンスで一貫性を保つためにトランザクションが必要です。

ただ、TiKVが”AWS S3” “GCS” というサービスに耐えれるかと言うと全然そういう事はないです。 TiKVはキーの分割を数十MB〜数百MB単位で行い、このリージョンごとにRaftグループを形成します。 また、基本的に1ノードに存在するRocksDBインスタンスは1つです。 こういった設計上の制約から、真にスケールが必要な用途には向きません。

GCSは公開資料によると、Spanner(Cloudじゃない方)をメタデータストアに使っているようです。 SpannerとTiKVの違いは論文を読んでもらうとして、本当にめちゃくちゃ単純化すると、Regionと合意グループが1:1ではなく、複数の複数のRegionにまたがる合意グループを形成できる特徴などを積み重ねて、TiKVから数桁高いスケーラビリティを実現しているようです。

さすがにトランザクション対応のスケールする分散KVSをClaude Proで作るというのは全方位において厳しそうなので一旦諦め…

Blobストア

BlobストアにはSeaweedFSを使いました。 Blobストアをここでは、チャンクを複数ノードに分散して永続化し、クライアントに対して識別子を返し、リペアなどを行うもの定義しています。

こういった役割を持つOSSはいくつかあり、Dwangoが開発しているFrugalosもその一つです。 Rustで記述されており、HDDを効率的に利用するためのスケジューリングなどを備えています。 https://dwango.github.io/articles/frugalos/

Blobストアは比較的交換しやすいので、将来的に時前で作って置き換えるのも現実的でしょう。

AI活用

今回は、

  1. Claude Code (Pro, Sonnet 4.5)
  2. Codex Agent (Plus, GPT-5.2-Codex, GPT-5.2-Codex-Max)
  3. Antigravity (Free, Gemini 3 Pro, Gemini 3 Flash, Opus 4.5)
  4. Visual Studio Code Copilot (Inline Suggestions)

を併用していました。上から使っていた頻度です。

作るものが複雑なので、Sonnet 4.5のPlanモードは機能しないと判断し、Codex Agentで ./issues/ 以下にMarkdown文書を書いてもらい、それをClaude Codeで実装するという流れを取りました。

Codex Agentの性能は非常に高く、指示から大幅に外れた文書を書くことは少なかったです。また、開発においてCodex AgentのSandboxは非常に強力ながら、Network Accessを自動的にApproveするという設定は行えずFull Accessを許可するしか無いので若干不便だなと思いました。

AntigravityはFreeなのでRate limitの都合から多用することが出来ませんでしたが、低価格でOpus 4.5を使えるし、PlanはOpus,ActはGemini 3 Flashみたいな事もUI上で自然に可能なのは使い勝手良さそうでした。ただ、Windows11 WSL2上では目玉機能のブラウザ・Agent Managerがうまく動作しなかったので十分に活かしきれていなかったと思います。

結局個人で契約するAI SaaSを、「Claude Pro + ChatGPT Plus」「Google AI Pro + ChatGPT Plus」「ChatGPT Plus」どの組み合わせにしようかとずっと検討していましたが、未だにどれにしようか答えが出てないです…

ccusageは以下のような感じでした。 こういったエコシステムが有るのもClaude Codeの良さですよね。

$ npx ccusage@latest weekly

 ╭───────────────────────────────────────────╮
 │                                           │
 │  Claude Code Token Usage Report - Weekly  │
 │                                           │
 ╰───────────────────────────────────────────╯

┌───────────┬────────────────────────┬──────────┬──────────┬──────────────┬─────────────┬──────────────┬────────────┐
│ Week      │ Models                 │    Input │   Output │ Cache Create │  Cache Read │ Total Tokens │ Cost (USD) │
├───────────┼────────────────────────┼──────────┼──────────┼──────────────┼─────────────┼──────────────┼────────────┤
│ 2025      │                        │        0 │        0 │            0 │           0 │            0 │      $0.00 │
│ 12-14     │                        │          │          │              │             │              │            │
├───────────┼────────────────────────┼──────────┼──────────┼──────────────┼─────────────┼──────────────┼────────────┤
│ 2025      │ - haiku-4-5            │  381,524 │  129,371 │   11,700,519 │ 160,033,004 │  172,244,418 │     $92.75 │
│ 12-28     │ - sonnet-4-5           │          │          │              │             │              │            │
├───────────┼────────────────────────┼──────────┼──────────┼──────────────┼─────────────┼──────────────┼────────────┤
│ 2026      │ - haiku-4-5            │   94,188 │    1,841 │    1,980,161 │  30,724,786 │   32,800,976 │     $16.28 │
│ 01-04     │ - sonnet-4-5           │          │          │              │             │              │            │
├───────────┼────────────────────────┼──────────┼──────────┼──────────────┼─────────────┼──────────────┼────────────┤
│ Total     │                        │  475,712 │  131,212 │   13,680,680 │ 190,757,790 │  205,045,394 │    $109.03 │
└───────────┴────────────────────────┴──────────┴──────────┴──────────────┴─────────────┴──────────────┴────────────┘