mcpField
O
object-storage

object-storage

github.com/bagelholeクラウド・DevOps1.2k352 回インストール23 週間前に更新
リポジトリ

object-storage について

AWS S3、MinIO、および互換オブジェクトストレージを管理するためのスキルです。CLI の操作例を通じて、バケットポリシー、ライフサイクル、バージョン管理、暗号化、MinIO のセルフホスト、データ同期を扱います。

主な機能

  1. 01AWS S3 バケット管理
  2. 02ファイルのアップロード、ダウンロード、同期
  3. 03バケットポリシーと IAM の設定
  4. 04ライフサイクルルールとバージョン管理
  5. 05MinIO のデプロイと mc による管理

活用シーン

  1. 01アプリ資産、バックアップ、ログ、メディアの保存
  2. 02MinIO によるオンプレミス S3 互換ストレージの構築
  3. 03オブジェクトの自動移行や期限切れの設定
  4. 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 nameIAM ポリシー、バケットポリシー、パブリックアクセスブロックの設定を確認します
アップロードが遅い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 ホストのサーバー構築と保守

コメント