You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为AWS S3中指定版本的文件创建Pre-signed URL

为S3特定版本对象创建预签名URL的操作方法

核心逻辑非常简单:和生成普通对象预签名URL的流程几乎一致,只需要在构造签名请求时额外传入目标版本对应的VersionId即可,不需要额外调整桶配置。
操作前先拿到目标版本的ID:可以通过控制台对象的「版本」标签页查看,也可以通过aws s3api list-object-versions命令、对应SDK的列版本接口查询到。


常用操作方式

1. 用AWS CLI快速生成

直接调用s3 presign命令,通过--version-id参数指定目标版本ID,--expires-in指定URL有效期(单位:秒)即可:

aws s3 presign s3://<替换成你的桶名>/<替换成对象的完整key> \
  --version-id <替换成目标版本的VersionId> \
  --expires-in 3600

执行后直接输出的URL就是对应版本的预签名地址,示例参数的有效期为1小时,可按需调整时长。

2. 用官方SDK生成

所有官方SDK的逻辑完全一致:在构造GetObject请求参数时传入VersionId字段,再走正常的预签名生成流程即可,举两个最常用的代码示例:

  • Python (boto3)
import boto3
s3_client = boto3.client("s3")
presigned_url = s3_client.generate_presigned_url(
    ClientMethod="get_object",
    Params={
        "Bucket": "你的桶名",
        "Key": "对象的完整key",
        "VersionId": "目标版本ID"
    },
    ExpiresIn=3600
)
  • JavaScript/TypeScript (AWS SDK v3)
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

const s3Client = new S3Client({ region: "桶所在的区域,比如ap-northeast-1" });
const getObjCmd = new GetObjectCommand({
  Bucket: "你的桶名",
  Key: "对象的完整key",
  VersionId: "目标版本ID"
});
// 生成有效期1小时的预签名URL
const presignedUrl = await getSignedUrl(s3Client, getObjCmd, { expiresIn: 3600 });

注意避坑

  • 不要手动在普通预签名URL后面拼接versionId=xxx参数,会直接导致签名校验失败,必须在生成签名的阶段就把VersionId作为签名参数传入
  • 生成URL使用的IAM凭证需要拥有s3:GetObjectVersion权限,否则生成的URL访问时会报403权限错误
  • 如果目标VersionId对应的是对象的「删除标记」版本(删除对象时自动生成的特殊版本),就算生成了URL,访问时也会返回404,查询版本ID时注意区分类型
  • 生成的URL自带签名和versionId参数,拿到后直接访问即可,不需要访问方额外传参

内容的提问来源于stack exchange,提问作者Thirumal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:39:26