BOTO3:在特定区域中打印实例信息

问题描述

我正在尝试编写Python / BOTO3脚本来获取us-east-1,us-west-1,ap-southeast-1地区的所有实例。

我要收集的信息是:

  • 实例ID
  • 实例类型
  • 附加到实例的IAM角色
  • 列表项所有警报的状态

我的目标是将其输出到CSV文件

目前我已经走了这么远,我有点受阻,将不胜感激一些帮助:

import boto3
from collections import defaultdict

regions = [
    'ap-southeast-1','us-west-1','us-east-1',]

ec2 = boto3.resource('ec2',region_name="us-east-2")

running_instances = ec2.instances.filter(Filters=[{
    'Name': 'instance-state-name','Values': ['running']}])

ec2info = defaultdict()
for instance in running_instances:
    ec2info[instance.id] = {
        'Instance ID': instance.id,'State': instance.state['Name'],'Instance Type': instance.instance_type,}

attributes = ['Instance ID','State',"Instance Type"]
for instance_id,instance in ec2info.items():
    for key in attributes:
        print("{0}: {1}".format(key,instance[key]))
    print("------")```


Thanks in advance :-)
    

解决方法

获取所有警报是一个棘手的部分,因为除非您事先了解一些警报,否则将很难找到所有警报。尽管如此,我还是以CPUUtilization为例来演示代码:

import boto3

regions = [
    'ap-southeast-1','us-west-1','us-east-1',]

for region in regions:
    
    ec2 = boto3.resource('ec2',region_name=region)
      
    running_instances = ec2.instances.filter(Filters=[{
        'Name': 'instance-state-name','Values': ['running']}])
    
    cw = boto3.client('cloudwatch',region_name=region)    
    
    for instance in running_instances:
                
        instance_profile = 'N/A';
        
        if instance.iam_instance_profile:
            instance_profile = instance.iam_instance_profile['Arn']
        
        print(region,instance.id,instance.instance_type,instance_profile)
            
        alarms = cw.describe_alarms_for_metric(
                    Namespace='AWS/EC2',MetricName='CPUUtilization',Dimensions=[
                            {
                                'Name': 'InstanceId','Value': instance.id
                            }]
                    )                        
        
        if 'MetricAlarms' in alarms:
            for alarm in alarms['MetricAlarms']:
                print(f" - {alarm['AlarmName']},{alarm['StateValue']}")

示例输出:

us-west-1 i-0d45a86caf2ee0e71 t2.micro arn:aws:iam::353693526480:instance-profile/InstanceRole
 - awsec2-i-0d45a86caf2ee0e71-CPU-Utilization,OK
us-east-1 i-0f7cd6d6123e6c47e t2.micro N/A