关于使用boto3方式获取AWS-所有EC2-机型及属性时所遇到的结果返回不全的坑点及使用分页机制的解决方法
Posted on 2023-01-01 15:21 520_1351 阅读(309) 评论(0) 编辑 收藏 举报对于aws如果我们想获取现在提供的所有的机型及相关的属性,我们可以使用aws cli命令如下:
[qq5201351@localhost ~]$ aws ec2 describe-instance-types --query InstanceTypes[].InstanceType
可以发现截止2023-01-01,一共有259个实例机型,不要--query后面的部分,可以查看到每个实例机型详细的属性,如cpu,内存等信息
但是笔者是准备使用boto3的方式获取aws所有实例机型相关的信息,于是有了如下的核心代码:
session=boto3.Session(profile_name=AWS_Account_XXX,region_name='cn-north-1') client = session.client('ec2') EC2Response = client.describe_instances() EBSResponse = client.describe_volumes() EC2InstanceTypeResponse=client.describe_instance_types() print(EC2InstanceTypeResponse)
但是却发现只有返回100个结果,也就是返回的实例机型不全,关键这个最坑的是没有任何提示和报错,不仔细核心,可能还真以为EC2的实例机型就100种
因为在后续代码中发现有没有机型查询不到,才猜到可能不全,对于没有在结果中的实例,笔者通过API文档发现也可以通过如下的方式得到
EC2InstanceTypeResponse=client.describe_instance_types(InstanceTypes=['t3.small','r3.large'])
但是这样分别查询效率必然会低很多,笔者又发现还有一个参数MaxResults=xx,可以指定返回的条数,于是笔者又将此值指定到很大,如99999
但是又返回报错:
botocore.exceptions.ClientError: An error occurred (InvalidMaxResults) when calling the DescribeInstanceTypes operation: Value ( 99999 ) for parameter maxResults is invalid. Expecting a value from ( 5 ) to ( 100 ).
从这里可以看出就算指定返回的结果值条数,指定的范围也只能是 5~100
那么如何才能返回全部的结果呢,按理说官网在提供API编程方法时不可能没有考虑到这个bug呢、于是又查阅了大量的官网资料才发现
有些返回,当数据过多时,默认没有使用分布的机制,我们需要引入.get_paginator分布机制才能得到全部的结果,注意参数不可以加(),在写法上稍稍调整一下即可
session=boto3.Session(profile_name=AWS_Account_XXX,region_name='cn-north-1') client = session.client('ec2') EC2Response = client.describe_instances() EBSResponse = client.describe_volumes() EC2InstanceTypeResponse=client.get_paginator("describe_instance_types") for EC2InstanceTypeResponsePage in EC2InstanceTypeResponse.paginate(): for EC2InstanceTypeItem in EC2InstanceTypeResponsePage['InstanceTypes']: EC2InstanceType=EC2InstanceTypeItem['InstanceType'] print(EC2InstanceType)
这时我们执行时,就可以看到能返回所有的结果,其中每页默认依然是100条,一共分3次就能全部返回了~
终于完美的解决了这个问题,想起来,这个确实是AWS boto3 API的一个巨大的坑点,在client.describe_instance_types()说明中也没有明确地说明解决方法
最后还得大量其他页面才知道有分机的这个机制~,于是记录于此,希望能帮助到其他被这个分布机制坑到的朋友~
关于分布机制及详细的介绍可以参考:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/paginators.html
尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/17018113.html
作者:一名卑微的IT民工
出处:https://www.cnblogs.com/5201351
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
由于博主的水平不高,文章没有高度、深度和广度,只是凑字数,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个卑微的IT民工!