#! /usr/bin/python # # Find an instance within a profile, across all regions # # Unbuffered, no CRLF print: from __future__ import print_function import sys, os import boto3, boto3.session, botocore import threading # We may not do it yet, but developing with threadsafe in mind, as best I can try: # Python 3 import builtins except ImportError: # Python 2 import __builtin__ as builtins # Debug levels: # 1 = Show progress # 2 = Informational # 5 = Include boto3 logging DEBUG=0 # Fancy print function to make it 3.4 compatible: if len(sys.argv) != 3: print("Usage: " + os.path.basename(sys.argv[0]) + " ") exit(1) if DEBUG >= 5: boto3.set_stream_logger('botocore', level=DEBUG) PROFILE=sys.argv[1] SEARCHSTRING=sys.argv[2] # Set the profile to use try: boto3.setup_default_session(profile_name=PROFILE) except: print("Could not find profile: " + PROFILE) exit(2) # Connect to ec2 ec2 = boto3.client('ec2') # Grab list of regions regions = set() for region in ec2.describe_regions()['Regions']: regions.add(region['RegionName']) # For each array, let's search: FOUND=0 FOUNDSTR="" if DEBUG == 1: print("Searching.", end="") sys.stdout.flush() # Search by ID for region in regions: if DEBUG == 1: print(".", end="") sys.stdout.flush() if DEBUG >= 2: print("Searching by ID in region " + region + " in profile " + PROFILE) ec2 = boto3.client('ec2', region_name=region) try: instance = ec2.describe_instances(InstanceIds=[ SEARCHSTRING ]) except botocore.exceptions.ClientError: # Not Found continue except: print(str( sys.exc_info() )) continue FOUND=FOUND+1 if DEBUG >= 2: print("FOUND in profile '" + PROFILE + "', Region: '" + region + "'") if FOUND > 1: FOUNDSTR = FOUNDSTR + "\n" # Add to output for r in instance['Reservations']: for i in r['Instances']: FOUNDSTR = FOUNDSTR + "FOUND\t" + PROFILE + "\t" + region + "\t" + i['InstanceId'] continue # Search next region by ID # Search by Name for region in regions: if DEBUG == 1: print(".", end="") sys.stdout.flush() if DEBUG >= 2: print("Searching by Name in region " + region + " in profile " + PROFILE) ec2 = boto3.client('ec2', region_name=region) try: instance = ec2.describe_instances(Filters=[ {'Name': 'tag:Name', 'Values': [ SEARCHSTRING ] } ]) except: print(str( sys.exc_info() )) # Add to output for r in instance['Reservations']: for i in r['Instances']: FOUND=FOUND+1 if DEBUG >= 2: print("FOUND in profile '" + PROFILE + "', Region: '" + region + "'") if FOUND > 1: FOUNDSTR = FOUNDSTR + "\n" FOUNDSTR = FOUNDSTR + "FOUND\t" + PROFILE + "\t" + region + "\t" + i['InstanceId'] continue # Search next region by name # End of for region if DEBUG == 1: print(".") sys.stdout.flush() if DEBUG >= 2: print("Found " + str(FOUND) + " instances.") if FOUND > 0: print(FOUNDSTR) exit(0) else: if DEBUG == 1: print("notfound") exit(255)