- 后端
- 云原生
【免费下载链接】boto
For the latest version of boto, see https://github.com/boto/boto3 -- Python interface to Amazon Web Services
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
相关推荐
boto ELB负载均衡终极指南:10步实现高可用应用配置
boto ELB负载均衡终极指南:10步实现高可用应用配置 想要构建高可用的Web应用?boto ELB负载均衡服务正是您需要的解决方案!🚀 作为AWS弹性负
后端云原生boto 弹性负载均衡(ELB)接口实战指南:从连接、健康检查到实例管理
boto 弹性负载均衡(ELB)接口实战指南:从连接、健康检查到实例管理 导读 :本文以 boto 仓库的官方教程 docs/source/elb_tut.rs
后端云原生Proxmox VE Helper-Scripts与华为云ELB:负载均衡集成
Proxmox VE Helper Scripts与华为云ELB:负载均衡集成 项目概述 Proxmox VE Helper Scripts 是一套简化Prox
运维虚拟化DevOps
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考