使用 AWS CLI 管理 S3

S3 是 AWS 的对象存储服务

S3: Simple Storage Service

桶操作

创建桶:

aws s3 mb 's3://your-bucket-name' --region 'your-region'

桶名称应遵循以下规则:

  • 必须全球唯一
  • 必须是小写
  • 不得格式化为 IP 地址(如 192.168.5.4)
  • 必须在 3 到 63 字符之间
  • 不能包含下划线,以连字符开头或结尾,且不能有连续的连字符

删除桶:

aws s3 rb 's3://your-bucket-name' --force

使用桶

S3 桶的操作和我们平时使用 Bash 对文件进行操作的命令基本一致。这里只简单列出其中几条命令。

# 列出桶中所有文件
aws s3 ls --recursive 's3://your-bucket-name/'

# 文件拷贝
aws s3 cp 'local-path' 's3://your-bucket-name/remote-path'

# 文件删除
aws s3 rm 's3://your-bucket-name/file'

# 文件同步
aws s3 sync 'local-path' 's3://your-bucket-name/remote-path'

为文件生成预览链接:

aws s3 presign 's3://your-bucket-name/path/to/file' --expires-in 3600
  • --expires-in 设定过期时间

presign,预签名。实际上是我们使用自己的身份提前解锁了文件,并生成了解锁链接。

所有支持的操作:

命令名 功能
cp 拷贝
ls 列表
mb 创建桶
mv 移动 / 重命名
presign 预签名
rb 删除桶
rm 删除
sync 同步
website 设置桶的网站配置

桶策略

  1. 检查“屏蔽公共访问权限”设置

    aws s3api get-public-access-block --bucket your-bucket     # 检查“屏蔽公共访问权限”设置
    aws s3api delete-public-access-block --bucket your-bucket  # 移除“屏蔽公共访问权限”设置
    
  2. 创建桶策略:

    vim policy.json
    
    {
      "Version": "2012-10-17",
      "Statement": [{
        "Sid": "AllowPublicReadDirectory",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::your-bucket/your-directory/*"
      }]
    }
    

    这个桶策略设置允许公共读取指定目录

  3. 应用桶策略:

    aws s3api put-bucket-policy --bucket your-bucket --policy file://policy.json
    
  4. 验证桶策略:

    aws s3api get-bucket-policy --bucket your-bucket                        # 查看桶策略
    curl https://your-bucket.s3.amazonaws.com/your-directory/test-file.txt  # 尝试访问文件
    

uPic

uPic 是一个图床上传工具,可以使用 AWS S3 作为存储位置。

20250831-022249

ACL

ACL 是 AWS S3 的传统权限管理机制(现推荐使用桶策略)。uPic 支持对上传的图片设置 Object ACL。

ACL 含义
public-read 公开可读。任何人无需认证即可读取对象,上传者/Owner 可读写。图床最常用,图片 URL 可直接访问
public-read-write 公开可读写。任何人都能读取和写入,极不安全,几乎不用
private 私有。只有 Owner 可访问,其他人无权限。图片 URL 无法直接访问
authenticated-read 认证用户可读。所有已认证的 AWS/S3 账号用户可读,Owner 可读写。很少使用
aws-exec-read AWS 内部使用,供 EC2 等服务读取 AMI/对象,普通场景不会用到
bucket-owner-full-control Bucket 拥有者完全控制。上传者保留对象所有权,同时授予 Bucket Owner 完全控制权。跨账号上传时常用
bucket-owner-read Bucket 拥有者可读,上传者保留完全控制。跨账号场景的弱化版

现在部署 S3 图床时,一般建议将 Object Ownership 设为 Bucket owner enforced(禁用 ACL),并用 Bucket Policy 授权公开读取:

{
  "Effect": "Allow",
  "Principal": "*",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::your-bucket/*"
}

并在 uPic 的 ACL 设置 bucket-owner-full-control(推荐)或 private

域名

上传图片后,可以设置拼接图片访问 URL 时使用的域名。如果不设置,会使用 S3 默认 URL(https://<bucket>.s3.<region>.amazonaws.com),缺点是地理位置远离 bucket region 的用户访问速度会慢。建议使用 Amazon CloudFront CDN 域名(https://xxxx.cloudfront.net)或使用 Cloudflare R2 桶(自带 CDN)。

参见:

其中 s3 是 AWS S3 的高级 API,s3apis3control 分别是 S3 和 S3 Glacier 的低级 API,它们提供了更多的配置选项和更详细的控制。

posted @ 2024-05-01 20:07  Undefined443  阅读(217)  评论(0)    收藏  举报