S3互換のオブジェクトストレージサーバー (Rust + axum + SQLite)
cp .env.example .env
# DB作成 & マイグレーション
sqlx database create --database-url "sqlite:./database.db"
sqlx migrate run --database-url sqlite:./database.db
# サーバー起動
cargo run
# -> listening on http://127.0.0.1:8080ダミーのクレデンシャルを設定:
aws configure
AWS Access Key ID: test
AWS Secret Access Key: test
Default region name: us-east-1
Default output format: json--endpoint-url でローカルサーバーに向ける。
s3api を使うとAPI単位で1リクエストずつ叩けるのでデバッグしやすい:
# 1. バケット作成 (PUT /test-bucket)
aws --endpoint-url http://127.0.0.1:8080 s3api create-bucket --bucket test-bucket
# 2. バケット一覧取得 (GET /)
aws --endpoint-url http://127.0.0.1:8080 s3api list-buckets
# 3. テストファイルを作ってPutObject (PUT /test-bucket/hello.txt)
echo "Hello, S3!" > /tmp/hello.txt
aws --endpoint-url http://127.0.0.1:8080 s3api put-object --bucket test-bucket --key hello.txt --body /tmp/hello.txt --content-type text/plain
# 4. バケット削除 (DELETE /test-bucket)
aws --endpoint-url http://127.0.0.1:8080 s3api delete-bucket --bucket test-bucket
# 5. object取得 (GET /test-bucket)
### ダウンロード
aws --endpoint-url http://127.0.0.1:8080 s3api get-object --bucket test-bucket --key hello.txt downloaded.txt
# 6. object削除 (DELETE /test-bucket)
### ダウンロード
aws --endpoint-url http://127.0.0.1:8080 s3api delete-object --bucket test-bucket --key hello.txtBASE="aws --endpoint-url http://127.0.0.1:8080 --region us-east-1"
${=BASE} s3api head-bucket --bucket test-bucket
# HeadBucket(存在しない)
${=BASE} s3api head-bucket --bucket no-such-bucket-xyz
# オブジェクトを置く(HeadObject の前提)
${=BASE} s3 cp ./README.md s3://test-bucket/photos/2024/cat.jpg
# HeadObject(存在する)
${=BASE} s3api head-object --bucket test-bucket --key photos/2024/cat.jpg
# HeadObject(存在しない)
${=BASE} s3api head-object --bucket test-bucket --key photos/2024/missing.jpg
sqlite> .tables
_sqlx_migrations buckets credentials objects
| テーブル | 用途 |
|---|---|
| buckets | バケット管理 |
| objects | オブジェクトメタデータ |
| credentials | アクセスキー管理 |