Skip to content

Instantly share code, notes, and snippets.

@dastergon
Last active October 11, 2024 16:44
Show Gist options
  • Save dastergon/b4994c605f76d528d0c4 to your computer and use it in GitHub Desktop.
Save dastergon/b4994c605f76d528d0c4 to your computer and use it in GitHub Desktop.
A basic boto3 based tool for retrieving information from running EC2 instances.
from collections import defaultdict
import boto3
"""
A tool for retrieving basic information from the running EC2 instances.
"""
# Connect to EC2
ec2 = boto3.resource('ec2')
# Get information for all running instances
running_instances = ec2.instances.filter(Filters=[{
'Name': 'instance-state-name',
'Values': ['running']}])
ec2info = defaultdict()
for instance in running_instances:
for tag in instance.tags:
if 'Name'in tag['Key']:
name = tag['Value']
# Add instance info to a dictionary
ec2info[instance.id] = {
'Name': name,
'Type': instance.instance_type,
'State': instance.state['Name'],
'Private IP': instance.private_ip_address,
'Public IP': instance.public_ip_address,
'Launch Time': instance.launch_time
}
attributes = ['Name', 'Type', 'State', 'Private IP', 'Public IP', 'Launch Time']
for instance_id, instance in ec2info.items():
for key in attributes:
print("{0}: {1}".format(key, instance[key]))
print("------")
@ScottMorgs
Copy link

@sandygvs / anyone else looking for an answer to the above (if I understand the question correctly) - if you're referring to filtering this code by VPC, subnets etc or limiting to a region you can add things like:

import boto3
from collections import defaultdict

region = 'ap-southeast-2'
az = 'ap-southeast-2a'
vpc = 'vpc-12345678'
subnet = 'subnet-12345678'
ec2 = boto3.resource('ec2', region)

running_instances = ec2.instances.filter(
    Filters=[{
        'Name': 'instance-state-name',
        'Values': ['running']
        },
        {
        'Name': 'availability-zone',
        'Values': [az]
        },
        {
        'Name': 'vpc-id',
        'Values': [vpc]
        },
        {
        'Name': 'subnet-id',
        'Values': [subnet]
        }]
    )

If you mean ASG as in outputting security groups, you can add 'SG': instance.security_groups at the end of ec2info, and include it as an attribute.

Copy link

ghost commented May 24, 2019

As @ikekim said this will not work properly if instance.tags has more than one tag with a value which has 'Name` as a substring, e.g.

>>> 'Name' in 'NameOfEmployee'
True
>>> 'name' in 'dog'
False
>>> 'Name' in 'Names'

I used

if tag['Key'] == 'Name'
...

...because if you examine the instance.tags list of dicts there is only one 'Key' with a value of 'Name'

@LilianaChan
Copy link

Hola buen dia tengo una duda, como podria obtener el nombre de la instancia ?

@priya170807
Copy link

Thanks a lot!!

@nakkanar
Copy link

@TacMechMonkey, is there anyway we can filter Instance Status for specific VPCID? resource does not have status option.

running_instances = ec2.instances.filter(
Filters=[{
'Name': 'instance-status.status',
'Values': ['impaired']
},
{
'Name': 'vpc-id',
'Values': [vpc]
}]
)

@ApexOps-Scott
Copy link

@OtmanGX
Copy link

OtmanGX commented May 17, 2021 via email

@faisalnizam
Copy link

faisalnizam commented Dec 7, 2021

you can use something like this and put in lambda. This will give you all the asg based on a name/tag you provide , list all the instance id's and then you can get things like IP/key etc on the id's

import boto3

client = boto3.client('autoscaling')
clientips=boto3.client('ec2')
paginator = client.get_paginator('describe_auto_scaling_groups')
page_iterator = paginator.paginate(
   PaginationConfig = {
      'PageSize': 100
   }
)

def lambda_handler(event, context):

   filtered_asgs = page_iterator.search(
      'AutoScalingGroups[] | [?contains(Tags[?Key==`{}`].Value, `{}`)]'.format('type', 'node')
   )

   for asg in filtered_asgs:
      print (asg['AutoScalingGroupName'])
      response = client.describe_auto_scaling_groups(
             AutoScalingGroupNames=[
        asg['AutoScalingGroupName'],
      ],
      )
      instances=response["AutoScalingGroups"][0]["Instances"]
      instanceids=[]
      for i in instances:
         instanceids.append(i["InstanceId"])
         instaneips=[]
         reservations = clientips.describe_instances(InstanceIds=[i['InstanceId']]).get("Reservations")
         for reservation in reservations:
            for instance in reservation['Instances']:
               print(instance.get("PublicIpAddress"))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment