使用for循环调用AWS Boto3时遇InvalidInstanceID.Malformed错误求助
解决EC2 describe_instances循环读取实例ID时的InvalidInstanceID.Malformed错误
问题根源
从报错信息能看到,传入的实例ID末尾带有换行符('i-03b6908c79e0dd9dd'后面的换行痕迹),这是因为直接读取文件行时,每行末尾的\n没有被去除,导致AWS API识别为无效的实例ID格式。
修复代码
在读取每行内容后,用.strip()方法去除首尾空白字符(包括换行符、空格等),同时推荐用with语句管理文件,避免资源泄漏:
#!/usr/bin/python3 import boto3 import csv ec2_re = boto3.resource('ec2') ids= [instance.id for instance in ec2_re.instances.all()] with open('ids.txt', 'w') as file_handler: for id in ids: file_handler.write('{}\n'.format(id)) ec2 = boto3.client('ec2', region_name='us-east-1') # 用with语句自动管理文件关闭 with open("ids.txt", "r") as INSTANCE_ID: for x in INSTANCE_ID: # 去除换行符和首尾空白 instance_id = x.strip() # 跳过空行(防止文件末尾有空行导致错误) if not instance_id: continue result = [] response = ec2.describe_instances( InstanceIds=[instance_id] ).get('Reservations') # 这里可添加response的处理逻辑,比如打印、存储结果
优化方案(跳过文件IO)
其实你完全可以省去写入文件再读取的步骤,直接用一开始获取的ids列表循环,效率更高:
#!/usr/bin/python3 import boto3 import csv ec2_re = boto3.resource('ec2') ids= [instance.id for instance in ec2_re.instances.all()] ec2 = boto3.client('ec2', region_name='us-east-1') for instance_id in ids: result = [] response = ec2.describe_instances( InstanceIds=[instance_id] ).get('Reservations') # 处理response逻辑
内容的提问来源于stack exchange,提问作者maxbeeeee
相关产品推荐
相关产品推荐

