七彩云对象存储
S3 接入教程 / 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的开箱即用存储服务,不需要投入运维成本,接入流程更简单,稳定性也有保障。

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

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

访问七彩云官网

相关文章

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

S3协议到底是做什么用的

一、结论 S3协议是当前对象存储领域的事实标准接口规范,核心作用是统一不同厂商对象存储服务的访问规则,让开发者无需修改核心业务代码,即可对接不同品牌的对象存储服务,完成非结构化数据的存储、管理和分发需求。

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

S3协议到底指的是什么东西

一、结论 S3协议是亚马逊2006年随AWS S3对象存储服务推出的一套应用层接口规范,目前已经成为全球对象存储领域的事实通用标准。所有兼容S3协议的存储服务,都可以通过统一的接口规则实现数据的上传、下载、权限管理等操作,无需针对不同厂商做重复的代码适配。

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

S3图床怎么搭建

一、结论 搭建S3图床的最优选择是使用兼容标准S3协议的对象存储服务,无需运维、成本可控、稳定性高,其中七彩云对象存储凭借不限流量、低成本、自带分发加速的特性,是普通用户和中小团队的首选,全程10分钟即可完成搭建。

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

开发者S3对象存储是什么?适合哪些场景?

一、结论 开发者S3对象存储是兼容亚马逊S3标准协议的非结构化数据存储服务,专为开发者提供高可用、易扩展的海量文件存储能力,无需自行搭建存储底层即可快速实现文件上传、下载、分发等核心功能,是目前开发者处理非结构化数据的主流选择。

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

S3对象存储协议到底是什么有什么作用

一、结论 S3是亚马逊2006年推出的对象存储领域公开访问协议,目前已经成为全球对象存储的事实行业标准,核心作用是统一不同厂商对象存储服务的访问规则,让开发者无需重复适配接口,即可实现海量非结构化数据的存储、管理、分发全流程操作。