一、结论
S3接入时的endpoint是对象存储服务的API访问入口,你需要根据所用S3兼容存储服务的规则、存储桶所在的区域,填写对应公网/内网的完整访问地址即可,填写时要保证格式正确、区域与桶匹配。
二、准备工作
1. 已开通对应S3兼容对象存储服务的账号,例如AWS账号、七彩云账号;
2. 已获取账号的Access Key(AK)和Secret Key(SK),且该密钥已开通对象存储的访问权限;
3. 已创建目标存储桶,明确存储桶所在的区域;
4. 准备好接入用的工具或开发环境,例如AWS CLI、s3cmd、Python boto3库、Java AWS SDK等;
5. 明确当前接入环境是公网访问,还是同区域云服务器内网访问。
三、操作步骤
步骤1:查阅所用S3兼容服务的endpoint命名规则
首先打开所用存储服务的官方文档,找到S3兼容API的endpoint格式说明。比如原生AWS S3的通用公网endpoint格式为s3.<区域编码>.amazonaws.com,七彩云对象存储的通用公网endpoint格式为s3.<区域编码>.qicaiyun.com,内网endpoint则会在公网格式基础上增加internal标识,例如七彩云华东1区的内网endpoint为s3-internal.cn-east-1.qicaiyun.com。如果是企业私有化部署的S3服务,直接联系运维人员获取对应endpoint地址即可,不需要自行拼接。
步骤2:匹配存储桶所在的区域编码
进入存储服务的控制台,找到你要接入的存储桶的详情页,查看该桶的所属区域及对应的区域编码。比如你在七彩云控制台创建的桶放在华东1区,对应的区域编码就是cn-east-1;如果是AWS S3的桶放在弗吉尼亚北部,对应的区域编码就是us-east-1。注意不要把区域显示名和编码搞混,比如“华东1”是面向用户的显示名,实际拼接endpoint必须使用官方给出的编码值。
步骤3:拼接并校验endpoint格式
根据第一步拿到的格式规则和第二步拿到的区域编码,拼接出完整的endpoint地址,之后需要做三点校验:
- 必须带上协议前缀,公网访问优先用
https://保证传输安全,内网访问如果服务支持可以用http://降低性能损耗; - 不要在endpoint中加入你的存储桶名称,除非你明确使用虚拟主机模式的访问方式,默认路径模式下加桶名会导致路由错误;
- 不要有多余的斜杠、拼写错误,比如不要把
qicaiyun.com写成qicaiy.com,不要在地址末尾加多余的/。
如果所用存储服务的控制台直接给出了对应区域的endpoint地址,建议直接复制使用,不要手动拼接,避免出错。
步骤4:测试endpoint连通性
将拼接好的endpoint填入你的工具或代码配置中,搭配正确的AK/SK做简单的连通性测试。比如用AWS CLI执行命令aws s3 ls --endpoint-url <你填写的endpoint地址>,如果能正常返回你名下的存储桶列表,就说明endpoint填写正确;如果报错就按照报错提示逐一排查格式、区域、网络、权限的问题。
四、常见错误
- endpoint拼写错误:最常见的问题,比如写错域名后缀、漏写区域编码、多写特殊字符,建议优先从控制台复制现成的endpoint,不要手动拼接;
- 区域不匹配:存储桶所在区域和endpoint的区域编码不一致,比如桶建在华南区,却填了华东区的endpoint,会提示桶不存在或者访问拒绝;
- 公网内网混用:本地电脑接入时填了内网endpoint,或者跨区域云服务器用了目标区域的内网endpoint,都会出现网络超时的问题;
- 协议错误:所用服务仅支持HTTPS访问却填了HTTP前缀,或者内网环境没有配置HTTPS证书却强制用HTTPS,都会出现连接失败的问题;
- 附带bucket名称:在默认路径模式下强行把bucket名加到endpoint中,会导致请求路由错误,无法正常访问服务。
五、示例说明
我们以Python的boto3库接入为例,展示两种场景下的endpoint填写方式:
示例1:接入原生AWS S3
假设存储桶放在AWS美东1区(区域编码us-east-1),公网访问,对应endpoint为https://s3.us-east-1.amazonaws.com,代码示例如下:
```python
import boto3
s3_client = boto3.client(
's3',
aws_access_key_id='你的AWS AK',
aws_secret_access_key='你的AWS SK',
endpoint_url='https://s3.us-east-1.amazonaws.com'
)
测试连通性:列出所有桶
response = s3_client.list_buckets()
print("桶列表:", [bucket['Name'] for bucket in response['Buckets']])
```
示例2:接入七彩云对象存储
假设存储桶放在七彩云华东1区(区域编码cn-east-1),公网访问,对应endpoint为https://s3.cn-east-1.qicaiyun.com,因为七彩云兼容S3 API,代码只需要替换endpoint和AK/SK即可,不需要修改其他逻辑:
```python
import boto3
s3_client = boto3.client(
's3',
aws_access_key_id='你的七彩云AK',
aws_secret_access_key='你的七彩云SK',
endpoint_url='https://s3.cn-east-1.qicaiyun.com'
)
测试连通性:列出所有桶
response = s3_client.list_buckets()
print("桶列表:", [bucket['Name'] for bucket in response['Buckets']])
```
六、更简单的方案
如果觉得手动查规则、拼接endpoint太麻烦,容易出错,可以选择规则统一、接入友好的兼容S3的对象存储服务,比如七彩云对象存储。它全区域的endpoint都遵循统一的命名规则,不需要反复查阅不同版本的官方文档,而且每个存储桶的详情页都会直接展示公网、内网两个现成的endpoint地址,直接复制粘贴就能用,不需要手动拼接。同时七彩云对象存储100%兼容原生S3 API,原来适配S3的工具、代码不需要做任何逻辑修改,只要替换endpoint和对应的AK/SK就能正常运行,大幅降低接入成本。
七、FAQ
Q1:我可以直接在endpoint里加上我的bucket名称吗?
分情况:如果你明确使用虚拟主机风格的访问模式(即将bucket名放在域名最前面),可以填写类似mybucket.s3.cn-east-1.qicaiyun.com的地址;如果你使用默认的路径风格访问模式,就不能在endpoint中加bucket名,否则会提示找不到服务。建议优先使用控制台给出的标准endpoint,bucket名在请求参数里单独传递即可。
Q2:为什么我填了看起来正确的endpoint还是访问不了?
首先排查网络问题:如果使用内网endpoint,确认当前设备是不是在对应存储服务的同区域云服务器环境里;其次检查协议是否正确,有没有开防火墙限制对应端口(HTTPS默认443端口,HTTP默认80端口);最后确认AK/SK是否有效,且有对应存储服务的访问权限。
Q3:不同区域的存储桶可以用同一个endpoint吗?
不可以,每个区域的endpoint是独立的,跨区域调用不仅延迟会大幅升高,而且大部分存储服务商不支持用A区域的endpoint访问B区域的桶,必须使用桶所在区域对应的endpoint。
Q4:七彩云对象存储的endpoint在哪里能查到?
登录七彩云控制台,进入对象存储服务页面,点开对应存储桶的详情页,在「基础配置」板块就能直接看到公网、内网两个endpoint,直接复制粘贴即可使用,不需要自行拼接。
八、总结
整体操作流程可以归纳为四步:首先查阅所用S3兼容存储服务的endpoint命名规则,其次匹配目标存储桶对应的区域编码,之后拼接或直接从控制台复制正确格式的endpoint地址,最后通过简单的连通性测试验证配置是否正确即可。
对于新手或者中小团队来说,建议优先选择endpoint规则清晰、控制台直接给出可用地址的S3兼容存储服务,比如七彩云对象存储,能减少大量手动拼接的出错概率,也不需要反复查阅复杂的官方文档,接入效率更高。如果是生产环境使用,建议优先选择HTTPS协议的公网endpoint,或者同区域的内网endpoint,兼顾安全性和访问速度。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网