☰
boto v2.18.0 版本解析:SAML 联合认证、CloudWatch SigV4 与 ELB 跨可用区负载均衡
2026/10/7 1:58:34 网站建设 项目流程
  • 后端
  • 云原生

【免费下载链接】boto

For 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 v2.18.0 是 2013 年 11 月发布的重要版本,它围绕身份与访问管理(IAM/STS 的 SAML 联合认证)、CloudWatch 签名算法升级、ELB 属性配置、RDS 主从切换与重命名、EC2 快照镜像注册等方向补充了大量新 API 与参数,并修复了 HTTP 请求头 Unicode 编码等一系列问题。阅读本文后,你将掌握该版本中每个新特性的调用入口、参数语义与底层实现,并能基于 boto 仓库源码快速定位对应代码。

版本概览

本版本的发布说明见 v2.18.0.rst,发布日期为 2013/11/22。该版本的核心更新方向如下:

  • 为 AWS Identity and Access Management(IAM)、AWS Security Token Service(STS)新增与 SAML 相关的调用;
  • Elastic Load Balancing(ELB)新增 Attributes 支持与跨可用区负载均衡(Cross Zone Balancing)配置;
  • Amazon Elastic Compute Cloud(EC2)更新get_all_snapshots,并支持基于快照注册镜像;
  • Amazon Relational Database Service(RDS)新增只读副本提升(promote)与实例重命名(rename)支持;
  • Elastic Transcoder API 与参数获得补充;
  • Amazon Redshift 开始支持 SNS 通知;
  • CloudWatch 改用签名版本四(Signature Version 4);
  • 修复 HTTP 请求头编码问题,并为多个服务修复文档。

SAML 联合认证:STS 与 IAM 的新调用

v2.18.0 的核心新特性之一是为 STS 与 IAM 增加 SAML 相关调用(对应 发布说明 中 issue 1867 的改动)。这套能力让企业可以把内部身份目录(如 AD/LDAP)通过 SAML 2.0 协议与 AWS 的基于角色的访问控制绑定,无需为每个用户单独分发 AWS 密钥。

STS:assume_role_with_saml

在 boto/sts/connection.py 中新增了assume_role_with_saml方法,它返回一组临时安全凭证(Access Key ID、Secret Access Key 与 Security Token),供已经通过 SAML 认证响应的用户使用。方法签名与参数语义如下:

def assume_role_with_saml(self, role_arn, principal_arn, saml_assertion, policy=None, duration_seconds=None):

各参数含义(均来自 源码 docstring):

  • role_arn:要扮演的 IAM 角色的 ARN;
  • principal_arn:IAM 中描述 IdP 的 SAML provider 的 ARN;
  • saml_assertion:IdP 提供的 Base64 编码的 SAML 认证响应(断言);
  • policy:可选的 IAM JSON 策略,用于在角色权限基础上进一步收敛权限,策略长度必须不超过 2048 字节、打包后小于 450 字节;
  • duration_seconds:会话时长,取值范围 900 秒(15 分钟)到 3600 秒(1 小时),默认 3600 秒;实际过期时间取本参数与 SAML 响应中NotOnOrAfter字段中较短的哪一个。

底层实现上,该方法组装RoleArn、PrincipalArn、SAMLAssertion三个必选参数,可选地附加Policy与DurationSeconds,通过get_object('AssumeRoleWithSAML', ...)发起 POST 请求。一个值得注意的实现细节是:SAML 断言在请求中需要被 URL 编码——这一点在 boto/auth.py 中有明确注释,指出 STS 要求assume_role_with_saml调用时对saml_response做 URL 编码。

该调用不需要调用方持有 AWS 安全凭证,调用者身份通过上传到 SAML provider 实体的元数据文档中的密钥来校验,这是它与AssumeRole的重要区别。

IAM:SAML Provider 全生命周期管理

配合 STS 的AssumeRoleWithSAML,boto/iam/connection.py 新增了 SAML Provider 的增删改查四个方法:

方法对应 API作用
create_saml_provider(saml_metadata_document, name)CreateSAMLProvider上传 IdP 生成的 SAML 2.0 元数据文档,创建描述 IdP 的实体
list_saml_providers()ListSAMLProviders列出账号内的 SAML provider
get_saml_provider(saml_provider_arn)GetSAMLProvider获取已上传的元数据文档
update_saml_provider(saml_provider_arn, saml_metadata_document)UpdateSAMLProvider更新已有 provider 的元数据文档
delete_saml_provider(saml_provider_arn)DeleteSAMLProvider删除 provider

创建 provider 时上传的元数据文档由组织使用的 IdP 身份管理软件生成,包含签发者名称、过期信息以及用于校验 SAML 认证响应(断言)的密钥。这些操作均要求使用 Signature Version 4 签名(源码 docstring 中明确注明 "This operation requires Signature Version 4")。需要注意的是,删除 provider 并不会更新任何将其作为信任策略 principal 引用的角色,后续任何尝试扮演该角色都会失败。

SAML 联合认证的完整链条是:IdP 签发断言 → IAM 中的 SAML provider 校验断言 → STSAssumeRoleWithSAML发放临时凭证。该链路常见于企业 Web 单点登录(SSO)与 API 级联合访问两类场景。

CloudWatch 升级为 SigV4 签名

v2.18.0 将 CloudWatch 的签名机制升级为 Signature Version 4。对应实现位于 boto/ec2/cloudwatch/init.py:

class CloudWatchConnection(AWSQueryConnection): APIVersion = boto.config.get('Boto', 'cloudwatch_version', '2010-08-01') DefaultRegionName = boto.config.get('Boto', 'cloudwatch_region_name', 'us-east-1') DefaultRegionEndpoint = boto.config.get('Boto', 'cloudwatch_region_endpoint', 'monitoring.us-east-1.amazonaws.com') ... def _required_auth_capability(self): return ['hmac-v4']

关键点是_required_auth_capability返回['hmac-v4'],即该连接类的所有请求默认使用 SigV4(hmac-v4)签名。CloudWatchConnection还展示了 boto 的配置化设计:API 版本、默认区域、默认端点均可通过 boto 配置文件中的cloudwatch_version、cloudwatch_region_name、cloudwatch_region_endpoint覆盖。此外,源码中还保留了一个时代性 hack:因 eu-west-1 端点 SSL 证书配置问题,该区域会自动关闭证书校验。

SigV4 与旧版 SigV2 的主要差异在于:请求需包含规范化的请求内容哈希、按时间排序的签名字符串以及Authorization头的特定构造。boto 的 SigV4 实现在 boto/auth.py 中,同一文件也包含对 S3 这类不做路径规范化的服务的特判逻辑(boto/auth.py)。

ELB:属性配置与跨可用区负载均衡

本版本为 ELB 增加了 Attributes(属性)支持,其中最具代表性的是跨可用区负载均衡(Cross Zone Balancing)。相关实现分布在三个文件中:

连接层:modify_lb_attribute 与 get_lb_attribute

boto/ec2/elb/init.py 中的modify_lb_attribute支持以下属性:

  • crosszoneloadbalancing:布尔值,接收True/False,内部转换为true/false字符串,对应请求参数LoadBalancerAttributes.CrossZoneLoadBalancing.Enabled;
  • accesslog:接收AccessLogAttribute实例,写入AccessLog.Enabled、AccessLog.S3BucketName、AccessLog.S3BucketPrefix、AccessLog.EmitInterval;
  • connectiondraining:接收ConnectionDrainingAttribute实例,写入ConnectionDraining.Enabled与ConnectionDraining.Timeout;
  • connectingsettings:接收ConnectionSettingAttribute实例,写入ConnectionSettings.IdleTimeout;
  • 传入未知属性会抛出ValueError('InvalidAttribute', attribute)。

读取侧由get_all_lb_attributes调用DescribeLoadBalancerAttributes返回LbAttributes对象,get_lb_attribute则在其上按属性名取值。

对象层:LoadBalancer 便捷方法

boto/ec2/elb/loadbalancer.py 为LoadBalancer对象提供了更友好的三个方法:

lb.is_cross_zone_load_balancing(force=False) # 查询,force 为 True 时强制重新拉取属性 lb.enable_cross_zone_load_balancing() # 启用跨可用区负载均衡 lb.disable_cross_zone_load_balancing() # 禁用跨可用区负载均衡

数据层:属性对象

boto/ec2/elb/attributes.py 定义了CrossZoneLoadBalancingAttribute数据类,其enabled字段承载开关状态;LbAttributes则聚合了跨可用区负载均衡、连接设置、访问日志、连接排空等全部属性,CrossZoneLoadBalancing作为可索引属性名返回对应对象(attributes.py)。

跨可用区负载均衡的意义在于:负载均衡器会把流量均匀分发到所有已注册实例所在的可用区,而不是仅本区实例,从而提升多可用区部署时的资源利用率与故障恢复能力。

RDS:只读副本提升与实例重命名

v2.18.0 为 RDS 新增了 promote(提升只读副本)与 rename(重命名实例)支持,实现均在 boto/rds/init.py:

promote_read_replica

boto/rds/init.py 中的promote_read_replica(id, backup_retention_period=None, preferred_backup_window=None)将只读副本提升为独立的数据库实例。参数说明:

  • id:新实例的唯一标识,1-63 个字母数字字符,首字符必须是字母,不能以连字符结尾或包含两个连续连字符;
  • backup_retention_period:自动备份保留天数,设为 0 表示禁用自动备份;
  • preferred_backup_window:自动备份的每日时间窗口(UTC),格式为hh24:mi-hh24:mi。

底层组装DBInstanceIdentifier并可选附加BackupRetentionPeriod、PreferredBackupWindow,调用PromoteReadReplica后返回DBInstance对象。

modify_dbinstance 与 rename

boto/rds/init.py 中的modify_dbinstance在原有参数基础上新增了new_instance_id参数,底层映射为NewDBInstanceIdentifier请求参数,从而实现实例重命名。该方法整体支持非常全面的修改面:参数组(DBParameterGroupName)、安全组(DBSecurityGroups.member、VpcSecurityGroupIds.member)、维护窗口(PreferredMaintenanceWindow)、主密码(MasterUserPassword)、分配存储(AllocatedStorage)、实例规格(DBInstanceClass)、备份保留期与备份窗口、多可用区(MultiAZ)、立即生效开关(ApplyImmediately)以及 IOPS(Iops)。

EC2:快照查询更新与基于快照注册镜像

本版本更新了 EC2 的get_all_snapshots,并支持直接用一个 EBS 快照注册为 AMI。

boto/ec2/connection.py 中的get_all_snapshots(snapshot_ids=None, ...)支持按快照 ID 列表过滤(通过build_list_params构造SnapshotId.member.N参数),同时提供delete_snapshot、copy_snapshot、get_snapshot_attribute等配套操作,本版本对过滤、分页等相关行为进行了更新。

更值得关注的是 register_image 新增的snapshot_id与delete_root_volume_on_termination参数:

  • snapshot_id:指定用于镜像根设备的快照 ID,与block_device_map互斥,且要求同时提供root_device_name;
  • delete_root_volume_on_termination:仅在使用快照创建镜像时生效,决定实例终止后是否删除根卷,默认False——源码 docstring 特别提醒"终止后遗留卷并非免费"。

实现层面,当传入snapshot_id时,boto 自动构造一个BlockDeviceType(snapshot_id=..., delete_on_termination=...)并包入BlockDeviceMapping(connection.py),最终通过ec2_build_list_params序列化为BlockDeviceMapping.N.Ebs.SnapshotId等请求参数(见 blockdevicemapping.py)。这为"快照 → AMI → 启动实例"的镜像生命周期流水线提供了便捷入口。

Bugfixes:编码修复与其他修正

v2.18.0 的缺陷修复集中在以下几个方面(详见 发布说明):

  • HTTP 请求头 Unicode 编码修复:修复了使用 unicode 值时 HTTP 请求头编码异常的问题(关联 issue 1864、1839、1829、1828、702)。这属于签名与请求构建层的问题,影响所有使用 boto 发起请求的服务;
  • Beanstalk 文档参数顺序修正:调整 boto/beanstalk/layer1.py 相关文档使其与参数声明顺序一致(issue 1863);
  • S3 下载清理顺序修复:下载 S3 Key 时确保文件在删除前已正确关闭(issue 1791,对应实现可参考 boto/s3/key.py 与 keyfile.py);
  • CloudTrail 文档错别字修复:修正 boto/cloudtrail/layer1.py 的文档笔误(issue 1861);
  • DynamoDBv2 教程补全:修复教程中缺失动词的句子(issue 1859/1825,相关教程见 dynamodb2_tut.rst);
  • GS 参数校验修复:修复 Google Storage 连接参数校验问题(issue 1858)。

源码阅读指引

如果想深入验证本版本内容,推荐按以下路径阅读仓库源码:

  • SAML 联合认证:boto/sts/connection.py 的assume_role_with_saml,boto/iam/connection.py 的 SAML provider 五个方法,以及 boto/auth.py 中对 SAML 断言 URL 编码的处理;
  • CloudWatch SigV4:boto/ec2/cloudwatch/init.py 的_required_auth_capability与配置化端点;
  • ELB Attributes:boto/ec2/elb/init.py、boto/ec2/elb/loadbalancer.py、boto/ec2/elb/attributes.py;
  • RDS:boto/rds/init.py 的promote_read_replica与modify_dbinstance;
  • EC2 快照与镜像:boto/ec2/connection.py 的register_image与 get_all_snapshots。

该版本处于 boto v2.x 系列中期,与相邻版本 v2.17.0(新增 CloudTrail 与 Redshift 新特性,见 v2.17.0.rst)共同构成了 2013 年末 AWS SDK 生态的能力扩张脉络。需要注意的是,文中所有 API 语义与实现细节均以当前仓库源码为准,boto v2 系列后续由 boto3 接替演进(见仓库 README.rst 的项目说明)。

  • 后端
  • 云原生

【免费下载链接】boto

For the latest version of boto, see https://github.com/boto/boto3 -- Python interface to Amazon Web Services

项目地址:https://gitcode.com/gh_mirrors/bo/boto
点击查看免费下载
上一篇:ET 框架的 Cursor 编辑器集成:com.unity.ide.cursor 包安装、源码原理与版本演进全解析
下一篇:OpenSeek-Mid-v1代码生成实战:在Python、JavaScript、Java等语言中的表现

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询