ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

boto v2.48.0 版本解析:S3 匿名连接预签名 URL、Endpoint 启发式与配置化 Host 三处修复的深度解读

boto v2.48.0 版本解析:S3 匿名连接预签名 URL、Endpoint 启发式与配置化 Host 三处修复的深度解读 后端云原生【免费下载链接】botoFor the latest version of boto, see https://github.com/boto/boto3 -- Python interface to Amazon Web Services项目地址https://gitcode.com/gh_mirrors/bo/boto点击查看免费下载导读本文围绕 boto 项目 2.48.0 版本发布于 2017/06/29的官方发布说明见 docs/source/releasenotes/v2.48.0.rst展开逐一拆解该版本针对 S3 相关缺陷以及近期新增的 endpoint 启发式heuristics功能所做的三处修复。读者在读完本文后将能理解匿名连接下generate_url()报错的原因与规避方式、endpoint 启发式的开关机制与默认行为变化以及如何通过 boto 配置文件自定义 S3 服务 Host并借助仓库源码与单元测试获得可验证的底层依据。版本概览一次聚焦 S3 与端点解析的维护性发布根据官方发布说明boto v2.48.0 是一次小规模的缺陷修复发布核心目标是解决若干与 S3 相关的 bug以及近期 endpoint 启发式功能的一个 bug。整个版本共包含三项变更变更关联 Issue提交 SHA修复匿名连接下调用generate_url()时的AttributeError#373483481807使用启发式解析端点时默认改用RegionInfo对象#37370a9b1140允许从 boto 配置文件中显式指定 S3 的 host#3738dcfc7512下文将按照现象与修复逻辑、源码实现证据、单元测试验证、实战用法四个层次对每一项变更进行深入讲解。修复一匿名连接下generate_url()的 AttributeError问题现象在 boto v2.48.0 之前当用户以匿名anonymous方式创建 S3 连接并调用generate_url()生成预签名presignedURL 时可能触发AttributeError。这是因为旧版generate_url()在生成查询字符串签名时直接访问了连接对象上并不总是存在的匿名标记属性。源码级修复逻辑在 v2.48.0 中修复后的generate_url()位于 boto/s3/connection.py。其关键分支逻辑如下if query_auth and not self.anon: c_string boto.utils.canonical_string(method, auth_path, headers, expires, self.provider) b64_hmac self._auth_handler.sign_string(c_string) encoded_canonical urllib.parse.quote(b64_hmac, safe) query_part ? self.QueryString % (encoded_canonical, expires, self.aws_access_key_id) else: query_part 可见匿名anon路径被显式纳入判断只有query_auth为真且并非匿名连接时才会计算 HMAC 签名并拼入Signature...Expires...AWSAccessKeyId...查询参数匿名连接直接跳过签名段。而anon标记本身在S3Connection.__init__中被规范化处理见 boto/s3/connection.pyif anon is None: # Only fetch from the config option if a non-default arg value was # provided. anon boto.config.getbool(s3, no_sign_request, False) self.anon anon也就是说anon参数的取值优先级为显式传参 配置文件[s3] no_sign_request项 默认False。该配置项允许用户通过no_sign_request True让所有请求默认不携带签名常用于访问公共读 bucket 或本地 S3 兼容服务。单元测试验证tests/unit/s3/test_connection.py 中的TestAnon测试类专门覆盖了此场景test_generate_url以anonTrue、hosts3.amazonaws.com创建连接调用conn.generate_url(0, GET, bucketexamplebucket, keytest.txt)断言生成的 URL不包含Signature段test_anon_default_taken_from_config_opt仅设置配置[s3] no_sign_request True同样断言无签名段test_explicit_anon_arg_overrides_config_value配置与显式anonFalse冲突时显式参数优先断言 URL包含Signature。这三个用例同时验证了默认取配置、显式参数覆盖配置的取值优先级与本小节上述__init__中的实现一一对应。实战用法匿名生成下载 URLimport boto.s3.connection conn boto.s3.connection.S3Connection( anonTrue, hosts3.amazonaws.com, ) url conn.generate_url(0, GET, bucketexamplebucket, keytest.txt) print(url) # 输出不含 Signature 签名段注意generate_url(expires_in0)表示立即过期语义上更常用于测试断言实际业务中请传入正整数秒数。此外高层 APIKey.generate_url()也会透传到连接层的同名方法见 boto/s3/key.py因此匿名 Key 同样适用。修复二启发式端点解析默认使用 RegionInfo背景什么是 endpoint 启发式boto 2 通过内置的endpoints.json见 boto/endpoints.json记录各服务在各区域下的已知端点。传统流程是在已知区域列表中逐一遍历查找匹配的RegionInfo若区域不在列表中则返回None连接失败。endpoint 启发式heuristics则不同当在已知区域中找不到目标区域时允许基于 botocore/boto3 风格的端点数据动态推导出形如service.region.amazonaws.com的主机名从而兼容 AWS 新开放、尚未收录进 boto 内置表的区域。修复点#3737 的语义变化v2.48.0 之前启发式解析返回的是一个普通裸连接对象缺少区域元数据封装本次修复改为当触发启发式路径时默认构造一个标准的RegionInfo对象使连接在区域信息、connect()行为上与已知区域完全对齐。相关实现位于 boto/regioninfo.pyif region is None and _use_endpoint_heuristics(): region _get_region_with_heuristics( service_name, region_name, region_cls, connection_cls )而_get_region_with_heuristics的底层def _get_region_with_heuristics(service_name, region_name, region_clsNone, connection_clsNone): Finds the region using known regions and heuristics. endpoints load_endpoint_json(boto.ENDPOINTS_PATH) resolver BotoEndpointResolver(endpoints) hostname resolver.resolve_hostname(service_name, region_name) return region_cls( nameregion_name, endpointhostname, connection_clsconnection_cls )其中BotoEndpointResolver定义于 boto/endpoints.py其resolve_hostname()基于与 botocore/boto3 同格式的端点数据构造端点若无法构造则返回None。从源码结构看启发式对未知区域的推导依赖的是端点数据的 hostname 模板而不是硬编码区域表。开关机制环境变量与配置文件双通道启发式功能默认关闭。_use_endpoint_heuristics()见 boto/regioninfo.py给出了两条开启途径def _use_endpoint_heuristics(): env_var os.environ.get(BOTO_USE_ENDPOINT_HEURISTICS, false).lower() config_var boto.config.getbool(Boto, use_endpoint_heuristics, False) return env_var true or config_var开启方式配置项示例环境变量BOTO_USE_ENDPOINT_HEURISTICSexport BOTO_USE_ENDPOINT_HEURISTICStrue配置文件[Boto] use_endpoint_heuristics见下方 boto.cfg 示例单元测试验证tests/unit/test_regioninfo.py 用三组用例锁定了该功能的行为边界test_does_not_use_heuristics_by_default默认情况下连接不存在的区域如us-southeast-43返回None证明默认关闭test_use_heuristics_via_env_var设置环境变量BOTO_USE_ENDPOINT_HEURISTICSTrue后同一区域可成功连接且推导出端点ec2.us-southeast-43.amazonaws.comtest_use_heuristics_via_configmockboto.config.getbool(Boto, use_endpoint_heuristics)返回True时同样生效。实战用法boto.cfg通常位于/etc/boto.cfg或用户主目录的~/.boto[Boto] use_endpoint_heuristics True随后即可直接连接未收录于内置表的新区域例如import boto conn boto.connect_ec2(us-southeast-43) # 在启发式开启时将按模板推导 ec2.us-southeast-43.amazonaws.com需要说明的适用前提启发式依赖endpoints.json的模板推导能力若某服务在端点数据中没有通用 hostname 模板推导结果可能为None此时连接仍会失败。修复三从 boto 配置文件指定 S3 Host解决的问题此前S3Connection的主机名只能通过构造参数host显式传入或回退到类属性DefaultHost s3.amazonaws.com见 boto/s3/connection.py。对于需要连接自建 S3 兼容存储、区域性 S3 端点或代理环境的用户无法通过配置文件统一管理造成配置分散。v2.48.0 通过 #3738 引入了[s3] host配置项。源码级解析顺序实现位于S3Connection.__init__见 boto/s3/connection.pyno_host_provided False if host is NoHostProvided: host boto.config.get(s3, host) if host is None: host self.DefaultHost no_host_provided True其中NoHostProvided是一个哨兵类见 boto/s3/connection.py用于区分用户是否显式传了 host。由此得到完整的主机名解析优先级构造参数host...显式传参配置文件[s3] host ...v2.48.0 新增默认值s3.amazonaws.com。值得注意的连带约束若最终落到默认值即用户既未传 host、配置也未提供且当前认证能力为 SigV4hmac-v4-s3则__init__会抛出HostRequiredError——When using SigV4, you must specify a host parameter.见 boto/s3/connection.py。因此在使用 SigV4 签名例如强制使用 v4 签名的区域或服务时必须显式指定 host而新增的[s3] host配置正好提供了与代码参数等效的声明手段。实战用法boto.cfg[s3] host s3.amazonaws.com calling_format boto.s3.connection.SubdomainCallingFormathostS3 服务端点主机名默认s3.amazonaws.com连接自建兼容服务时改为对应地址。calling_format调用格式默认即为SubdomainCallingFormat即 URL 形如https://bucket.s3.amazonaws.com/...如需路径风格可改为boto.s3.connection.OrdinaryCallingFormat。该默认值同样读取自[s3]段见 boto/s3/connection.py。随后无需传 host 参数即可创建连接import boto.s3.connection conn boto.s3.connection.S3Connection( aws_access_key_idYOUR_KEY, aws_secret_access_keyYOUR_SECRET, ) # host 将取自 [s3] host 配置项三项修复的联动关系与升级建议从实现细节可以看出这三处变更并非孤立补丁而是围绕 S3 使用链路的一次系统性收尾#3734 完善了匿名访问下的 URL 生成路径使其与签名访问路径行为一致#3738 为 S3 端点自定义提供了配置化入口减轻了 SigV4 场景下必须显式传 host的配置负担#3737 则修复了启发式端点解析的返回类型让通过配置use_endpoint_heuristics与自定义 host 组合使用的新区域连接拥有统一的RegionInfo语义。升级到 v2.48.0 后建议若此前依赖匿名连接 generate_url()可补充回归测试断言 URL 不含Signature若已启用BOTO_USE_ENDPOINT_HEURISTICS可验证新区域连接返回的region.endpoint是否正确若此前通过环境或代码硬编码 S3 主机名可迁移到[s3] host配置项以统一管理。参考路径索引内容仓库相对路径发布说明docs/source/releasenotes/v2.48.0.rstS3 连接与 generate_url 实现boto/s3/connection.pyKey 层 generate_url 透传boto/s3/key.py启发式端点解析与开关boto/regioninfo.py端点解析器boto/endpoints.py端点数据boto/endpoints.json匿名连接回归测试tests/unit/s3/test_connection.py启发式功能回归测试tests/unit/test_regioninfo.py赞分享后端云原生【免费下载链接】botoFor the latest version of boto, see https://github.com/boto/boto3 -- Python interface to Amazon Web Services项目地址https://gitcode.com/gh_mirrors/bo/boto点击查看免费下载相关推荐N_m3u8DL-RE 源码编译3 条命令拿到任意平台的可执行文件N_m3u8DL RE 源码编译3 条命令拿到任意平台的可执行文件 N_m3u8DL RE 源码编译就是为这个场景准备的官方 Release 版本落后于代码CLI音视频boto v2.1.0 版本特性全解析S3 服务端加密、VPC、EMR combiner 与 CloudFront 签名 URL 实践指南boto v2.1.0 版本特性全解析S3 服务端加密、VPC、EMR combiner 与 CloudFront 签名 URL 实践指南 本文围绕 boto后端云原生boto 2.0.0 版本发布详解连接池修复、EMR 实例组管理与 Route 53 别名记录boto 2.0.0 版本发布详解连接池修复、EMR 实例组管理与 Route 53 别名记录 导读 boto 是 Python 社区早期广泛使用的 Amaz后端云原生上一篇Winboat安全沙箱深度解析Windows应用在Linux环境下的资源隔离机制下一篇构建下一代边缘AI跨平台语言模型推理框架全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表