mcpField
S
s3

s3

github.com/itsmostafa云与 DevOps1.2k267 次安装2 天前更新
代码仓库

关于 s3

AWS S3 技能资料介绍 Amazon S3 对象存储及其常见管理模式,面向使用 AWS CLI 或 boto3 管理存储的开发者和运维人员。内容涵盖对象操作、安全、成本控制与故障排查。

主要功能

  1. 01存储桶与对象管理
  2. 02存储类别和版本控制
  3. 03AWS CLI 与 boto3 操作示例
  4. 04安全、性能与成本建议
  5. 05常见问题诊断

适用场景

  1. 01上传、下载和同步文件
  2. 02配置归档生命周期策略
  3. 03生成预签名下载链接
  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
  }]
}'
上传缓慢

解决方案:

  • 对大文件使用分段上传
  • 启用传输加速
  • 对大文件使用 aws s3 cp 和 --expected-size
  • 检查到该区域的网络吞吐量
预签名 URL 返回 403

原因:

  • URL 已过期
  • 签名者缺少权限
  • 存储桶策略阻止访问
  • 区域不匹配(v4 签名具有区域特定性)

修复方法: 确保签名者拥有相应权限,并使用正确的区域。

参考资料

评论

支持 Markdown