繁体   English   中英

如何通过 CLI 获取基于 Nitro 系统的 EC2 实例类型列表?

[英]How to get the list of Nitro system based EC2 instance type by CLI?

我知道此页面列出了基于 Nitro 系统的实例类型,但我想使用 CLI 以动态方式了解该列表。 (例如,使用aws ec2 describe-instances )。 除了解析 static 页面之外,是否有可能获得基于 Nitro 的实例类型? 如果是这样,你能告诉我怎么做吗?

您必须编写一些额外的代码来获取该信息。 aws ec2 describe-instances将为您提供InstanceType属性。 您应该使用编程语言来解析 JSON,提取InstanceType ,然后像这样调用describe-instanceshttps://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html?高亮=硝基

从您返回的 JSON 中提取hypervisor 如果实例是 Nitro,那会给你 Nitro。

这是一个可能有效的 Python 代码。 我还没有完全测试它,但你可以调整它以获得你想要的结果。

"""List all EC2 instances"""
import boto3

def ec2_connection():
    """Connect to AWS using API"""

    region = 'us-east-2'

    aws_key = 'xxx'
    aws_secret = 'xxx'

    session = boto3.Session(
        aws_access_key_id = aws_key,
        aws_secret_access_key = aws_secret
    )

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

    return ec2


def get_reservations(ec2):
    """Get a list of instances as a dictionary"""

    response = ec2.describe_instances()

    return response['Reservations']


def process_instances(reservations, ec2):
    """Print a colorful list of IPs and instances"""

    if len(reservations) == 0:
        print('No instance found. Quitting')
        return

    for reservation in reservations:
        for instance in reservation['Instances']:

            # get friendly name of the server
            # only try this for mysql1.local server
            friendly_name = get_friendly_name(instance)
            if friendly_name.lower() != 'mysql1.local':
                continue

            # get the hypervisor based on the instance type
            instance_type = get_instance_info(instance['InstanceType'], ec2)

            # print findings
            print(f'{friendly_name} // {instance["InstanceType"]} is {instance_type}')
            break


def get_instance_info(instance_type, ec2):
    """Get hypervisor from the instance type"""

    response = ec2.describe_instance_types(
        InstanceTypes=[instance_type]
    )

    return response['InstanceTypes'][0]['Hypervisor']


def get_friendly_name(instance):
    """Get friendly name of the instance"""

    tags = instance['Tags']
    for tag in tags:
        if tag['Key'] == 'Name':
            return tag['Value']

    return 'Unknown'


def run():
    """Main method to call"""

    ec2 = ec2_connection()
    reservations = get_reservations(ec2)
    process_instances(reservations, ec2)


if __name__ == '__main__':

    run()
    print('Done')

在上面的答案中,“从您返回的 JSON 中提取虚拟机管理程序。如果实例是 Nitro,那将给您 Nitro”这句话不再准确。

根据最新的AWS 文档,管理程序 - 实例的管理程序类型 (ovm | xen)。 值 xen 用于 Xen 和 Nitro 管理程序。

清理并验证了以下工作代码:

# Get all instance types that run on Nitro hypervisor
import boto3
def get_nitro_instance_types():
    """Get all instance types that run on Nitro hypervisor"""
    ec2 = boto3.client('ec2', region_name = 'us-east-1')
    response = ec2.describe_instance_types(
        Filters=[
            {
                'Name': 'hypervisor',
                'Values': [
                    'nitro',
                ]
            },
        ],
    )
    instance_types = []
    for instance_type in response['InstanceTypes']:
        instance_types.append(instance_type['InstanceType'])
    return instance_types

get_nitro_instance_types()

截至 2022 年 6 月 12 日的 output 示例如下:

['r5dn.8xlarge', 'x2iedn.xlarge', 'r6id.2xlarge', 'r6gd.medium', 'm5zn.2xlarge', 'r6idn.16xlarge', 'c6a.48xlarge', 'm5a.16xlarge', ' im4gn.2xlarge'、'c6gn.16xlarge'、'c6in.24xlarge'、'r5ad.24xlarge'、'r6i.xlarge'、'c6i.32xlarge'、'x2iedn.2xlarge'、'r6id.xlarge'、'i3en。 24xlarge', 'i3en.12xlarge', 'm5d.8xlarge', 'c6i.8xlarge', 'r6g.large', 'm6gd.4xlarge', 'r6a.2xlarge', 'x2iezn.4xlarge', 'c6i.large' , 'r6in.24xlarge', 'm6gd.xlarge', 'm5dn.2xlarge', 'd3en.2xlarge', 'c6id.8xlarge', 'm6a.large', 'is4gen.xlarge', 'r6g.8xlarge', ' m6idn.large'、'm6a.2xlarge'、'c6i.4xlarge'、'i4i.16xlarge'、'm5zn.6xlarge'、'm5.8xlarge'、'm6id.xlarge'、'm5n.16xlarge'、'c6g。 16xlarge', 'r5n.12xlarge', 't4g.nano', 'm5ad.12xlarge', 'r6in.12xlarge', 'm6idn.12xlarge', 'g5.2xlarge', 'trn1.32xlarge', 'x2gd.8xlarge' , 'is4gen.4xlarge', 'r6gd.xlarge', 'r5a.xlarge', 'r5a.2xlarge', 'c5ad.24xlarge', 'r6a.xlarge', 'r6g.medium', 'm6id.12xlarge', ' r6idn.2xlarge', 'c5n.2xlarge', 'g5.4xlarge', 'm5d.xlarge', 'i3en.3xlarge', 'r5.24xla rge', 'r6gd.2xlarge', 'c5d.large', 'm6gd.12xlarge', 'm6id.2xlarge', 'm6i.large', 'z1d.2xlarge', 'm5a.4xlarge', 'm5a.2xlarge' , 'c6in.xlarge', 'r6id.16xlarge', 'c7g.8xlarge', 'm5dn.12xlarge', 'm6gd.medium', 'im4gn.8xlarge', 'm5dn.large', 'c5ad.4xlarge', ' r6g.16xlarge', 'c6a.24xlarge', 'c6a.16xlarge']

"""列出所有 EC2 实例""" import boto3

def ec2_connection(): """使用 API 连接到 AWS"""

region = 'us-east-2'

aws_key = 'xxx'
aws_secret = 'xxx'

session = boto3.Session(
    aws_access_key_id = aws_key,
    aws_secret_access_key = aws_secret
)

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

return ec2

def get_reservations(ec2): """获取实例列表作为字典"""

response = ec2.describe_instances()

return response['Reservations']

def process_instances(reservations, ec2): """打印 IP 和实例的彩色列表"""

if len(reservations) == 0:
    print('No instance found. Quitting')
    return

for reservation in reservations:
    for instance in reservation['Instances']:

        # get friendly name of the server
        # only try this for mysql1.local server
        friendly_name = get_friendly_name(instance)
        if friendly_name.lower() != 'mysql1.local':
            continue

        # get the hypervisor based on the instance type
        instance_type = get_instance_info(instance['InstanceType'], ec2)

        # print findings
        print(f'{friendly_name} // {instance["InstanceType"]} is {instance_type}')
        break

def get_instance_info(instance_type, ec2): """从实例类型获取管理程序"""

response = ec2.describe_instance_types(
    InstanceTypes=[instance_type]
)

return response['InstanceTypes'][0]['Hypervisor']

def get_friendly_name(instance): """获取实例的友好名称"""

tags = instance['Tags']
for tag in tags:
    if tag['Key'] == 'Name':
        return tag['Value']

return 'Unknown'

def run(): """要调用的主要方法"""

ec2 = ec2_connection()
reservations = get_reservations(ec2)
process_instances(reservations, ec2)

如果名称== '主要':

run()
print('Done')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM