S3
AWS CLI、AWS SDK、その他の S3 クライアントで、RustFS の S3 互換 API を設定して使う方法を説明します。
RustFS は、一般的なオブジェクトストレージのワークロード向けに、S3 互換の REST API を公開します。AWS Signature Version 4(SigV4)に対応しており、RustFS のエンドポイント、リージョン、認証情報、アドレス指定方式を設定すれば、AWS CLI、AWS SDK、その他の S3 クライアントから利用できます。
概要
S3 はデータをバケットとオブジェクトに整理します。既定のパススタイルアクセスでは、RustFS の URL は次のようにストレージへ対応します。
http://localhost:9000/my-bucket/path/to/hello.txt
| bucket | |---- object key ----|RustFS は、アプリケーション、バックアップツール、SDK が使う一般的な S3 データプレーンを対象とします。
| 領域 | 対応するワークフロー |
|---|---|
| バケット | 作成、削除、一覧、検査、ロケーションの取得 |
| オブジェクト | Put、Get、Head、コピー、削除、一括削除、範囲読み取り、条件付きリクエスト、ユーザーメタデータ |
| 一覧 | ListObjects、ListObjectsV2、プレフィックス、デリミタ、マーカー、ページネーション |
| 大きなオブジェクト | マルチパートアップロードの作成、アップロード、コピー、一覧、完了、中止 |
| データ管理 | バージョニング、ライフサイクルルール、バケットとオブジェクトのタグ、チェックサム、オブジェクトロック |
| アクセス制御 | IAM の認証情報とポリシー、バケットポリシー、パブリックアクセスブロック、署名付きの GET/PUT URL |
| 連携 | CORS、バケット通知、レプリケーション設定、サーバー側の暗号化のワークフロー |
認証されたクライアントは、アクセスキーとシークレットキーでリクエストに署名します。匿名リクエストは、適用されるバケットポリシーに対して評価されます。
互換性の範囲
RustFS は、サポートする機能について広い範囲の S3 API 互換を提供しますが、すべての AWS S3 API や MinIO API と同一ではありません。高度な動作やベンダー固有の動作に依存する前に、既知の互換性の違いを確認し、対象の RustFS リリースに対して検証します。
設定
S3 API は、RustFS のメインリスナーで有効です。別のプロトコル切り替えは不要です。
| 変数 | 用途 | 既定値 |
|---|---|---|
RUSTFS_ADDRESS | S3 API のバインドアドレス | :9000 |
RUSTFS_REGION | リクエストの署名と、リージョンを認識するクライアントが使うリージョン | us-east-1 |
RUSTFS_ACCESS_KEY | ルートアクセスキー | インストールごとに異なる |
RUSTFS_SECRET_KEY | ルートシークレットキー | インストールごとに異なる |
RUSTFS_SERVER_DOMAINS | 仮想ホスト形式のリクエストに使う、カンマ区切りのドメイン | 未設定 |
RUSTFS_TLS_PATH | rustfs_cert.pem と rustfs_key.pem を含むディレクトリ | 未設定 |
アプリケーションにはルート認証情報ではなく、IAM ユーザーまたはサービスアカウントを使い、必要な S3 アクションだけを許可します。
パススタイルアクセス
パススタイルアクセスが既定であり、DNS の設定は不要です。バケット名は、リクエストパスの先頭の要素です。
http://localhost:9000/my-bucket/hello.txtクライアントには、次を設定します。
- エンドポイント:
http://localhost:9000 - リージョン:
us-east-1 - アクセスキー:
<your-access-key> - シークレットキー:
<your-secret-key> - アドレス指定方式: パススタイルアクセス
一部のクライアントは、既定で仮想ホスト形式のリクエストを使います。パススタイルのオプションを有効にします。例として、AWS SDK の設定では force_path_style=true、Terraform では s3_use_path_style = true があります。
仮想ホスト形式
仮想ホスト形式では、バケット名をホスト名に含めます。RustFS に認識させるベースドメインを、それぞれ RUSTFS_SERVER_DOMAINS に設定します。
export RUSTFS_SERVER_DOMAINS="s3.example.com"同じオブジェクトは、次のアドレスになります。
https://my-bucket.s3.example.com/hello.txt*.s3.example.com のようなワイルドカード DNS が、RustFS のエンドポイントへ解決するよう設定します。HTTPS では、証明書がバケットのホスト名もカバーする必要があります。ドットを含むバケット名では、単一ラベルのワイルドカードが複数ラベルにまたがらないため、証明書名を明示する必要がある場合があります。
サーバードメインを設定する
RUSTFS_SERVER_DOMAINS を設定していない限り、仮想ホスト形式のリクエストを送らないでください。未設定の場合、RustFS はリクエストをパススタイルアクセスとして扱い、ホスト名からバケットを特定できません。
TLS とネットワークアクセス
本番では、rustfs_cert.pem と rustfs_key.pem を含むディレクトリを RUSTFS_TLS_PATH に設定し、https:// のエンドポイントを使います。クライアントが、発行元の認証局を信頼するようにします。
設定した S3 API のポートを、ホストのファイアウォールとロードバランサーで許可します。既定は TCP ポート 9000 です。このリスナーは RustFS の管理トラフィックとノード間トラフィックも運ぶため、適切なネットワーク制御と IAM 制御がないまま、制限なく公開しないでください。
使い方
次の例では、標準のローカルエンドポイントとともに AWS CLI を使います。続ける前に、AWS CLI をインストールして設定します。
AWS CLI を設定する
aws configure求められたら、次の値を入力します。
AWS Access Key ID [None]: <your-access-key>
AWS Secret Access Key [None]: <your-secret-key>
Default region name [None]: us-east-1
Default output format [None]: jsonすべてのコマンドに RustFS のエンドポイントを渡します。カスタムエンドポイントにより、これらの例は AWS S3 ではなく RustFS を対象にします。
export RUSTFS_ENDPOINT="http://localhost:9000"バケットを作成して一覧する
aws --endpoint-url "$RUSTFS_ENDPOINT" s3api create-bucket \
--bucket my-bucket
aws --endpoint-url "$RUSTFS_ENDPOINT" s3api list-bucketsオブジェクトをアップロードして一覧する
printf 'Hello from RustFS\n' > hello.txt
aws --endpoint-url "$RUSTFS_ENDPOINT" s3 cp \
hello.txt s3://my-bucket/path/to/hello.txt
aws --endpoint-url "$RUSTFS_ENDPOINT" s3 ls \
s3://my-bucket/path/to/AWS CLI は、転送設定が大きなオブジェクトに対してマルチパートを選んだ場合、自動的にマルチパートアップロードを使います。RustFS は、標準のマルチパートの create、upload-part、complete、list、abort の各ワークフローに対応しています。
オブジェクトをダウンロードして確認する
aws --endpoint-url "$RUSTFS_ENDPOINT" s3 cp \
s3://my-bucket/path/to/hello.txt ./downloaded-hello.txt
aws --endpoint-url "$RUSTFS_ENDPOINT" s3api head-object \
--bucket my-bucket \
--key path/to/hello.txt署名付き URL を作成する
認証情報を公開せずにオブジェクトをダウンロードできる、有効期限付きの URL を生成します。
aws --endpoint-url "$RUSTFS_ENDPOINT" s3 presign \
s3://my-bucket/path/to/hello.txt \
--expires-in 3600受け取り側が使うホスト名、スキーム、ポート、リージョン、オブジェクトパスは、URL の署名に使った値と一致する必要があります。別のマシン向けの URL を生成するときは、外部から到達できるエンドポイントを使います。
オブジェクトとバケットを削除する
aws --endpoint-url "$RUSTFS_ENDPOINT" s3 rm \
s3://my-bucket/path/to/hello.txt
aws --endpoint-url "$RUSTFS_ENDPOINT" s3api delete-bucket \
--bucket my-bucketS3 バケットは、削除する前に空である必要があります。
既知の互換性の違い
現在の RustFS の互換性テストは、上で説明した一般的なワークフローを対象としています。次の領域は、AWS S3 または MinIO と同等ではありません。
- バケットアクセスログとバケット所有者コントロールは、完成した機能ではなく、未実装(予定)です。
- ACL による認可は、意図的にサポートしていません。既定 ACL のヘッダーには部分的な互換がありますが、XML の grant ポリシーは
NotImplementedを返します。IAM とバケットポリシーを優先することを推奨します。 - POST Object のフォームアップロードは実装されていますが、そのワークフローのチェックサム処理は完了していません。
- マルチパートアップロードの一覧とパート検索における一部の境界条件は、既定の互換性検証(ゲート)の対象外です。
- S3 Select は、現時点では非圧縮の入力だけを受け付けます。
- Access Point と Outposts のコピーソース形式は、実装されていません。
- MinIO の管理 API は別の互換範囲であり、S3 データプレーンの対応から推測しないでください。
ツールが AWS 固有のサービス、ストレージクラス、アカウントの所有権制御、エンドポイント検出を前提としている場合、クライアントの動作が異なることもあります。RustFS のエンドポイントは常に明示して設定し、アプリケーションが使う操作そのものをテストします。
次のステップ
- 一連の手順は、AWS CLI の例に従います。
- アプリケーション連携には、S3 SDKを選びます。
- 認証情報とアクセスポリシーを設定します。
- 信頼できるネットワークの外へエンドポイントを公開する前に、TLSを有効にします。