如何只获取运行的列表?

How to get the list of running only?

我只需要从 AWS 获取 运行 IP,该函数只提取列为 EIP 的 IP,其中也包括非关联 IP。

def gather_public_ip():
   ACCESS_KEY = config.get('aws','access_key')
   SECRET_KEY = config.get('aws','secret_key')
   regions = ['ap-northeast-1']
   all_EIP = []
   for region in regions:
      client = boto3.client('ec2',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,region_name=region,)
      addresses_dict = client.describe_addresses()
      for eip_dict in addresses_dict['Addresses']:
          print eip_dict['PublicIp']

          return eip_dict['PublicIp']

有人能帮帮我吗??

您可以从以下查询中获得

  • 获取 运行 实例的私有 IP 列表

aws ec2 describe-instances --filters "Name=instance-state-code, Values=16" --query "Reservations[*].Instances[*].PrivateIpAddress" --output text

  • 获取 运行 个实例的 Public IP 列表

aws ec2 describe-instances --filters "Name=instance-state-code, Values=16" --query "Reservations[*].Instances[*].PublicIpAddress" --output text

要转换为 python 代码,您可以执行类似

的操作
response = client.describe_instances(
    Filters=[
        {
            'Name': 'instance-state-code',
            'Values': [
                '16',
            ]
        },
    ],)

然后你需要阅读关于Reservations[*].Instances[*].PrivateIpAddressReservations[*].Instances[*].PublicIPAddress

的JSON输出

instance-state-code 的定义/可能值为

The state of the instance, as a 16-bit unsigned integer. The high byte is an opaque internal value and should be ignored. The low byte is set based on the state represented. The valid values are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64 (stopping), and 80 (stopped).

如下所示,您需要通过查看预订/实例数据来过滤掉 运行 个实例。我还添加了检查主机是否有 public ip

e = client.describe_instances()
for r in e['Reservations']:
    if r['Instances'][0]['State']['Name'] == 'running'\
    and 'PublicIpAddress' in r['Instances'][0]:
        print r['Instances'][0]['PublicIpAddress']

关联的EIP会有对应的PrivateIpAddress。如果没有关联 EIP,eip_dict 将不会有 PrivateIpAddress。所以只需在您的代码中添加一个额外的检查:

  for eip_dict in addresses_dict['Addresses']:
      if 'PrivateIpAddress' in eip_dict:
          print eip_dict['PublicIp']

这将打印所有关联的弹性 IP 地址——无论实例是否为 运行。如果你真的只想要 运行 个实例的弹性 ip 地址,那么你必须应用另一个过滤器。使用 Vorsprung 提出的解决方案获取 运行 个实例并过滤列表。