【问题标题】:How to print EC2 Tag name along with IP address?如何打印 EC2 标签名称和 IP 地址?
【发布时间】:2025-12-18 19:35:01
【问题描述】:

我有一个打印运行实例的公共 IP 的代码,

regions = ['us-east-1','us-west-1','us-west-2','eu-west-1','sa-east-1','ap-southeast-1','ap-southeast-2','ap-northeast-1']
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']:
      if 'PrivateIpAddress' in eip_dict:
          print eip_dict['PublicIp']

这很好,现在我也想打印tag name 并将其存储在另一个字典中,我知道我可以这样做:

regions = ['us-east-1','us-west-1','us-west-2','eu-west-1','sa-east-1','ap-southeast-1','ap-southeast-2','ap-northeast-1']
for region in regions:
  client = boto3.client('ec2',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,region_name=region,)
  dex_dict = client.describe_tags()
  for dexy_dict in dex_dict['Tags']:
     print dexy_dict['Value']

问题是我如何将它组合到一个函数中并使用 2 个字典:一个用于存储 IP,另一个用于存储标记名?请帮忙

【问题讨论】:

  • 您在寻找结构为 {client:[IP, tag_name]} 的字典吗?
  • 是的,但我需要能够将这些值传递给另一个 def ,所以请帮助我如何返回

标签: python amazon-ec2 boto3


【解决方案1】:

试试下面的代码,它会给你一个字典,其中键是InstanceId,值是[PublicIP, Name]的列表。

import boto3

def instance_info():
    instance_information = {}
    ip_dict = {}
    client = boto3.client('ec2')
    addresses_dict = client.describe_addresses().get('Addresses')

    for address in addresses_dict:
        if address.get('InstanceId'):
            instance_information[address['InstanceId']] = [address.get('PublicIp')]

    dex_dict = client.describe_tags().get('Tags')
    for dex in dex_dict:
        if instance_information.get(dex['ResourceId']):
            instance_information[dex['ResourceId']].append(dex.get('Value'))

    for instance in instance_information:

        if len(instance_information[instance]) == 2:
            ip_dict[instance_information[instance][0]] = instance_information[instance][1]
        else:
            ip_dict[instance_information[instance][0]] = ''
    return instance_information, ip_dict

【讨论】:

  • 抛出我:Traceback (most recent call last): File "stackHELP.py", line 10, in <module> instance_information[address['InstanceId']] = [address.get('PublicIp')] KeyError: 'InstanceId' , 即应该检查实例 id,这是否只返回 RUNNING 实例??
  • 我用我的 AWS 实例尝试了这个功能,但我只得到了正在运行的实例。
  • 我得到了类似的东西:{} {'i-93cd0221': ['54.21.1.22', 'email-relay']} Traceback (most recent call last): File "stackHELP.py", line 11, in <module> instance_information[address['InstanceId']] = [address.get('PublicIp')] KeyError: 'InstanceId'
  • 我相应地修改了函数。
  • 酷,这行得通,现在如果我想访问 IP 或实例标签,因为我需要将返回代码中的 IP 传递给其他代码