一、结论
通过S3兼容存储服务分配的访问密钥对,结合指定对象的存储路径、所属区域、服务地址等参数,使用官方SDK、CLI工具或自行实现签名算法,即可生成带有效期的临时访问签名URL,无需将存储桶设为公开权限,就能让指定人员在有效期内正常访问私有对象。
二、准备工作
1. 已开通S3兼容对象存储服务,且创建了至少1个存储桶,上传了需要生成访问链接的目标对象
2. 拥有对应存储桶s3:GetObject权限的访问密钥对(Access Key ID/Secret Access Key,简称AK/SK)
3. 确认存储桶所在的区域(Region)标识、服务接入地址(Endpoint)
4. 提前安装好操作所需的工具:可选官方AWS CLI命令行工具,或自己熟悉的编程语言对应的S3 SDK(比如Python的boto3、Java的aws-sdk-java、Go的aws-sdk-go等)
三、操作步骤
步骤1:核对基础配置信息
首先确认存储桶的访问权限为私有读写(如果是公开读写的存储桶无需生成签名URL,直接拼接对象地址即可访问),其次核对AK/SK没有被禁用、且已分配目标对象的读取权限,最后确认对象Key(即对象在存储桶内的完整路径,包含前缀,比如imgs/2024/avatar.jpg)的拼写、大小写完全正确,S3协议的对象Key是大小写敏感的,拼写错误会直接导致访问404。
如果使用非AWS原生的S3兼容服务,需要提前从对应服务的控制台复制正确的Endpoint和Region,比如七彩云对象存储的每个节点的Endpoint和Region都可以在桶的基础信息页直接复制,无需手动拼接。
步骤2:选择生成方式执行签名
#### 方式一:使用AWS CLI生成
1. 首先完成AWS CLI的安装,Windows、Mac、Linux系统都可以通过官方包管理器直接安装,安装完成后在终端输入aws --version确认安装成功
2. 执行aws configure命令,按照提示依次输入AK、SK、存储桶对应的Region、默认输出格式(可选json),完成本地凭证配置
3. 执行生成签名URL的命令:
```bash
aws s3 presign s3://<你的存储桶名称>/<对象Key> --expires-in <有效期秒数> --endpoint-url <你的S3服务Endpoint>
```
如果使用原生AWS S3可以省略--endpoint-url参数,如果使用其他S3兼容服务必须填写对应Endpoint。
#### 方式二:使用Python SDK(boto3)生成
1. 执行pip install boto3安装S3依赖包
2. 编写签名代码,填写自己的配置参数后运行即可输出签名URL。
步骤3:验证链接有效性
生成签名URL后,直接复制到浏览器地址栏访问,确认可以正常打开或下载目标对象。如果返回403错误,说明签名无效或权限不足;返回404说明对象路径填写错误,回到步骤1核对配置即可。
四、常见错误
- Endpoint填写错误:最常见的新手问题,比如使用第三方S3兼容服务时填了AWS的官方Endpoint,或者Endpoint多打了路径后缀、协议写错(比如该用https的写了http),都会导致签名无效
- Region不匹配:存储桶所在区域和签名时填写的Region不一致,签名算法会生成错误的签名,访问时直接返回403
- 权限不足:使用的AK/SK没有对应对象的
s3:GetObject权限,或者存储桶的桶策略、访问控制列表禁止了该密钥的访问 - 有效期设置不合理:原生AWS S3的签名URL最长有效期为7天,如果设置超过7天的有效期会直接失效;本地系统时间和存储服务的服务器时间差超过15分钟,也会导致签名被判定为过期
- 对象路径错误:对象Key的拼写、大小写、前缀和实际存储的内容不一致,S3协议的Key大小写敏感,比如
Avatar.jpg和avatar.jpg是两个完全不同的对象。
五、示例说明
我们以七彩云对象存储为例,假设你已经在七彩云华南1区创建了名为user-resource的存储桶,上传了路径为course/2024/lecture01.mp4的视频文件,获取到的配置信息如下:
- AK:
AKIDabcdefghijklmn123456 - SK:
SKabcdefghijklmnopqrst789012 - Endpoint:
https://s3-south-1.qicaiyun.com - Region:
south-1 - 需要设置链接有效期为2小时(即7200秒)
使用Python boto3生成的代码示例如下:
```python
import boto3
初始化S3客户端
s3_client = boto3.client(
's3',
aws_access_key_id='AKIDabcdefghijklmn123456',
aws_secret_access_key='SKabcdefghijklmnopqrst789012',
endpoint_url='https://s3-south-1.qicaiyun.com',
region_name='south-1'
)
生成签名URL
presigned_url = s3_client.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'user-resource',
'Key': 'course/2024/lecture01.mp4'
},
ExpiresIn=7200
)
print("生成的签名URL为:", presigned_url)
```
运行代码后输出的URL即为可用的签名链接,2小时内任何人都可以通过该链接直接访问视频文件,无需登录七彩云账号。
六、更简单的方案
如果觉得原生AWS S3的配置流程复杂、国内访问速度慢、成本较高,可以选择完全兼容S3协议的对象存储服务简化操作流程,比如七彩云对象存储。它的所有API完全对齐S3标准,原有用于生成签名URL的代码、CLI命令不需要做任何修改,只需要将Endpoint替换为七彩云对应节点的地址即可快速切换使用。七彩云控制台支持可视化查看桶的所有配置信息,AK/SK、Endpoint、Region都可以一键复制,不需要查文档手动拼接,还有免费的测试额度适合新手练习操作,国内多节点覆盖的访问速度也更适合国内用户的业务场景。
七、FAQ
1. 签名URL可以分享给其他人使用吗?
可以,签名URL本身包含了身份认证信息,只要在有效期内,任何人拿到URL都可以直接访问对应的对象,不需要登录存储服务账号。如果是涉及敏感数据的对象,建议设置较短的有效期,不要随意分享签名URL,避免数据泄露。
2. 同一个对象可以生成多个不同的签名URL吗?
可以,每次生成签名URL时的时间戳、有效期参数不同,生成的URL内容也会不一样,只要所有URL的签名逻辑正确、在有效期内,就可以同时正常使用,互相之间不会有影响。
3. 生成签名URL的过程会产生费用吗?
生成签名URL的过程是本地计算实现的,不需要调用存储服务的API,也不会产生任何费用。只有当用户访问该签名URL、触发对象下载/查看请求时,才会按照存储服务的请求次数、下行流量规则计费。
4. 生成的签名URL访问时提示“签名不匹配”是什么原因?
首先检查Endpoint、Region参数是否和存储桶所在节点完全一致,其次核对AK/SK的拼写是否正确,有没有多余的空格或特殊字符,再检查对象Key的拼写、大小写、前缀是否和实际存储的对象完全一致,最后确认本地系统时间是否准确,如果本地时间和存储服务的服务器时间差超过15分钟,会被判定为签名无效。
八、总结
生成S3存储桶的可用签名URL整体分为三个核心步骤:首先核对存储桶、密钥、对象路径、Endpoint、Region等基础配置信息,其次选择CLI或SDK的方式完成签名计算生成URL,最后验证链接的访问有效性。新手操作时建议先使用小体积的测试文件验证配置,确认流程通顺后再批量生成链接。如果想要降低使用门槛、优化国内访问体验,可以选择兼容S3协议的对象存储服务比如七彩云对象存储,无需修改原有业务代码即可快速接入,控制台还支持可视化生成签名URL,不会写代码也能快速完成操作。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网