世界を動かす技術を、日本語で。

Show HN: S3mini – 小型で高速なS3互換クライアント、依存関係なし、エッジ対応

概要

  • s3mini は超軽量・高速なTypeScript製S3クライアント
  • Node.jsやEdge環境(Cloudflare Workers等)で動作、ブラウザ非対応
  • 主要なS3互換ストレージ(Cloudflare R2, Backblaze B2等)で動作確認済み
  • 必要最小限のS3 APIのみを搭載、依存パッケージゼロ
  • セキュリティや貢献方法も明記、MITライセンス採用

s3miniとは

  • s3miniNode.jsEdgeプラットフォーム 向けの超軽量S3クライアント
  • 14 KB (minified)で、平均 15%高いops/s を実現
  • TypeScript 製、依存パッケージなしの設計
  • AWS SigV4 署名をサポート(プリサインリクエスト不要)
  • Cloudflare WorkersBunMinIO など幅広いS3互換サービスに対応
  • ブラウザ環境では非対応 (Node.js APIやpolyfill利用のため)

主な特徴

  • パフォーマンス重視 :軽量かつ高速、リソース制約環境に最適
  • BYOS3 (Bring Your Own S3):任意のS3互換バケット利用可能
  • 実装APIを厳選 :list/put/get/deleteなど基本機能に絞り込み
  • 環境対応 :Node.js、Bun、Cloudflare Workersなどエッジ環境向け
  • 依存ゼロ :外部パッケージ未使用、シンプル設計

サポートされる主な操作

  • バケット操作
    • HeadBucket (bucketExists)
    • createBucket
  • オブジェクト操作
    • ListObjectsV2 (listObjects)
    • GetObject (getObject, getObjectWithETag等)
    • PutObject (putObject)
    • DeleteObject (deleteObject)
    • HeadObject (objectExists, getEtag等)
    • Multipart Upload (list/create/complete/abort/uploadPart)
  • CopyObject は未実装(今後対応予定)

インストール方法

  • npm: npm install s3mini

  • yarn: yarn add s3mini

  • pnpm: pnpm add s3mini

  • 注意 :Node.js/Bun/Cloudflare Workers専用、ブラウザ非対応

  • Cloudflare Workers利用時 :wrangler設定でnodejs_compatフラグを有効化推奨

基本的な使い方

  • インポート例
    • import { s3mini, sanitizeETag } from 's3mini';
  • クライアント初期化
    • アクセスキー・シークレット・エンドポイント・リージョンを指定
  • バケット存在確認
    • await s3client.bucketExists();
  • バケット作成
    • await s3client.createBucket();
  • オブジェクト操作
    • 存在確認: await s3client.objectExists(key);
    • アップロード: await s3client.putObject(key, content);
    • 取得: await s3client.getObject(key);
    • 削除: await s3client.deleteObject(key);
  • リスト取得
    • await s3client.listObjects();
    • プレフィックスや最大件数指定も可能
  • マルチパートアップロード
    • アップロードID取得: await s3client.getMultipartUploadId(key);
    • パートアップロード: await s3client.uploadPart(key, uploadId, buffer, partNumber);
    • 完了: await s3client.completeMultipartUpload(key, uploadId, parts);
    • アボート: await s3client.abortMultipartUpload(key, uploadId);
  • 詳細な使用例やテスト :USAGE.md・examples・tests参照

セキュリティに関する注意点

  • ログ出力時 にアクセスキー等の機密情報を自動でマスク
  • 認証情報は環境変数や安全な保管場所で管理 (ハードコーディング厳禁)
  • S3バケットへのアクセス権限 を必ず確認
  • マルチパートアップロード はコスト増加の可能性に注意
  • 利用上の責任 :データ損失やセキュリティ事故は自己責任
  • 脆弱性報告 はメールで開発者へ直接連絡
  • 詳細 :SECURITY.md参照

コントリビューションについて

  • バグ報告・機能要望 :GitHub Issuesで受付
    • 環境・エラーメッセージ・再現手順等をできるだけ詳しく記載
  • プルリクエスト歓迎 :新機能追加やバグ修正時はdevブランチへ
    • 大きな変更は事前にIssueで相談推奨
  • 軽量性重視 :依存パッケージ追加は最小限に
    • 機能追加時はサイズ増加に見合う価値が必要
  • コミュニティ行動規範 :建設的・敬意あるコミュニケーションを推奨
    • 詳細はCODE_OF_CONDUCT.md参照
  • 自己解決した場合 :Issueに経緯や解決策を記載してクローズ推奨

ライセンスとスポンサー

  • MITライセンス 採用(LICENSE.md参照)
  • スポンサーシップ :開発支援を希望する場合は寄付も歓迎
    • 継続的な開発・改善の原動力

公式リポジトリやドキュメント

  • GitHub
  • npm
  • Issue投稿
  • 詳細ドキュメント:USAGE.md、SECURITY.md、CODE_OF_CONDUCT.md、LICENSE.md

Hackerたちの意見

Nodeのためのプロジェクトだね。いい感じのプロジェクトだと思う。RustのS3ライブラリをいくつか試したけど、シンプルで依存関係が少ないクライアントが必要だよね。問題は、特定の機能(asyncとかhttp2とか)をサポートし始めると、せっかくのノーデププロジェクトが大きくなっちゃうことだよ。

最近同じ問題に直面して、https://crates.io/crates/rusty-s3を使ったよ。

JSの場合 > Node、Bun、Cloudflare Workers、他のエッジプラットフォームで動くよ。

チェックサムをやってないから、たぶん小さくて速いんだろうね。

それって意味あるの?それともオプションにした方がいいのかな?

ちょっと関連するけど、s5cmd[1]っていうのを見つけたよ。主にパフォーマンスとS3バケットの高速アップロード/ダウンロード、同期に焦点を当ててるみたい。> s3cmdの32倍、aws-cliの12倍速いらしいよ。ダウンロードでは、s5cmdが40Gbpsのリンク(約4.3 GB/s)をフルに活用できるけど、s3cmdとaws-cliはそれぞれ85 MB/sと375 MB/sしか出せないんだって。[1] https://github.com/peak/s5cmd

s5cmdはrsync.netプラットフォームに組み込まれてるよ。詳しくはここを見てね: https://news.ycombinator.com/item?id=44248372

面白いプロジェクトだけど、実際にAWSで動くか確認する前に発表したのはちょっと面白いね?

個人的にはAWSあんまり好きじゃないんだよね。設定しようとしたけど、「めっちゃ面倒くさい」って思って、他のプラットフォームに集中することにした。今はCephをテスト/設定してるところだけど、オープンソースだから!暇な才能ある変わり者はどんどん参加してほしいね!

これすごい!Amazonが提供してる膨大なSDKの代わりになるものをずっと待ってた。重要な質問なんだけど、サイン付きURLを取得する方法はあるの?

今のところ、残念ながらサイン付きURLはサポートされてないよ。そこはあまり重点を置いてなかったけど、もしシンプルな実装方法を見つけたら、統合する手助けはできるよ。全体的に見ると、余計な複雑さとサイズが増えるから、別のフォークやプロジェクトにした方がいいかもね。

もしSDKが気に入らなければ、S3をRESTコールで使えばいいよ。

TFAと似た目的でS3クライアントを作ったけど、事前サインに対応してるよ: https://github.com/nikeee/lean-s3 事前サインはAWS SDKより約30倍速いし、非同期じゃないよ。どうしてそう見えるのかはここで読めるよ: https://github.com/nikeee/lean-s3/blob/main/DESIGN_DECISIONS...

https://raw.githubusercontent.com/good-lly/s3mini/dev/perfor... インスタンスが速くなると遅くなるの?オペレーション毎秒と時間を見てるんだけど、どう読み間違えてるのかな?

転送しているファイルのサイズが大きくなるから、各操作が大きくなって、だから遅くなるって読んだよ。

いろんなオブジェクトサイズ(1、8、100MiB)でPutObject[0]のパフォーマンスを測定してるみたいだね。[0] https://github.com/good-lly/s3mini/blob/30a751cc866855f783a1... [1] https://github.com/good-lly/s3mini/blob/30a751cc866855f783a1...

libcurlもAWS認証に対応してて、--aws-sigv4を使うと、何もインストールせずに完全互換のS3クライアントが手に入るよ!(多分、curlはもうインストールされてると思うけど)

うん、でもそれはCloudflareやVercel、他のサーバーレス環境では動かないよ。せいぜいノードAPIにしかアクセスできないから。

これ、obstoreと比べてどうなの?

これめっちゃかっこいいね。あと、Minioの代わりにシンプルな単一バイナリのS3サーバーが見たいな。DuckDBのUIみたいな小さな組み込みUIがあったら最高。

「Minioの代わりにシンプルな単一バイナリのS3サーバーが見たいな。」GarageはウェブUIがないけど、要件には合ってると思うよ。これは単一の静的バイナリにコンパイルされるS3実装で、ノードのハードウェアが必ずしも同じでなくても使えるように設計されてるんだ(つまり、CPUが違ったり、RAMが違ったり、ストレージサイズが違ったりする場合ね)。全体的に、Garageは「ホームサーバースケール」のオブジェクトストレージや、リアルなS3サーバーを素早くセットアップするための私のお気に入りのソリューションだよ。Garage用の非公式なWeb UIもあるみたいだけど、これを使うと単一バイナリじゃなくなっちゃうから、組み込みのウェブUIほど便利じゃないね。

これ、めっちゃいいね。でも、エッジコンピューティングと、例えば普通のHetzner VPSの価格比較した人いる?