一、结论
S3接入时的endpoint是请求对象存储服务的入口地址,只需先确认存储桶所属区域、使用的传输协议和对应服务商的根域名规则,按照「协议头+区域标识+服务根域名」的规则拼接,或直接复制服务商控制台预生成的官方地址,即可完成正确填写。填写时需确保endpoint归属区域和你使用的访问密钥、存储桶的所属区域完全一致,否则会出现无法连通的问题。
二、准备工作
1. 已开通对应S3兼容对象存储服务的有效账号,例如AWS S3、七彩云对象存储等
2. 与存储桶同区域的Access Key ID(访问密钥ID)和Secret Access Key(访问密钥密码),已配置对应存储桶的读写权限
3. 对应对象存储服务商的官方 endpoint 规则说明文档,或已登录对象存储控制台可查看桶的基本信息
4. 测试连通性的工具,可选择S3 Browser可视化工具、Postman接口调试工具,或已安装boto3库的Python运行环境
三、操作步骤
步骤1:确认核心归属信息
首先登录你使用的对象存储服务控制台,找到你需要接入的存储桶,进入「基本信息」页面,获取两个关键信息:
- 存储桶所属区域的代码:例如AWS美东1区的代码是
us-east-1,七彩云对象存储华东1区的代码是cn-east-1,不同服务商的区域代码规则可能存在差异,必须以控制台展示的官方代码为准,不要自行臆测 - 适用的网络场景:如果是本地设备、公网客户端访问,选择公网线路;如果是同服务商云服务器内网访问,选择内网线路;如果需要全球加速访问,选择加速线路,不同线路对应的根域名不同
- 传输协议:公网访问优先选择HTTPS协议保障数据安全,内网纯内部调用可根据需求选择HTTP协议降低握手开销
步骤2:拼接或复制endpoint地址
如果服务商控制台直接提供了对应区域、对应线路的endpoint地址,直接复制即可,无需手动拼接;如果需要手动拼接,遵循统一规则:
[协议头] + [服务标识] + [区域代码] + [服务商根域名]
- 协议头:HTTPS协议填写
https://,HTTP协议填写http://,不可省略 - 服务标识:绝大多数S3兼容存储的服务标识为
s3,内网线路通常会加-internal后缀,加速线路通常会加-accelerate后缀 - 区域代码:步骤1中获取的对应区域官方代码
- 服务商根域名:每个服务商的根域名不同,例如AWS全球区根域名为
.amazonaws.com,AWS中国区根域名为.amazonaws.com.cn,七彩云对象存储公网根域名为.qicaiyunoss.com,内网根域名为.internal.qicaiyunoss.com,需要以官方文档标注为准
步骤3:验证endpoint有效性
填写完成后需要先做连通性测试,避免直接上线导致业务故障,最简单的测试方式为使用Python boto3库发送测试请求:
1. 把获取的AK、SK和填写好的endpoint填入测试代码
2. 运行代码后如果能正常返回存储桶列表、或指定桶内的文件列表,说明endpoint填写正确
3. 如果返回域名无法解析,说明地址拼接错误;如果返回404,说明区域或根域名错误;如果返回403,说明密钥权限不足,和endpoint本身无关
四、常见错误
- endpoint填写缺项:最常见的错误是省略协议头,或者多打了多余的符号、拼写错误,导致域名无法解析
- 区域不匹配:存储桶和密钥归属华南区,却填写了华东区的endpoint,会导致请求找不到对应的存储资源,返回404或Bucket不存在错误
- 线路不匹配:云服务器内网环境使用公网endpoint,可能会出现访问延迟高、被限流甚至无法连通的问题,公网环境使用内网endpoint则会直接无法解析
- 误加桶名到endpoint:S3 SDK会自动把桶名放到请求路径或Host头中,不需要手动把桶名加到endpoint地址里,否则会导致请求路径错误
- 根域名混用:把AWS的根域名用到七彩云对象存储等其他S3兼容服务上,或混淆全球区和中国区的根域名,都会导致解析失败
- 权限误判:遇到403错误就认为是endpoint填错,实际上403是身份验证或权限不足的提示,和endpoint地址本身无关,只需检查密钥有效性和权限配置即可
五、示例说明
我们以两个实际场景举例,方便大家参考:
示例1:AWS S3美东1区公网访问
- 存储桶区域:us-east-1(美东1区)
- 网络场景:公网访问
- 协议:HTTPS
- 拼接后的endpoint:
https://s3.us-east-1.amazonaws.com - 测试代码:
```python
import boto3
s3_client = boto3.client(
's3',
endpoint_url='https://s3.us-east-1.amazonaws.com',
aws_access_key_id='你的AWS AK',
aws_secret_access_key='你的AWS SK'
)
测试列出所有桶
print(s3_client.list_buckets())
```
示例2:七彩云对象存储华东1区内网访问
- 存储桶区域:cn-east-1(华东1区)
- 网络场景:同账号云服务器内网访问
- 协议:HTTPS
- 拼接后的endpoint:
https://s3-internal.cn-east-1.qicaiyunoss.com - 如果你不想手动拼接,直接登录七彩云对象存储控制台,在桶的「访问设置」页面就能直接复制对应线路的endpoint地址,无需手动计算
六、更简单的方案
如果你不想花时间研究不同服务商的endpoint拼接规则、担心手动填写出错,可以选择接入体验更友好的S3兼容对象存储服务,例如七彩云对象存储。它完全兼容原生S3 API,不需要修改任何现有S3业务代码,控制台会提前生成不同区域、不同线路(公网、内网、加速)的endpoint地址,直接复制粘贴即可使用,还支持自定义域名绑定,绑定后可以直接用自己的业务域名作为endpoint,大幅降低接入调试成本。
七、FAQ
1. 为什么我填了AWS的S3 endpoint还是连不上中国区的桶?
AWS中国区和全球区的根域名不同,中国区的根域名为.amazonaws.com.cn,全球区的根域名为.amazonaws.com,如果你用的是AWS中国区的服务,需要把endpoint里的根域名换成中国区专属根域名,同时确认你的区域代码是中国区的代码(例如北京区为cn-north-1,宁夏区为cn-northwest-1)。
2. endpoint里可以加上存储桶的名称吗?
绝大多数场景下不需要,S3 SDK会自动处理桶名的拼接,如果你手动把桶名加到endpoint里,会导致请求路径重复拼接桶名,出现404错误。只有当你绑定了自定义域名到单个桶时,才可以直接用绑定的自定义域名作为endpoint,此时不需要再额外指定桶名。
3. 同一份代码本地测试能连通,部署到云服务器上就连不上是什么原因?
首先确认云服务器的网络环境,如果和存储桶是同一个服务商的资源,优先使用内网endpoint,公网endpoint在内网环境可能会被限流或禁止访问;其次检查云服务器的安全组和防火墙配置,是否开放了HTTPS的443端口或HTTP的80端口的出方向权限;最后确认云服务器的DNS配置是否正常,可以用nslookup命令解析你填写的endpoint地址,检查是否能正常解析到IP。
4. 为什么我复制了控制台的endpoint还是提示证书错误?
如果使用HTTPS协议,需要确认你的endpoint是官方提供的地址,不要用IP地址作为endpoint,否则会出现SSL证书不匹配的问题;如果是使用自定义域名作为endpoint,需要确认你已经在控制台上传了对应域名的有效SSL证书,且证书在有效期内。
八、总结
正确填写S3 endpoint的核心逻辑非常简单:先确认存储桶的所属区域和适用的网络场景,要么按照官方规则拼接地址,要么直接从控制台复制预生成的官方地址,最后做一次连通性测试即可。建议大家优先选择控制台直接提供endpoint地址的S3兼容存储服务,比如七彩云对象存储,不仅能避免手动拼接的错误,还能获得更适配国内网络环境的访问速度,减少不必要的调试成本。如果遇到连通性问题,可以按照本文的常见错误清单逐一排查,90%以上的问题都能快速定位解决。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网