如何使用boto3获得ec2实例的arn

2024-04-23 15:15:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要所有ec2实例的arn。descripe_instances()不会给出实例。 是否有其他方法或某种方式可以列出所有ARN。 我需要将它们存储在数据库中,而且我现在正在处理示例实例,这最终需要对多个帐户也起作用。因此,一个始终有效的解决方案将是有帮助的


Tags: instances实例方法数据库示例方式帐户解决方案
2条回答

您可以自己重新创建它:

arn:aws:ec2:<REGION>:<ACCOUNT_ID>:instance/<instance-id>

为此,我认为您甚至可以使用*as和<;帐户ID>;,它会起作用的

有关更多信息,请参见此question

实际上,实例['Reservations'][0]['instances']可能没有所有实例。实例按安全组分组在一起。不同的安全组意味着将有许多列表元素。要获取该区域中的每个实例,需要使用下面的代码

注意:['Reservations'][0]['Instances']没有列出所有实例,它只提供按第一个安全组分组的实例。如果有许多组,则无法获得所有实例

import boto3
region = 'ap-south-1'

ec2 = boto3.client('ec2', region_name=region)

def list_instances():
    instance_ids = []
    response = ec2.describe_instances(Filters=[{'Name': 'instance-type', 'Values': ["t2.micro", "t3.micro"]}])
    instances_full_details = response['Reservations']
    for instance_detail in instances_full_details:
        group_instances = instance_detail['Instances']

        for instance in group_instances:
            instance_id = instance['InstanceId']
            instance_ids.append(instance_id)
    return instance_ids

instance_ids = list_instances()
print(instance_ids)

你可以自己构建它。简言之,它是:

sts = boto3.client('sts')

region = boto3.Session().region_name

instance_id='id-3324234'

account_id = sts.get_caller_identity()['Account']

instance_arn=f"arn:aws:ec2:{region}:{account_id}:instance/{instance_id}"

print(instance_arn)

但要学究式地获得AWS分区,这将是:

def get_partition_for_region(session):
    # based on https://github.com/boto/botocore/pull/1715
    region_name = session.region_name
    partitions = session.get_available_partitions()
    for partition in partitions:
        regions = session.get_available_regions('stepfunctions', partition)
        if region_name in regions:
            return partition
    # use the default aws partition in case nothing is found
    return 'aws'
  
partition = get_partition_for_region(boto3.Session())

sts = boto3.client('sts')

region = boto3.Session().region_name

instance_id='id-3324234'

account_id = sts.get_caller_identity()['Account']

instance_arn=f"arn:{partition}:ec2:{region}:{account_id}:instance/{instance_id}"

print(instance_arn)

相关问题 更多 >