通过ec2描述实例boto3迭代

use*_*074 11 python amazon-ec2

我刚开始使用boto3并尝试获取描述实例调用的特定值.因此,例如,如果我想获得'Hypervisor'值或Ebs从输出中获得'DeleteOnTermintation'值.下面是我当前用于进行调用并通过字典输出进行迭代的当前代码.

import boto3
import pprint
from datetime import datetime
import json

client = boto3.client('ec2')

filters = [{  
'Name': 'tag:Name',
'Values': ['*']
}]


class DatetimeEncoder(json.JSONEncoder):
  def default(self, obj):
    if isinstance(obj, datetime):
        return obj.strftime('%Y-%m-%dT%H:%M:%SZ')
    elif isinstance(obj, date):
        return obj.strftime('%Y-%m-%d')
    # Let the base class default method raise the TypeError
    return json.JSONEncoder.default(self, obj)    


output = json.dumps((client.describe_instances(Filters=filters)), cls=DatetimeEncoder)  

pprint.pprint(output)

for v in output:
  print v['Hypervisor']
Run Code Online (Sandbox Code Playgroud)

得到此错误:

TypeError:字符串索引必须是整数,而不是str

使用pprint查看输出中的所有可用值.

谢谢..

Joh*_*ein 19

以下是通过AWS命令行界面(CLI)显示信息的方法:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, Hypervisor, NetworkInterfaces[0].Attachment.DeleteOnTermination]'
Run Code Online (Sandbox Code Playgroud)

这是一些Python:

import boto3

client = boto3.client('ec2')

response = client.describe_instances()

for r in response['Reservations']:
  for i in r['Instances']:
    print i['InstanceId'], i['Hypervisor']
    for b in i['BlockDeviceMappings']:
      print b['Ebs']['DeleteOnTermination']
Run Code Online (Sandbox Code Playgroud)

  • 谢谢约翰。现在,我可以在您的示例基础上进一步定制脚本。 (2认同)

aho*_*cke 10

这是约翰的答案,但已针对 Python3 进行了更新

import boto3

client = boto3.client('ec2')

response = client.describe_instances()

for r in response['Reservations']:
    for i in r['Instances']:
        print(i['InstanceId'], i['Hypervisor'])
        for b in i['BlockDeviceMappings']:
            print(b['Ebs']['DeleteOnTermination'])  
Run Code Online (Sandbox Code Playgroud)


GCh*_*mon 7

我知道我有点迟到了,但为了可读性,我的 2 美分是使用生成器理解(python 3):

import boto3

client = boto3.client('ec2')

response = client.describe_instances()
block_mappings = (block_mapping
                  for reservation in response["Reservations"]
                  for instance in reservation["Instances"]
                  for block_mapping in instance["BlockDeviceMappings"])

for block_mapping in block_mappings:
  print(block_mapping["Ebs"]["DeleteOnTermination"])
Run Code Online (Sandbox Code Playgroud)

您还可以使用jmespathawscli 标志背后的相同查询引擎--query来自动获取嵌套结果:

import jmespath
import boto3

client = boto3.client('ec2')

response = client.describe_instances()
print(jmespath.search(
    "Reservations[].Instances[].DeviceBlockMappings[].Ebs.DeleteOnTermination", 
    response
))
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要更多电量,请使用pyjq. 它的语法与 awscli 中使用的 jmespath 略有不同,但它比它有更多优点。假设您不仅想要DeviceBlockMappings而且还想要保留与其InstanceId相关的内容。您实际上jmespath无法做到这一点,因为无法访问外部结构,只有一个嵌套路径。在pyjq你可以做这样的事情:

import pyjq
import boto3

client = boto3.client('ec2')

response = client.describe_instances()
print(pyjq.all(
  "{id: .Reservations[].Instances[].InstanceId, d:.Reservations[].Instances[].DeviceBlockMappings[]}",
  response
))
Run Code Online (Sandbox Code Playgroud)

这将产生一个设备块映射列表及其相应的 InstanceId,有点像 mongo 的展开操作:

{'id': string, d: {'Ebs': {'DeleteOnTermination': boolean}}}[]
Run Code Online (Sandbox Code Playgroud)