-
-
Save dastergon/b4994c605f76d528d0c4 to your computer and use it in GitHub Desktop.
| 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("------") |
Hola buen dia tengo una duda, como podria obtener el nombre de la instancia ?
Thanks a lot!!
@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]
}]
)
@nakkanar you're on the right track, you'll have to use the ec2 client:
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_instance_status
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"))
As @ikekim said this will not work properly if
instance.tagshas more than one tag with a value which has 'Name` as a substring, e.g.I used
...because if you examine the
instance.tagslist of dicts there is only one'Key'with a value of'Name'