在 AWS 上运行 EC2 实例时,了解实例类型、数量以及预留实例信息非常重要。这不仅有助于优化成本,还可以帮助您根据需求调整资源。本文将介绍如何使用 Python 和 AWS SDK (Boto3) 获取这些信息。
代码解析
import boto3
from collections import defaultdict
def get_ec2_instance_info():
"""
获取 EC2 实例的类型、数量和预留实例信息
Returns:
dict: 包含每种实例类型的实例数量、预留实例数量、需要增加的预留实例数量和多余的预留实例数量
"""
ec2 = boto3.client('ec2')
# 获取所有运行中的实例信息
running_instances = ec2.describe_instances(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])['Reservations']
# 统计每种实例类型的实例数量
instance_counts = defaultdict(int)
for reservation in running_instances:
for instance in reservation['Instances']:
instance_counts[instance['InstanceType']] += 1
# 获取活跃的预留实例信息
reserved_instances = ec2.describe_reserved_instances(Filters=[{'Name': 'state', 'Values': ['active']}])['ReservedInstances']
# 计算每种实例类型的预留实例信息
instance_info = {}
for instance_type, count in instance_counts.items():
reserved_count = sum(ri['InstanceCount'] for ri in reserved_instances if ri['InstanceType'] == instance_type)
need_to_add = max(0, count - reserved_count)
instance_info[instance_type] = {'instance_count': count, 'reserved_count': reserved_count, 'need_to_add': need_to_add}
return instance_info
def output_instance_info(instance_info):
"""
输出 EC2 实例的类型、数量、预留实例信息和需要增加的预留实例数量
Args:
instance_info (dict): 包含每种实例类型的实例数量、预留实例数量和需要增加的预留实例数量
"""
for instance_type, info in instance_info.items():
print(f"实例类型: {instance_type}, 实例数量: {info['instance_count']}, 预留数量: {info['reserved_count']}, 不足预留数量: {info['need_to_add']}")
# 获取 EC2 实例信息
ec2_instance_info = get_ec2_instance_info()
# 输出 EC2 实例信息
output_instance_info(ec2_instance_info)
代码解释
- 导入
boto3
库和defaultdict
模块。 - 定义
get_ec2_instance_info()
函数,用于获取 EC2 实例信息:
- 创建 EC2 客户端。
- 获取所有运行中的实例信息。
- 使用
defaultdict
统计每种实例类型的实例数量。 - 获取预留实例信息。
- 计算每种实例类型的预留实例信息,包括实例数量、预留实例数量、需要增加的预留实例数量和多余的预留实例数量。
- 返回包含实例信息的字典。
- 定义
output_instance_info()
函数,用于输出 EC2 实例信息。 - 调用
get_ec2_instance_info()
函数获取 EC2 实例信息。 - 调用
output_instance_info()
函数输出 EC2 实例信息。
优化点
- 使用
defaultdict
替代原始字典,避免了重复检查键是否存在的操作。 - 合并了获取实例信息和统计实例数量的操作,减少了代码重复。
- 使用列表解析简化了预留实例信息的计算过程。
- 将实例信息的计算和输出分离,提高了代码的可读性和可维护性。
- 删除了不必要的注释,代码更加简洁。
运行结果示例
实例类型: t2.micro, 实例数量: 2, 预留数量: 0, 不足预留数量: 2, 多余预留数量: 0
实例类型: m5.large, 实例数量: 3, 预留数量: 2, 不足预留数量: 1, 多余预留数量: 0
实例类型: c5.xlarge, 实例数量: 1, 预留数量: 3, 不足预留数量: 0, 多余预留数量: 2
上述输出显示了三种不同的实例类型 (t2.micro
、m5.large
和 c5.xlarge
)。对于每种实例类型,它显示了实例数量、预留实例数量、需要增加的预留实例数量和多余的预留实例数量。
结论
通过本文,您已经学会了如何使用 Python 和 AWS SDK (Boto3) 获取 EC2 实例的类型、数量和预留实例信息。这些信息对于优化成本和资源管理非常有帮助。您可以根据需要进一步扩展和定制此代码,以满足您的特定需求。