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

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

2025年6月11日原文(github.com)

概要

  • 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コールで使えばいいよ。

Hacker Newsで議論の続きを見る