xmx
xmx

Reputation: 137

BOTO3: Print Instance info in specific regions

I am trying to write a Python/BOTO3 script to get all instances in regions us-east-1, us-west-1, ap-southeast-1.

The Information im trying to gather is:

My goal is to output this to a CSV file.

Currently i have gone this far, i am a bit stuck, some help will be much appreciated:

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 :-)
    

Upvotes: 2

Views: 1180

Answers (1)

Marcin
Marcin

Reputation: 238837

Getting all the alarms is a tricky part, because unless you know up front something about them, it will be difficult to find all. Nevertheless I develop demo code for CPUUtilization as an example:

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']}")

Example output:

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

Upvotes: 2

Related Questions