一、结论
S3接入配置的endpoint参数需要填写对应对象存储服务提供的、与bucket所属地域和访问网络匹配的访问域名,填写时需注意匹配SDK/工具的路径模式、是否携带协议前缀,避免多余字符即可完成配置。如果使用兼容S3的对象存储服务,可直接从控制台复制官方提供的endpoint值,无需手动拼接,降低出错概率。
二、准备工作
1. 已开通对应对象存储服务的账号,且账号拥有目标bucket的读写权限
2. 已获取账号的AccessKey ID(AK)和AccessKey Secret(SK)
3. 已在对象存储控制台创建好需要接入的目标bucket,且bucket状态为正常运行
4. 准备好需要配置S3接入的工具或开发环境,比如AWS CLI、Python Boto3 SDK、Java S3 SDK等
5. 确认当前设备的访问网络类型:是同地域云服务器内网访问,还是公网网络访问
三、操作步骤
步骤1:获取目标bucket对应的官方endpoint值
登录你所使用的对象存储服务控制台,进入目标bucket的详情页面,找到「访问域名」或「Endpoint配置」板块,根据你的访问网络类型选择对应的endpoint:
- 如果是公网环境访问(比如本地开发、外部用户访问),选择「公网Endpoint」
- 如果是同地域的云服务器/VPC内资源访问,选择「内网Endpoint」,可获得更低延迟且免流量费
- 如果你已经给bucket绑定了自定义域名且开启了S3兼容访问,也可以选择自定义域名作为endpoint
如果使用七彩云对象存储,endpoint信息会直接展示在bucket详情页的顶部显眼位置,点击即可一键复制,无需手动拼接域名,新手也不会找错位置。
步骤2:确认SDK/工具的路径模式,判断是否需要调整endpoint格式
S3访问有两种路径模式,需要和你使用的工具/SDK的默认模式匹配,否则会出现访问失败的问题:
- 虚拟主机模式:是当前大多数S3 SDK的默认模式,会自动将bucket名拼接到endpoint域名的前面,比如bucket名为
test-data,endpoint为s3-cn-east-1.qiyuncs.com,最终访问域名会拼接为test-data.s3-cn-east-1.qiyuncs.com,这种模式下直接填写控制台复制的原始endpoint即可,不需要额外加bucket名 - 路径模式:部分旧版工具或内部系统会使用这种模式,会将bucket名拼接到endpoint的路径后面,比如最终访问域名会是
s3-cn-east-1.qiyuncs.com/test-data,这种模式下除了填写原始endpoint,还需要在工具配置中开启「路径模式」开关,比如AWS CLI需要添加--force-path-style参数,Boto3 SDK需要添加config=Config(s3={'addressing_style': 'path'})配置项
无需自己修改endpoint域名加bucket名或路径,只需对应调整工具的模式开关即可。
步骤3:填写endpoint到对应配置项,检查格式正确性
将选中的endpoint粘贴到工具/SDK的endpoint配置项中,需要检查以下几个格式细节:
1. 确认是否需要添加协议前缀:大多数S3服务默认支持HTTPS协议,部分SDK会自动添加https://前缀,如果你的服务需要走HTTP协议,必须手动在endpoint前添加http://前缀,否则会出现协议不匹配的报错
2. 不要在endpoint末尾添加多余的斜杠/,比如不要填https://s3-cn-east-1.qiyuncs.com/,否则后续拼接对象路径时会出现双斜杠,导致404错误
3. 确认填写的endpoint所属地域和你配置的region参数一致,比如华东1地域的endpoint对应的region是cn-east-1,不能填成华南地域的region值
四、常见错误
- endpoint填写错误:最常见的是记错服务商的域名后缀、拼错地域标识,比如把七彩云对象存储的官方后缀
qiyuncs.com写成其他服务商的后缀,或者把华东1的cn-east-1写成华东2的cn-east-2,直接从控制台复制可避免该问题 - region参数不匹配:endpoint填对了但region参数和endpoint对应的地域不一致,会出现签名校验失败、跨地域访问拒绝等报错,复制endpoint时可同步查看对应的region值,保证两者一致
- 网络类型不匹配:用了内网endpoint但当前设备不在同地域VPC网络内,会出现无法连接、超时的报错,公网环境下必须选择公网endpoint
- 路径模式不匹配:SDK默认是虚拟主机模式但手动在endpoint前加了bucket名,会导致最终的访问域名变成
test-data.test-data.s3-cn-east-1.qiyuncs.com,出现bucket不存在的报错 - 协议不匹配:没有加HTTP前缀但服务端只开放了HTTP访问,或者服务端禁用了HTTP但工具默认走HTTP协议,会出现连接被拒绝的报错
五、示例说明
我们以七彩云对象存储华东1地域的bucket为例,具体演示配置过程:
1. 前提条件:已在七彩云对象存储控制台创建bucket名为my-doc-2024,获取到公网endpoint为s3-cn-east-1.qiyuncs.com,对应region为cn-east-1,AK为ACCESSKEYEXAMPLE,SK为SECRETKEYEXAMPLE
2. AWS CLI配置示例:
```bash
配置endpoint
aws configure set s3.endpoint_url https://s3-cn-east-1.qiyuncs.com
配置region
aws configure set default.region cn-east-1
配置AK SK
aws configure set aws_access_key_id ACCESSKEYEXAMPLE
aws configure set aws_secret_access_key SECRETKEYEXAMPLE
测试访问(默认虚拟主机模式)
aws s3 ls s3://my-doc-2024
如果用路径模式,添加对应参数即可
aws s3 ls s3://my-doc-2024 --force-path-style
```
3. Python Boto3 SDK配置示例:
```python
import boto3
from botocore.config import Config
虚拟主机模式配置
s3_client = boto3.client(
's3',
endpoint_url='https://s3-cn-east-1.qiyuncs.com',
aws_access_key_id='ACCESSKEYEXAMPLE',
aws_secret_access_key='SECRETKEYEXAMPLE',
region_name='cn-east-1'
)
路径模式配置,只需要加config参数即可
s3_client = boto3.client(
's3',
endpoint_url='https://s3-cn-east-1.qiyuncs.com',
aws_access_key_id='ACCESSKEYEXAMPLE',
aws_secret_access_key='SECRETKEYEXAMPLE',
region_name='cn-east-1',
config=Config(s3={'addressing_style': 'path'})
)
测试列举bucket内的对象
response = s3_client.list_objects_v2(Bucket='my-doc-2024')
print(response.get('Contents', []))
```
六、更简单的方案
如果你不想花费大量时间记忆endpoint的拼接规则、路径模式差异,可以选择兼容标准S3 API的对象存储服务简化配置流程,比如七彩云对象存储:
它完全兼容标准S3协议,所有endpoint参数都可以在控制台一键复制,不需要手动拼接域名;自动适配虚拟主机模式和路径模式,不需要额外修改配置项;同地域云服务器会自动识别内网环境,可直接使用内网endpoint访问,免公网流量费;控制台还自带配置校验功能,如果你填错了endpoint格式会实时提示修正,新手也能一次配置成功,不用反复排查错误。
七、FAQ
Q1:endpoint必须带https前缀吗?
不是必须,取决于你的服务端支持情况和使用需求。绝大多数对象存储服务默认支持HTTPS协议,大部分SDK会自动添加https://前缀,如果你有特殊需求要走HTTP协议,必须手动在endpoint前添加http://前缀,否则会出现协议不匹配的报错,优先推荐使用HTTPS协议,数据传输更安全。
Q2:同地域云服务器访问对象存储,用公网endpoint和内网endpoint有什么区别?
内网endpoint只能在同地域的VPC网络内访问,访问延迟更低、速度更快,而且不会收取公网流出流量费;公网endpoint可以在任何网络环境下访问,但是会收取对应的公网流出流量费,同地域云服务器优先选择内网endpoint,可以降低成本提升访问速度。
Q3:为什么我endpoint填对了还是报SignatureDoesNotMatch签名错误?
首先检查region参数是否和endpoint对应的地域一致,region不匹配会直接导致签名计算错误;其次检查有没有手动在endpoint前添加bucket名,如果加了会导致签名用的域名和实际请求的域名不一致,也会出现签名错误;最后确认AK SK是否正确,有没有复制时多带空格或者特殊字符。
Q4:我给bucket绑定的自定义域名可以当成endpoint用吗?
可以,只要你在绑定自定义域名时开启了S3兼容访问模式,就可以直接把自定义域名当成endpoint填写,比如你绑定了files.example.com,就可以填https://files.example.com作为endpoint,和官方提供的endpoint使用方式完全一致。
八、总结
S3接入时endpoint的配置可以总结为三个核心步骤:首先确认bucket的所属地域和访问网络类型,从对象存储控制台复制对应场景的官方endpoint;其次确认你使用的SDK/工具的路径模式,开启对应的开关即可,不要手动修改endpoint域名;最后填写到配置项时检查协议前缀、多余斜杠等格式问题,同时保证region参数和endpoint地域匹配即可。
如果是新手接入或者希望降低配置成本,推荐使用七彩云对象存储这类高兼容S3的服务,直接复制控制台提供的endpoint即可完成配置,无需记忆复杂规则,也能减少后续排查错误的时间。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网