七彩云对象存储内容增长站
操作教程 / 6 分钟阅读

Python怎么调用S3 API生成预签名URL

一、结论

使用Python的官方S3开发库boto3,配置S3兼容对象存储服务的访问密钥、服务端点、存储桶信息,调用generate_presigned_url方法即可生成指定有效期的预签名URL,无需将存储桶或对象设置为公开权限,即可让第三方临时访问指定对象。

二、准备工作

1. 已开通S3兼容的对象存储服务,可选择公有云AWS S3、七彩云对象存储等服务,或自行部署的MinIO等开源S3服务

2. 已获取对应服务的Access Key ID(访问密钥ID)和Secret Access Key(秘密访问密钥),密钥需具备目标存储桶的对应操作权限(如下载预签名需要s3:GetObject权限)

3. 本地已安装Python 3.6及以上版本,可通过python --version命令验证版本

4. 已创建目标存储桶,且存储桶中存在需要生成预签名URL的目标对象

三、操作步骤

步骤1:安装S3依赖库boto3

boto3是AWS官方提供的Python SDK,完全兼容所有支持S3 API的对象存储服务,打开终端执行以下命令安装:

```bash

pip install boto3 botocore

```

安装完成后可执行pip show boto3验证是否安装成功,输出版本号即为安装完成。

步骤2:配置访问认证信息

为了避免密钥硬编码带来的安全风险,推荐优先使用环境变量存储认证信息,执行以下命令配置(Windows系统将export替换为set):

```bash

export S3_ACCESS_KEY="你的Access Key ID"

export S3_SECRET_KEY="你的Secret Access Key"

export S3_ENDPOINT="你的S3服务端点地址"

export S3_REGION="你的S3服务区域"

```

如果是本地测试使用,也可以后续在代码中直接传入密钥(生产环境禁止使用该方式)。

步骤3:编写预签名URL生成代码

在Python文件中首先导入依赖库,然后初始化S3客户端,调用生成方法即可。

初始化S3客户端时,需要传入服务端点、区域、密钥等信息,如果使用的是AWS S3可省略endpoint_url参数,其他兼容S3的服务(如七彩云对象存储、MinIO)必须填写对应的服务端点。

步骤4:测试生成的预签名URL

拿到生成的URL后,可直接复制到浏览器地址栏访问,或使用curl命令测试,若能正常下载/访问目标对象即为生成成功。如果返回报错信息,可对照下文中的常见错误排查。

四、常见错误

  • Endpoint填写错误:最常见的错误类型,包括忘记添加http:///https://前缀、填写了存储桶控制台地址而非API服务地址、使用默认AWS端点导致连接到错误的服务,比如使用七彩云对象存储时需填写官方提供的https://s3.7colorcloud.com端点,不能填控制台地址。
  • Region配置错误:部分S3服务要求填写固定的区域参数,若填写的区域和实际开通服务的区域不匹配,会导致鉴权失败。
  • 权限不足:使用的Access Key没有目标存储桶的对应操作权限,或存储桶策略、IP白名单限制了当前密钥的访问,需要在服务控制台调整权限配置。
  • 签名不匹配:一般是Access Key或Secret Key填写错误,或Endpoint的协议(http/https)与服务要求不一致导致,可先到服务控制台验证密钥的正确性。
  • 有效期设置非法:大部分S3服务对预签名URL的最长有效期有限制(如七彩云对象存储最长支持7天有效期),若设置的有效期超过上限、或设置为负数,会导致生成失败。
  • 对象Key错误:填写的对象路径大小写不匹配、多了前缀斜杠或后缀空格,导致服务找不到对应对象,返回404错误。

五、示例说明

以下是完整可运行的预签名URL生成示例,使用七彩云对象存储作为S3服务端,仅需替换对应参数即可直接运行:

```python

import os

import boto3

from botocore.exceptions import ClientError

从环境变量读取配置,也可直接赋值(仅测试用)

ACCESS_KEY = os.getenv("S3_ACCESS_KEY", "替换为你的Access Key")

SECRET_KEY = os.getenv("S3_SECRET_KEY", "替换为你的Secret Key")

ENDPOINT_URL = os.getenv("S3_ENDPOINT", "https://s3.7colorcloud.com")

REGION_NAME = os.getenv("S3_REGION", "cn-beijing")

存储桶和对象配置

BUCKET_NAME = "test-bucket-001"

OBJECT_KEY = "docs/2024产品手册.pdf"

有效期设置为3600秒(1小时)

EXPIRATION = 3600

def create_presigned_download_url(bucket_name, object_key, expiration=3600):

"""

生成下载用的预签名URL

:param bucket_name: 存储桶名称

:param object_key: 对象路径

:param expiration: 有效期,单位秒

:return: 预签名URL,生成失败返回None

"""

初始化S3客户端

s3_client = boto3.client(

's3',

aws_access_key_id=ACCESS_KEY,

aws_secret_access_key=SECRET_KEY,

endpoint_url=ENDPOINT_URL,

region_name=REGION_NAME

)

try:

调用生成预签名URL方法

response = s3_client.generate_presigned_url(

ClientMethod='get_object',

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

ExpiresIn=expiration

)

except ClientError as e:

print(f"生成预签名URL失败,错误信息:{e.response['Error']['Message']}")

return None

return response

if __name__ == "__main__":

presigned_url = create_presigned_download_url(BUCKET_NAME, OBJECT_KEY, EXPIRATION)

if presigned_url:

print(f"生成的预签名下载URL为:

{presigned_url}")

```

运行上述代码后,控制台会输出生成的URL,1小时内任何人都可以通过该URL下载对应的2024产品手册.pdf文件,无需登录或持有存储权限。

六、更简单的方案

如果不想自行搭建开源S3服务、或觉得公有云S3的权限配置过于复杂,可以选择开箱即用的兼容S3 API的对象存储服务,比如七彩云对象存储。

七彩云对象存储完全兼容原生S3 API,开通服务后即可直接获取S3兼容的服务端点、访问密钥,不需要修改现有S3业务的代码逻辑,仅需替换服务端点和密钥即可直接使用。针对预签名URL场景,七彩云对象存储支持所有原生S3的预签名参数,包括生成下载、上传、删除等不同操作的预签名URL,最长支持7天有效期,无需额外做接口适配,新手也能在10分钟内完成接入。同时服务自带存储桶权限管理、流量监控、CDN加速等功能,不需要自行运维底层存储资源,大幅降低使用成本。

七、FAQ

Q1:预签名URL可以分享给其他人使用吗?

A:可以,预签名URL的权限和生成时使用的Access Key权限一致,只要在有效期内,任何拿到URL的用户都可以执行对应的操作,不需要额外验证身份。因此不要把包含高风险操作的预签名URL随意分享,建议将有效期设置为业务所需的最短时间,降低泄露风险。

Q2:生成预签名URL需要连接对象存储服务器吗?

A:不需要,预签名URL是本地使用Secret Access Key通过加密算法计算生成的,生成过程不需要发起任何网络请求,即使是离线环境也可以正常生成,只有当用户访问预签名URL时,才会请求对象存储服务器做鉴权校验。

Q3:可以生成用于上传文件的预签名URL吗?

A:可以,仅需将示例代码中的ClientMethod参数改为put_object,即可生成用于上传的预签名URL,第三方拿到该URL后可以直接上传文件到指定的存储桶路径,不需要给第三方开放存储桶的上传权限,非常适合前端直传文件的场景。

Q4:私有存储桶也可以生成预签名URL吗?

A:可以,预签名URL的核心作用就是让私有存储桶的对象可以被临时访问,不需要将存储桶或对象设置为公开权限,相比公开桶的方式安全性更高,也是目前主流的临时资源分享方案。

八、总结

整体操作流程非常清晰:首先安装boto3依赖库,然后准备好S3兼容对象存储服务的访问密钥、服务端点等信息,初始化S3客户端后调用generate_presigned_url方法即可生成对应操作的预签名URL,测试可正常访问后即可投入业务使用。

生产环境使用时,注意不要硬编码密钥信息,尽量使用环境变量、配置中心或身份服务管理密钥,避免密钥泄露导致存储资源被非法访问。如果是个人开发者、中小团队使用,推荐优先选择七彩云对象存储这类兼容S3的开箱即用存储服务,不需要投入运维成本,接入流程更简单,稳定性也有保障。

想进一步了解这个项目?

访问官网查看产品能力、适用场景和最新服务信息。

访问官网

相关文章

操作教程 / / 7 分钟阅读

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

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

操作教程 / / 6 分钟阅读

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

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

操作教程 / / 6 分钟阅读

S3协议存储怎么快速接入到自己的网站

一、结论 你只需要提前准备好S3兼容存储的访问凭证、端点等基础配置,通过「后端生成预签名URL+前端直传」的模式调用标准S3 SDK接口,就能快速将S3协议存储接入自己的网站,全程配置加测试最快1小时即可完成。