mcpField
S
s3

s3

github.com/itsmostafaクラウド・DevOps1.2k267 回インストール2 日前に更新
リポジトリ

s3 について

AWS CLI や boto3 で Amazon S3 を管理する開発者や運用担当者向けのリファレンススキルです。オブジェクトストレージの運用例に加え、セキュリティ、コスト管理、トラブルシューティングを扱います。

主な機能

  1. 01バケットとオブジェクトの管理
  2. 02ストレージクラスとバージョニング
  3. 03AWS CLI と boto3 の操作例
  4. 04セキュリティ・性能・コストの指針
  5. 05一般的な問題の診断

活用シーン

  1. 01ファイルのアップロード・ダウンロード・同期
  2. 02アーカイブ用ライフサイクルポリシーの設定
  3. 03ダウンロード用署名付き URL の生成
  4. 04アクセス拒否や遅いアップロードの調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill s3

インストール後、Claude Code で/s3を入力して読み込まれたか確認します。

同梱ファイルsecurity.md

詳細

AWS S3

Amazon Simple Storage Service(S3)は、業界をリードする耐久性(99.999999999%)を備えた、スケーラブルなオブジェクトストレージを提供します。S3はAWSの基盤となるサービスであり、データレイク、バックアップ、静的ウェブサイトや、その他多くのAWSサービスのストレージとして利用されています。

目次

主な概念

バケット

オブジェクトを格納するコンテナです。バケット名は、すべてのAWSアカウントを通じてグローバルに一意である必要があります。

オブジェクト

S3に保存されるファイルです。データ、メタデータ、一意のキー(パス)で構成されます。最大サイズは5 TBです。

ストレージクラス
クラス用途耐久性可用性
Standard頻繁にアクセスするデータ99.999999999%99.99%
Intelligent-Tieringアクセスパターンが不明なデータ99.999999999%99.9%
Standard-IAアクセス頻度の低いデータ99.999999999%99.9%
Glacier Instant即時取得が必要なアーカイブ99.999999999%99.9%
Glacier Flexibleアーカイブ(取得に数分から数時間)99.999999999%99.99%
Glacier Deep Archive長期アーカイブ99.999999999%99.99%
バージョニング

オブジェクトの複数のバージョンを保持します。データの保護と復旧に不可欠です。

一般的なパターン

ベストプラクティスに沿ったバケットの作成

AWS CLI:

# Create bucket (us-east-1 doesn't need LocationConstraint)
aws s3api create-bucket \
  --bucket my-secure-bucket-12345 \
  --region us-west-2 \
  --create-bucket-configuration LocationConstraint=us-west-2

# Enable versioning
aws s3api put-bucket-versioning \
  --bucket my-secure-bucket-12345 \
  --versioning-configuration Status=Enabled

# Block public access
aws s3api put-public-access-block \
  --bucket my-secure-bucket-12345 \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

# Enable encryption
aws s3api put-bucket-encryption \
  --bucket my-secure-bucket-12345 \
  --server-side-encryption-configuration '{
    "Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]
  }'

boto3:

import boto3

s3 = boto3.client('s3', region_name='us-west-2')

# Create bucket
s3.create_bucket(
    Bucket='my-secure-bucket-12345',
    CreateBucketConfiguration={'LocationConstraint': 'us-west-2'}
)

# Enable versioning
s3.put_bucket_versioning(
    Bucket='my-secure-bucket-12345',
    VersioningConfiguration={'Status': 'Enabled'}
)

# Block public access
s3.put_public_access_block(
    Bucket='my-secure-bucket-12345',
    PublicAccessBlockConfiguration={
        'BlockPublicAcls': True,
        'IgnorePublicAcls': True,
        'BlockPublicPolicy': True,
        'RestrictPublicBuckets': True
    }
)
オブジェクトのアップロードとダウンロード
# Upload a single file
aws s3 cp myfile.txt s3://my-bucket/path/myfile.txt

# Upload with metadata
aws s3 cp myfile.txt s3://my-bucket/path/myfile.txt \
  --metadata "environment=production,version=1.0"

# Download a file
aws s3 cp s3://my-bucket/path/myfile.txt ./myfile.txt

# Sync a directory
aws s3 sync ./local-folder s3://my-bucket/prefix/ --delete

# Copy between buckets
aws s3 cp s3://source-bucket/file.txt s3://dest-bucket/file.txt
署名付きURLの生成
import boto3
from botocore.config import Config

s3 = boto3.client('s3', config=Config(signature_version='s3v4'))

# Generate presigned URL for download (GET)
url = s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'my-bucket', 'Key': 'path/to/file.txt'},
    ExpiresIn=3600  # URL valid for 1 hour
)

# Generate presigned URL for upload (PUT)
upload_url = s3.generate_presigned_url(
    'put_object',
    Params={
        'Bucket': 'my-bucket',
        'Key': 'uploads/newfile.txt',
        'ContentType': 'text/plain'
    },
    ExpiresIn=3600
)
ライフサイクルポリシーの設定
cat > lifecycle.json << 'EOF'
{
  "Rules": [
    {
      "ID": "MoveToGlacierAfter90Days",
      "Status": "Enabled",
      "Filter": {"Prefix": "logs/"},
      "Transitions": [
        {"Days": 90, "StorageClass": "GLACIER"}
      ],
      "Expiration": {"Days": 365}
    },
    {
      "ID": "DeleteOldVersions",
      "Status": "Enabled",
      "Filter": {},
      "NoncurrentVersionExpiration": {"NoncurrentDays": 30}
    }
  ]
}
EOF

aws s3api put-bucket-lifecycle-configuration \
  --bucket my-bucket \
  --lifecycle-configuration file://lifecycle.json
Lambdaへのイベント通知
aws s3api put-bucket-notification-configuration \
  --bucket my-bucket \
  --notification-configuration '{
    "LambdaFunctionConfigurations": [
      {
        "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:ProcessS3Upload",
        "Events": ["s3:ObjectCreated:*"],
        "Filter": {
          "Key": {
            "FilterRules": [
              {"Name": "prefix", "Value": "uploads/"},
              {"Name": "suffix", "Value": ".jpg"}
            ]
          }
        }
      }
    ]
  }'

CLIリファレンス

高レベルコマンド(aws s3)
コマンド説明
aws s3 lsバケットまたはオブジェクトを一覧表示
aws s3 cpファイルをコピー
aws s3 mvファイルを移動
aws s3 rmファイルを削除
aws s3 syncディレクトリを同期
aws s3 mbバケットを作成
aws s3 rbバケットを削除
低レベルコマンド(aws s3api)
コマンド説明
aws s3api create-bucketオプションを指定してバケットを作成
aws s3api put-object詳細に制御してアップロード
aws s3api get-objectオプションを指定してダウンロード
aws s3api delete-object単一のオブジェクトを削除
aws s3api put-bucket-policyバケットポリシーを設定
aws s3api put-bucket-versioningバージョニングを有効化
aws s3api list-object-versionsすべてのバージョンを一覧表示
便利なフラグ
  • --recursive: プレフィックス内のすべてのオブジェクトを処理
  • --exclude/--include: オブジェクトをフィルタリング
  • --dryrun: 変更をプレビュー
  • --storage-class: ストレージクラスを設定
  • --acl: アクセス制御を設定(代わりにポリシーを推奨)

ベストプラクティス

セキュリティ
  • アカウントレベルとバケットレベルでパブリックアクセスをブロックする
  • データ保護のためにバージョニングを有効化する
  • ACLよりもバケットポリシーを使用する
  • 暗号化を有効化する(SSE-S3またはSSE-KMS)
  • 監査のためにアクセスログを有効化する
  • プライベートアクセスにはVPCエンドポイントを使用する
  • 重要なバケットではMFA Deleteを有効化する
パフォーマンス
  • 遠隔地からのアップロードにはTransfer Accelerationを使用する
  • 100 MBを超えるファイルにはマルチパートアップロードを使用する
  • 高スループットを実現するためにキーのプレフィックスをランダム化する(2024年の改善により、重要性は低下)
  • 大きなファイルのダウンロードにはバイト範囲フェッチを使用する
コスト最適化
  • より低コストのストレージに移行するため、ライフサイクルポリシーを使用する
  • アクセスパターンが予測できない場合は、Intelligent-Tieringを有効化する
  • 不完全なマルチパートアップロードを削除する:
    {
      "Rules": [{
        "ID": "AbortIncompleteMultipartUpload",
        "Status": "Enabled",
        "Filter": {},
        "AbortIncompleteMultipartUpload": {"DaysAfterInitiation": 7}
      }]
    }
    
  • ストレージのパターンを分析するためにS3 Storage Lensを使用する

トラブルシューティング

アクセス拒否エラー

原因:

  1. バケットポリシーによってアクセスが拒否されている
  2. IAMポリシーに必要な権限がない
  3. パブリックアクセスブロックによってアクセスが妨げられている
  4. オブジェクトが別のアカウントによって所有されている
  5. VPCエンドポイントポリシーによってアクセスがブロックされている

デバッグ手順:

# Check your identity
aws sts get-caller-identity

# Check bucket policy
aws s3api get-bucket-policy --bucket my-bucket

# Check public access block
aws s3api get-public-access-block --bucket my-bucket

# Check object ownership
aws s3api get-object-attributes \
  --bucket my-bucket \
  --key myfile.txt \
  --object-attributes ObjectOwner
CORSエラー

症状: ブラウザーがクロスオリジンリクエストをブロックする

修正方法:

aws s3api put-bucket-cors --bucket my-bucket --cors-configuration '{
  "CORSRules": [{
    "AllowedOrigins": ["https://myapp.com"],
    "AllowedMethods": ["GET", "PUT", "POST"],
    "AllowedHeaders": ["*"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3600
  }]
}'
アップロードが遅い

解決策:

  • 大きなファイルにはマルチパートアップロードを使用します
  • Transfer Acceleration を有効にします
  • 大きなファイルには aws s3 cp と --expected-size を使用します
  • リージョンへのネットワークスループットを確認します
署名付き URL で 403 エラーが発生する

原因:

  • URL の有効期限が切れている
  • 署名者に権限がない
  • バケットポリシーによってアクセスがブロックされている
  • リージョンが一致していない(v4 署名はリージョンごとに異なります)

解決方法: 署名者に権限があることを確認し、正しいリージョンを使用してください。

参考資料

コメント