object-storage について
AWS S3、MinIO、および互換オブジェクトストレージを管理するためのスキルです。CLI の操作例を通じて、バケットポリシー、ライフサイクル、バージョン管理、暗号化、MinIO のセルフホスト、データ同期を扱います。
主な機能
- 01AWS S3 バケット管理
- 02ファイルのアップロード、ダウンロード、同期
- 03バケットポリシーと IAM の設定
- 04ライフサイクルルールとバージョン管理
- 05MinIO のデプロイと mc による管理
活用シーン
- 01アプリ資産、バックアップ、ログ、メディアの保存
- 02MinIO によるオンプレミス S3 互換ストレージの構築
- 03オブジェクトの自動移行や期限切れの設定
- 04バケットのアクセス制御
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill object-storageインストール後、Claude Code で/object-storageを入力して読み込まれたか確認します。
詳細
オブジェクトストレージ
AWS S3、MinIO(セルフホスト)、互換プロバイダーなどのオブジェクトストレージソリューションを設定、管理します。CLI 操作、バケットポリシー、ライフサイクルルール、バージョニング、暗号化、MinIO クライアント(mc)を扱います。
使用する場面
- アプリケーションのアセット、バックアップ、ログ、メディアファイルの保存
- MinIO を使用した、オンプレミスでの S3 互換オブジェクトストアの構築
- オブジェクトを自動的に移行または期限切れにするライフサイクルルールの設定
- バケットポリシーと IAM によるアクセス制御の実装
- ローカルファイルシステムとオブジェクトストレージ間でのデータ同期
- S3 または MinIO からの静的コンテンツの配信
前提条件
- S3 操作に使用する AWS CLI v2 のインストールと設定(
aws configure) - MinIO のセルフホスト環境の構築に使用する Docker のインストール
- MinIO の管理に使用する MinIO クライアント(
mc)のインストール - 適切な S3 権限を持つ IAM 認証情報
- オブジェクトストレージのエンドポイントへのネットワークアクセス
AWS S3 CLI 操作
バケットの管理
# Create a new bucket
aws s3 mb s3://my-app-assets-prod
# Create a bucket in a specific region
aws s3 mb s3://my-app-assets-eu --region eu-west-1
# List all buckets
aws s3 ls
# List objects in a bucket (with sizes)
aws s3 ls s3://my-app-assets-prod --recursive --human-readable --summarize
# Delete an empty bucket
aws s3 rb s3://my-old-bucket
# Delete a bucket and ALL its contents (destructive)
aws s3 rb s3://my-old-bucket --force
アップロードとダウンロード
# Upload a single file
aws s3 cp ./report.pdf s3://my-app-assets-prod/reports/
# Upload with a specific storage class
aws s3 cp ./archive.tar.gz s3://my-app-assets-prod/archives/ --storage-class GLACIER
# Upload with server-side encryption (AES-256)
aws s3 cp ./sensitive.dat s3://my-app-assets-prod/data/ --sse AES256
# Download a file
aws s3 cp s3://my-app-assets-prod/reports/report.pdf ./downloads/
# Sync a local directory to S3 (upload only changed files)
aws s3 sync ./build/ s3://my-app-assets-prod/static/ --delete
# Sync from S3 to local
aws s3 sync s3://my-app-assets-prod/static/ ./local-copy/
# Sync with exclusion patterns
aws s3 sync ./logs/ s3://my-app-logs/ --exclude "*.tmp" --exclude ".git/*"
# Copy between buckets
aws s3 sync s3://source-bucket/ s3://destination-bucket/ --source-region us-east-1 --region eu-west-1
# Generate a pre-signed URL (temporary access, 1 hour)
aws s3 presign s3://my-app-assets-prod/reports/report.pdf --expires-in 3600
# Recursive delete of a prefix
aws s3 rm s3://my-app-assets-prod/old-data/ --recursive
バージョニング
# Enable versioning on a bucket
aws s3api put-bucket-versioning \
--bucket my-app-assets-prod \
--versioning-configuration Status=Enabled
# Check versioning status
aws s3api get-bucket-versioning --bucket my-app-assets-prod
# List object versions
aws s3api list-object-versions --bucket my-app-assets-prod --prefix reports/
# Restore a previous version (copy old version to current)
aws s3api copy-object \
--bucket my-app-assets-prod \
--copy-source "my-app-assets-prod/reports/report.pdf?versionId=abc123" \
--key reports/report.pdf
# Delete a specific version permanently
aws s3api delete-object \
--bucket my-app-assets-prod \
--key reports/old-report.pdf \
--version-id abc123
バケットポリシー
# Apply a bucket policy from a JSON file
aws s3api put-bucket-policy --bucket my-app-assets-prod --policy file://policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForStaticSite",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-app-assets-prod/static/*"
},
{
"Sid": "DenyUnencryptedUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-app-assets-prod/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
},
{
"Sid": "RestrictToVPC",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-app-assets-prod",
"arn:aws:s3:::my-app-assets-prod/*"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-abc123"
}
}
}
]
}
ライフサイクルルール
# Apply lifecycle configuration
aws s3api put-bucket-lifecycle-configuration \
--bucket my-app-assets-prod \
--lifecycle-configuration file://lifecycle.json
{
"Rules": [
{
"ID": "TransitionLogsToIA",
"Filter": { "Prefix": "logs/" },
"Status": "Enabled",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 365
}
},
{
"ID": "CleanupIncompleteUploads",
"Filter": { "Prefix": "" },
"Status": "Enabled",
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
},
{
"ID": "ExpireOldVersions",
"Filter": { "Prefix": "" },
"Status": "Enabled",
"NoncurrentVersionExpiration": {
"NoncurrentDays": 30
}
}
]
}
# View current lifecycle rules
aws s3api get-bucket-lifecycle-configuration --bucket my-app-assets-prod
# Enable S3 access logging
aws s3api put-bucket-logging --bucket my-app-assets-prod --bucket-logging-status '{
"LoggingEnabled": {
"TargetBucket": "my-app-logs",
"TargetPrefix": "s3-access-logs/"
}
}'
MinIO のセルフホスト環境の構築
Docker によるデプロイ
# Single-node MinIO with persistent storage
docker run -d \
--name minio \
--restart unless-stopped \
-p 9000:9000 \
-p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minio-secret-key-change-me \
-v /data/minio:/data \
minio/minio server /data --console-address ":9001"
Docker Compose(複数ドライブ)
# docker-compose.yml
version: "3.8"
services:
minio:
image: minio/minio:latest
command: server /data{1...4} --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minio-secret-key-change-me
MINIO_BROWSER_REDIRECT_URL: https://minio-console.example.com
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio-data1:/data1
- minio-data2:/data2
- minio-data3:/data3
- minio-data4:/data4
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
volumes:
minio-data1:
minio-data2:
minio-data3:
minio-data4:
# Start the stack
docker compose up -d
# Check health
docker compose ps
curl -s http://localhost:9000/minio/health/live
MinIO クライアント(mc)コマンド
# Install mc
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc && mv mc /usr/local/bin/
# Configure an alias for the MinIO server
mc alias set myminio http://localhost:9000 minioadmin minio-secret-key-change-me
# Configure an alias for AWS S3
mc alias set aws https://s3.amazonaws.com AKIAEXAMPLE SECRETKEYEXAMPLE
# Bucket operations
mc mb myminio/app-data
mc mb myminio/backups
mc ls myminio/
# Upload and download
mc cp ./backup.tar.gz myminio/backups/
mc cp myminio/backups/backup.tar.gz ./restore/
# Sync a directory (mirror)
mc mirror ./static/ myminio/app-data/static/
mc mirror --watch ./static/ myminio/app-data/static/ # Continuous sync
# Set bucket policy (download = public read)
mc anonymous set download myminio/app-data/static
# Set a specific policy from JSON
mc anonymous set-json policy.json myminio/app-data
# Enable versioning
mc version enable myminio/app-data
# Set lifecycle rule: expire objects in tmp/ after 7 days
mc ilm rule add --expiry-days 7 --prefix "tmp/" myminio/app-data
# List lifecycle rules
mc ilm rule ls myminio/app-data
# Create a service account (for applications)
mc admin user svcacct add myminio minioadmin --access-key myapp-key --secret-key myapp-secret
# View server info and disk usage
mc admin info myminio
# Check bucket disk usage
mc du myminio/app-data
# Set a notification target (webhook on object creation)
mc event add myminio/app-data arn:minio:sqs::myqueue:webhook --event put
mc event ls myminio/app-data
トラブルシューティング
| 症状 | 診断コマンド | よくある解決方法 |
|---|---|---|
| S3 でアクセス拒否 | aws s3api get-bucket-policy --bucket name | IAM ポリシー、バケットポリシー、パブリックアクセスブロックの設定を確認します |
| アップロードが遅い | aws s3 cp --debug | マルチパートを使用します:aws configure set s3.multipart_threshold 64MB |
| 署名付き URL で 403 エラー | 時刻のずれと URL の有効期限を確認します | システムクロックを NTP と同期し、URL を再生成します |
| MinIO が正常でない | mc admin info myminio | ディスク容量、コンテナログ、ポートの使用状況を確認します |
| ライフサイクルルールが適用されない | aws s3api get-bucket-lifecycle-configuration | ルールは 1 日に 1 回実行されます。Filter のプレフィックスが一致するか確認します |
| オブジェクトがバージョニングされない | aws s3api get-bucket-versioning | バージョニングを有効にします。遡って適用されることはありません |
| mc:接続が拒否される | mc alias ls | エンドポイント URL、ポート、認証情報を確認します |
| 大規模な同期が遅い | mc mirror --watch で監視します | --multi-thread フラグを使用し、帯域幅を増やします |
関連スキル
block-storage-- MinIO のデータボリュームに使用する基盤ディスクストレージbackup-recovery-- restic で S3/MinIO をバックアップ先として使用nfs-storage-- ファイル単位でアクセスできる共有ストレージの代替手段linux-administration-- MinIO ホストのサーバー構築と保守
コメント
Markdown 対応