关于 s3
AWS S3 技能资料介绍 Amazon S3 对象存储及其常见管理模式,面向使用 AWS CLI 或 boto3 管理存储的开发者和运维人员。内容涵盖对象操作、安全、成本控制与故障排查。
主要功能
- 01存储桶与对象管理
- 02存储类别和版本控制
- 03AWS CLI 与 boto3 操作示例
- 04安全、性能与成本建议
- 05常见问题诊断
适用场景
- 01上传、下载和同步文件
- 02配置归档生命周期策略
- 03生成预签名下载链接
- 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
}]
}'
上传缓慢
解决方案:
- 对大文件使用分段上传
- 启用传输加速
- 对大文件使用
aws s3 cp和--expected-size - 检查到该区域的网络吞吐量
预签名 URL 返回 403
原因:
- URL 已过期
- 签名者缺少权限
- 存储桶策略阻止访问
- 区域不匹配(v4 签名具有区域特定性)
修复方法: 确保签名者拥有相应权限,并使用正确的区域。
参考资料
评论
支持 Markdown