コンテンツにスキップ

ProxmoxVE メモ

Ceph RadosgwにS3パケットを生やすスクリプト

Section titled “Ceph RadosgwにS3パケットを生やすスクリプト”

アプリ用領域を用意するためにradosgw-adminでユーザー作った後にs3互換クライアントを使って別wでバケット生やすのめんどくさいとGeminiに嘆いたらさっと出してくれた奴。

追加でjqコマンドだけ入れれば使える。

ちゃんと動作確認済。

create-s3-app.sh ユーザー名 パケット名(省略OK) クオータ制限(省略OK)

Section titled “create-s3-app.sh ユーザー名 パケット名(省略OK) クオータ制限(省略OK)”
#!/bin/bash
set -e
# --- ProxmoxのRGW環境に合わせて変更 ---
RGW_ENDPOINT="http://localhost:7480"
# ------------------------------------
APP_USER=$1
BUCKET_NAME=${2:-$APP_USER}
MAX_SIZE=$3 # 例: 10G, 500M, 1T (省略時は無制限)
if [ -z "$APP_USER" ]; then
echo "使い方: $0 <ユーザー名> [バケット名] [最大容量(例: 50G)]"
exit 1
fi
echo "1. ユーザー作成中 ($APP_USER)..."
USER_JSON=$(radosgw-admin user create --uid="$APP_USER" --display-name="$APP_USER app user")
ACCESS_KEY=$(echo "$USER_JSON" | jq -r '.keys[0].access_key')
SECRET_KEY=$(echo "$USER_JSON" | jq -r '.keys[0].secret_key')
# 容量制限(クォータ)の設定
if [ -n "$MAX_SIZE" ]; then
echo " -> 容量制限を設定中 ($MAX_SIZE)..."
radosgw-admin quota set --quota-scope=user --uid="$APP_USER" --max-size="$MAX_SIZE"
radosgw-admin quota enable --quota-scope=user --uid="$APP_USER"
QUOTA_INFO="$MAX_SIZE"
else
QUOTA_INFO="無制限"
fi
echo "2. バケット作成中 ($BUCKET_NAME)..."
HOST=$(echo "$RGW_ENDPOINT" | sed -e 's|^[^/]*//||' -e 's|/.*$||')
REGION="us-east-1"
SERVICE="s3"
DATE_STAMP=$(date -u +"%Y%m%d")
AMZ_DATE=$(date -u +"%Y%m%dT%H%M%SZ")
EMPTY_HASH="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
CANONICAL_REQUEST="PUT
/$BUCKET_NAME
host:$HOST
x-amz-content-sha256:$EMPTY_HASH
x-amz-date:$AMZ_DATE
host;x-amz-content-sha256;x-amz-date
$EMPTY_HASH"
CANONICAL_HASH=$(printf "%s" "$CANONICAL_REQUEST" | openssl dgst -sha256 -hex | awk '{print $NF}')
CREDENTIAL_SCOPE="$DATE_STAMP/$REGION/$SERVICE/aws4_request"
STRING_TO_SIGN="AWS4-HMAC-SHA256
$AMZ_DATE
$CREDENTIAL_SCOPE
$CANONICAL_HASH"
hmac_sha256() {
printf "%s" "$2" | openssl dgst -sha256 -mac HMAC -macopt "$1" | awk '{print $NF}'
}
K_DATE=$(hmac_sha256 "key:AWS4$SECRET_KEY" "$DATE_STAMP")
K_REGION=$(hmac_sha256 "hexkey:$K_DATE" "$REGION")
K_SERVICE=$(hmac_sha256 "hexkey:$K_REGION" "$SERVICE")
K_SIGNING=$(hmac_sha256 "hexkey:$K_SERVICE" "aws4_request")
SIGNATURE=$(hmac_sha256 "hexkey:$K_SIGNING" "$STRING_TO_SIGN")
AUTH_HEADER="AWS4-HMAC-SHA256 Credential=$ACCESS_KEY/$CREDENTIAL_SCOPE, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=$SIGNATURE"
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X PUT "$RGW_ENDPOINT/$BUCKET_NAME" \
-H "Host: $HOST" \
-H "x-amz-date: $AMZ_DATE" \
-H "x-amz-content-sha256: $EMPTY_HASH" \
-H "Authorization: $AUTH_HEADER")
if [ "$HTTP_STATUS" -ne 200 ]; then
echo "エラー: バケットの作成に失敗しました (HTTP Status: $HTTP_STATUS)"
exit 1
fi
echo "=========================================="
echo "払い出し完了!アプリの環境変数に設定してください:"
echo "S3_ENDPOINT : $RGW_ENDPOINT"
echo "S3_BUCKET : $BUCKET_NAME"
echo "S3_ACCESS_KEY : $ACCESS_KEY"
echo "S3_SECRET_KEY : $SECRET_KEY"
echo "QUOTA_LIMIT : $QUOTA_INFO"
echo "=========================================="