boto支持aws4引发的错误怎么解决
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要讲解了"boto支持aws4引发的错误怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"boto支持aws4引发的错误怎么解决"吧!环
千家信息网最后更新 2025年12月02日boto支持aws4引发的错误怎么解决
这篇文章主要讲解了"boto支持aws4引发的错误怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"boto支持aws4引发的错误怎么解决"吧!
环境介绍
软件版本
root@demo:/home/demouser# ceph -vceph version 10.2.6 (656b5b63ed7c43bd014bcafd81b001959d5f089f)boto版本:2.46.1
rgw配置
[client.radosgw.cn-zone1] rgw dns name = ceph.work rgw frontends = fastcgi socket_port=9000 socket_host=127.0.0.1 host = demo keyring = /etc/ceph/ceph.client.radosgw.keyring rgw socket path = /home/ceph/var/run/ceph-client.radosgw.cn-zone1.sock log file = /home/ceph/log/radosgw.cn-zone1.log rgw print continue = false rgw content length compat = true
boto对region支持的一些坑
boto用例
from boto.s3.connection import S3Connectionimport botoimport osos.environ['S3_USE_SIGV4'] = 'True' #启动对aws4的支持endpoint = 'ceph.work'bucket_name = 'test1'access_key = ''secret_key = ''conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host=endpoint, is_secure=False, calling_format=boto.s3.connection.SubdomainCallingFormat(), validate_certs=True,)bucket = conn.get_all_buckets()print bucket
异常信息
Traceback (most recent call last):..... File "/Users/demouser/lwc/lib/python2.7/site-packages/boto/auth.py", line 690, in determine_region_name return region_nameUnboundLocalError: local variable 'region_name' referenced before assignment
boto对region_name的逻辑处理
def split_host_parts(self, host): return host.split('.') def determine_region_name(self, host): # S3's different format(s) of representing region/service from the # rest of AWS makes this hurt too. # # Possible domain formats: # - s3.amazonaws.com (Classic) # - s3-us-west-2.amazonaws.com (Specific region) # - bukkit.s3.amazonaws.com (Vhosted Classic) # - bukkit.s3-ap-northeast-1.amazonaws.com (Vhosted specific region) # - s3.cn-north-1.amazonaws.com.cn - (Beijing region) # - bukkit.s3.cn-north-1.amazonaws.com.cn - (Vhosted Beijing region) parts = self.split_host_parts(host) if self.region_name is not None: region_name = self.region_name else: # Classic URLs - s3-us-west-2.amazonaws.com if len(parts) == 3: region_name = self.clean_region_name(parts[0]) # Special-case for Classic. if region_name == 's3': region_name = 'us-east-1' #这里有个坑,下面会讲 else: # Iterate over the parts in reverse order. for offset, part in enumerate(reversed(parts)): part = part.lower() # Look for the first thing starting with 's3'. # Until there's a ``.s3`` TLD, we should be OK. :P if part == 's3': # If it's by itself, the region is the previous part. region_name = parts[-offset] # Unless it's Vhosted classic if region_name == 'amazonaws': region_name = 'us-east-1' break elif part.startswith('s3-'): region_name = self.clean_region_name(part) break return region_name走读boto代码,发现其实region_name字段就是将host按"."进行切分,取前面部分进行处理得出,如果host为ceph.work,那么切分出来的"ceph"当然对应不上了,所以想要让boto支持AWS4,你的host必须有3个字段,比如"s3.ceph.work"。如果你采取掩耳盗铃方式,只是去调整boto代码如下
from boto.s3.connection import S3Connectionimport botoimport osos.environ['S3_USE_SIGV4'] = 'True'endpoint = 's3.ceph.work' #新增一个字段bucket_name = 'test1'access_key = ''secret_key = ''conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host=endpoint, is_secure=False, calling_format=boto.s3.connection.SubdomainCallingFormat(), validate_certs=True,)bucket = conn.get_all_buckets()print bucket
那么你将看到如下异常
Traceback (most recent call last):... File "/Users/Diluga/lwc/lib/python2.7/site-packages/boto/s3/connection.py", line 444, in get_all_buckets response.status, response.reason, body)boto.exception.S3ResponseError: S3ResponseError: 400 Bad RequestInvalidBucketNames3 tx000000000000000000001-0058d4d9ad-85cc-default 85cc-default-default
这个400错误,说明你提交数据的姿势不对,
从抓包来看这个us-east-1就是你提交的region_name了,这里也给我们埋了一个坑,如果我们的host第一个字段是"s3",那么region_name就是被硬编码成了"us-east-1",如果是"s3-abc"或者是其他,则region_name变成我们自定义的字段,好在ceph默认是允许你在request header里面随便填region_name,不然就真的悲剧了。
这里正确的姿势应该是调整ceph.conf里面的rgw配置如下.
方案1
[client.radosgw.cn-zone1] rgw dns name = s3.ceph.work #原有host基础上新增一个字段,boto提交的region_name会是"us-east-1" rgw frontends = fastcgi socket_port=9000 socket_host=127.0.0.1 host = demo keyring = /etc/ceph/ceph.client.radosgw.keyring rgw socket path = /home/ceph/var/run/ceph-client.radosgw.cn-zone1.sock log file = /home/ceph/log/radosgw.cn-zone1.log rgw print continue = false rgw content length compat = true
方案2
[client.radosgw.cn-zone1] rgw dns name = s3-abc.ceph.work #原有host基础上新增一个字段,boto提交的region_name会是"abc" rgw frontends = fastcgi socket_port=9000 socket_host=127.0.0.1 host = demo keyring = /etc/ceph/ceph.client.radosgw.keyring rgw socket path = /home/ceph/var/run/ceph-client.radosgw.cn-zone1.sock log file = /home/ceph/log/radosgw.cn-zone1.log rgw print continue = false rgw content length compat = true
感谢各位的阅读,以上就是"boto支持aws4引发的错误怎么解决"的内容了,经过本文的学习后,相信大家对boto支持aws4引发的错误怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
支持
字段
错误
就是
学习
代码
内容
基础
姿势
方案
版本
处理
调整
配置
不对
掩耳盗铃
信息
只是
思路
悲剧
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库中课程号英文是什么
山东招聘hr软件开发
电子商务网络安全解决措施
全国中职网络技术模拟试题
全球网络安全大学排名
漳州网络安全作业
我的世界怎样使服务器卡顿
怎么查看服务器日志记录入侵
湖南软件开发工程师培训哪家好
上海交大网络安全下载
检察网络安全
望远县软件开发公司报价多少
网络安全比赛啥意思
方舟人物服务器在哪个位置
古交软件开发公司推荐
科技互联网创业计划书范文
网络技术用英语怎么说读
黑月为什么显示连接服务器失败
超低价服务器
合肥二手服务器回收咨询客服
加强网络技术防护
arcgis样式数据库
阿里云服务器文件上传
数据库网站克隆工具
延庆区品质软件开发服务电话
国家网络安全建设视频
人人代理服务器
本地电脑怎么配网页服务器
网络安全绘画创意说明
人民银行软件开发中心地址