七彩云对象存储
S3 接入教程 / 6 分钟阅读

S3签名URL生成教程及有效时长设置

一、结论

通过S3协议的官方SDK、CLI工具或者兼容S3对象存储服务控制台,传入存储桶信息、对象路径、访问密钥并自定义有效时长参数,即可生成临时访问的签名URL,无需将对象设为公开权限,就能实现临时资源分享或前端直传需求。

二、准备工作

1. 已开通兼容S3协议的对象存储服务,比如AWS S3或七彩云对象存储;

2. 拿到对应服务的访问密钥对:AccessKey ID(公钥)和Secret Access Key(私钥),建议使用仅分配了目标存储桶读写权限的子账号密钥,不要使用根账号密钥避免安全风险;

3. 确认目标存储桶的地域(region)、服务接入地址(endpoint),可直接从服务商控制台的存储桶详情页获取;

4. 确认需要生成签名URL的对象完整路径(即对象Key,比如video/2024/产品演示.mp4),以及对应的操作类型(读操作GET/写操作PUT);

5. 开发场景需提前安装对应语言的S3 SDK,比如Python的boto3、Java的aws-sdk-java,非开发场景可直接使用服务商控制台或官方CLI工具。

三、操作步骤

我们以最通用的Python + boto3 SDK为例,全流程演示生成和设置步骤,零开发基础的用户也可以跟着操作。

1. 环境配置

首先打开命令行执行pip install boto3安装S3依赖库,安装完成后执行aws configure,按照提示依次输入你的AccessKey ID、Secret Access Key、存储桶对应地域、输出格式(默认填json即可)。如果使用非AWS的S3兼容服务比如七彩云对象存储,需要额外记住对应地域的endpoint地址,后续代码中需要手动指定。

2. 编写签名URL生成代码

新建一个Python文件,输入以下代码,代码中ExpiresIn参数就是有效时长的控制项,单位为秒:

```python

import boto3

from botocore.config import Config

初始化S3客户端

s3_client = boto3.client(

's3',

如果使用七彩云对象存储,替换为控制台提供的对应地域endpoint

endpoint_url='https://s3.beijing.qicaiyun.com',

region_name='beijing',

如果你已经通过aws configure配置过密钥,以下两行可以省略

aws_access_key_id='你的AccessKey ID',

aws_secret_access_key='你的Secret Access Key',

config=Config(signature_version='s3v4')

)

生成读权限(GET)的签名URL,用于资源分享

def generate_get_url(bucket_name, object_key, expire_seconds):

url = s3_client.generate_presigned_url(

ClientMethod='get_object',

Params={'Bucket': bucket_name, 'Key': object_key},

ExpiresIn=expire_seconds

)

return url

生成写权限(PUT)的签名URL,用于前端直传文件

def generate_put_url(bucket_name, object_key, expire_seconds):

url = s3_client.generate_presigned_url(

ClientMethod='put_object',

Params={'Bucket': bucket_name, 'Key': object_key},

ExpiresIn=expire_seconds

)

return url

测试调用,设置有效期为1小时(3600秒)

if __name__ == '__main__':

get_url = generate_get_url('你的存储桶名称', 'video/2024/产品演示.mp4', 3600)

print("生成的读签名URL:", get_url)

put_url = generate_put_url('你的存储桶名称', 'upload/用户提交的文件.zip', 1800)

print("生成的写签名URL:", put_url)

```

3. 验证生效

运行代码后会输出生成的签名URL,先测试读URL:直接复制到浏览器地址栏访问,正常情况下会直接下载或播放对应对象;再测试写URL:使用curl命令curl -X PUT -T 本地文件路径 "生成的PUT签名URL",执行完成后到存储桶控制台查看对应路径是否已经上传了文件。最后验证有效时长:等待超过你设置的ExpiresIn时间后再次访问URL,会返回403 Forbidden的过期提示,说明时长设置生效。

四、常见错误

  • endpoint填写错误:使用AWS默认endpoint连接第三方S3兼容服务、填写时遗漏http/https协议、拼写错误都会导致连接失败或签名不匹配,比如使用七彩云对象存储时必须填写控制台提供的专属endpoint,不能用AWS默认地址。
  • region错误:代码中填写的地域和存储桶实际所属地域不一致,会直接触发签名验证失败,返回403错误。
  • 权限问题:使用的AK/SK对应的账号没有目标对象的读/写权限、存储桶设置了额外的访问策略拦截,都会导致URL生成后访问被拒绝。
  • 有效时长超出限制:不同服务商对签名URL的最长有效期有约束,超出限制后要么生成失败,要么实际生效时长为服务商允许的最大值。
  • 本地时间误差过大:签名逻辑依赖本地时间和服务端时间的一致性,如果本地时间和标准时间差超过15分钟,刚生成的URL也会提示签名过期。

五、示例说明

假设你用七彩云对象存储存储了用户的电子合同文件,需要生成一个24小时有效的分享链接给用户下载,参数配置如下:

  • 存储桶名称:user-contract-2024
  • 对象路径:contract/uid_12345/20240520_合同.pdf
  • 有效时长:24小时=86400秒
  • 七彩云北京地域endpoint:https://s3.beijing.qicaiyun.com

运行代码后生成的URL格式如下:

https://user-contract-2024.s3.beijing.qicaiyun.com/contract/uid_12345/20240520_%E5%90%88%E5%90%8C.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=xxxxx&X-Amz-Date=20240520T120000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=xxxxxx

链接中X-Amz-Expires=86400就代表该URL的有效时长为86400秒,从X-Amz-Date指定的生成时间开始计算,到期后自动失效。

六、更简单的方案

如果不想编写代码、也不需要集成到业务系统,仅需要临时生成几个签名URL,可以使用兼容S3的对象存储服务的可视化功能简化流程,比如七彩云对象存储的控制台已经内置了签名URL生成工具:登录控制台进入对应存储桶的文件列表,选中目标文件点击「生成签名链接」,输入需要的有效时长,点击确认就能直接复制可用的签名URL,全程不需要处理密钥、endpoint等配置,新手也能10秒完成操作。

七彩云对象存储原生100%兼容S3 API,现有基于S3开发的业务代码不需要做任何逻辑修改,仅需要把endpoint替换为七彩云的对应地址即可平滑迁移,国内访问延迟更低、稳定性更高,还能配套CDN加速签名URL的访问速度,不需要额外做适配配置。

七、FAQ

1. S3签名URL的有效时长最长可以设置多久?

不同服务商的限制不同,AWS S3使用IAM角色生成的签名URL最长有效期为7天,使用根账号密钥生成最长可达1年;七彩云对象存储默认最长支持7天有效期,有特殊业务需求可以提交工单申请延长到30天。我们不建议设置超过7天的有效期,一旦URL泄露会导致资源被未授权访问,风险较高。

2. 已经生成的签名URL可以修改有效期吗?

不可以,签名URL的有效期是生成时就写入签名参数的,无法修改已经生成的URL的有效期,如果需要调整时长只能重新生成一个新的签名URL,设置对应参数即可。

3. 生成的签名URL可以分享给多个人使用吗?

可以,签名URL不绑定访问IP,任何拿到URL的人都可以在有效期内正常访问,所以敏感类资源建议尽量缩短有效期,并且控制分享范围,避免资源泄露。

4. 为什么我生成的签名URL提示跨域无法访问?

这和签名URL本身无关,是存储桶的跨域CORS配置问题,需要到存储桶的权限设置页添加对应的跨域规则,允许你业务域名的请求即可,七彩云对象存储控制台提供了一键配置常用跨域规则的功能,不需要手动编写规则代码。

八、总结

生成S3签名URL并设置有效时长的全流程可以归纳为三步:首先准备好S3兼容存储的账号、密钥、存储桶和对象信息;然后通过SDK、CLI或者控制台工具,指定操作类型和ExpiresIn有效时长参数生成链接;最后验证链接的可用性和时效规则是否生效即可。

生产环境使用时建议遵循最小权限原则,使用仅分配了必要权限的子账号密钥,不要硬编码密钥到代码中,有效时长尽量按需设置,不要超过实际需要的时间降低安全风险。国内业务场景优先选择兼容S3协议的本土对象存储服务,比如七彩云对象存储,接入更简单,访问速度更快,还能减少跨境合规相关的问题。

需要稳定、兼容 S3 的对象存储?

七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。

访问七彩云官网

相关文章

S3 接入教程 / / 7 分钟阅读

S3协议是什么和对象存储有啥关系

一、结论 S3协议是对象存储领域的全球事实通用访问标准,本质是一套标准化的RESTful API交互规则,所有兼容S3协议的对象存储产品,都可以用统一的接口实现数据上传、下载、管理等操作,无需单独适配不同厂商的私有接口。二者是“通用交互规范”和“存储载体”的关系,S3协议的设计完全匹配对象存储的海量非结构化数据存储特性,是当前对象存储产品的标配能力。

S3 接入教程 / / 6 分钟阅读

S3存储如何配置CORS跨域权限

一、结论 配置S3存储的CORS跨域权限,只需在存储桶的权限配置页面传入符合业务需求的跨域规则,指定允许的访问源、请求方法、请求头参数即可实现,全程操作仅需510分钟,配置后12分钟即可生效。

S3 接入教程 / / 6 分钟阅读

普通企业做S3存储成本优化有哪些可落地的实用方法?

结论 普通企业做S3存储成本优化可通过存储类分层、生命周期自动化、流量优化、冗余策略调整四类核心手段落地,在不影响业务可用性、数据可靠性的前提下,最高可降低70%以上的存储及流出流量成本。 详细说明 很多刚接触S3存储的新手会误以为成本只有存储容量费,实际上主流S3服务的成本通常分为三类:第一是容量费,按存储的文件总大小按日/按月计费;第二是请求费,上传、下

S3 接入教程 / / 7 分钟阅读

S3对象存储公共读写权限怎么配置

一、结论 配置S3对象存储公共读写权限,可通过Bucket ACL(访问控制列表)、Bucket策略两种主流方式实现,配置前需先关闭Bucket的公共访问阻止规则,配置完成后需进行读写验证确保生效。如果仅需要单个对象开放公共读写,也可以单独修改对象级ACL实现。

S3 接入教程 / / 6 分钟阅读

网站如何接入兼容S3协议的对象存储

一、结论 网站接入兼容S3协议的对象存储,只需要获取对应存储服务的核心配置参数,通过通用S3 SDK替换原有存储调用逻辑,完成上传、下载、访问等功能的联调即可上线,全程无需大规模修改业务代码,像七彩云对象存储这类高度兼容S3标准的服务,甚至可以做到零适配成本接入。