s3 について
AWS CLI や boto3 で Amazon S3 を管理する開発者や運用担当者向けのリファレンススキルです。オブジェクトストレージの運用例に加え、セキュリティ、コスト管理、トラブルシューティングを扱います。
主な機能
- 01バケットとオブジェクトの管理
- 02ストレージクラスとバージョニング
- 03AWS CLI と boto3 の操作例
- 04セキュリティ・性能・コストの指針
- 05一般的な問題の診断
活用シーン
- 01ファイルのアップロード・ダウンロード・同期
- 02アーカイブ用ライフサイクルポリシーの設定
- 03ダウンロード用署名付き URL の生成
- 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を使用する
トラブルシューティング
アクセス拒否エラー
原因:
- バケットポリシーによってアクセスが拒否されている
- IAMポリシーに必要な権限がない
- パブリックアクセスブロックによってアクセスが妨げられている
- オブジェクトが別のアカウントによって所有されている
- 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 署名はリージョンごとに異なります)
解決方法: 署名者に権限があることを確認し、正しいリージョンを使用してください。
参考資料
コメント
Markdown 対応