#! /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 import boto3.session import 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 # 3 = Additional error info (includes failed lookups) # 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) SEARCHSTRING=sys.argv[1] PROFILE=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() for region in regions: if DEBUG == 1: print(".", end="") sys.stdout.flush() if DEBUG >= 2: print("Searching region " + region + " in profile " + PROFILE) ec2 = boto3.client('ec2', region_name=region) try: sg = ec2.describe_security_groups(GroupIds=[ SEARCHSTRING ]) FOUND=FOUND+1 if DEBUG >= 2: print("FOUND in profile '" + PROFILE + "', Region: '" + region + "': ID=" + str(sg['SecurityGroups'][0]['GroupId'])) if FOUND > 1: FOUNDSTR = FOUNDSTR + "\n" FOUNDSTR = FOUNDSTR + "FOUND in profile '" + PROFILE + "', Region: '" + region continue except botocore.exceptions.ClientError as e: if DEBUG >= 2: print("Not found by ID in profile '" + PROFILE + "', Region: '" + region + "'") except: if DEBUG >= 3: # Print the error print(str( sys.exc_info() )) try: sg = ec2.describe_security_groups(Filters=[ {'Name': 'group-name', 'Values': [ SEARCHSTRING ] } ]) except: if DEBUG >= 3: # Print the error print(str( sys.exc_info() )) try: if(sg['SecurityGroups'][0]['GroupId']): FOUND=FOUND+1 if DEBUG >= 2: print("FOUND in profile '" + PROFILE + "', Region: '" + region + "': ID=" + str(sg['SecurityGroups'][0]['GroupId'])) if FOUND > 1: FOUNDSTR = FOUNDSTR + "\n" FOUNDSTR = FOUNDSTR + "FOUND in profile '" + PROFILE + "', Region: '" + region continue except IndexError: if DEBUG >= 2: print("Not found by Name search in profile '" + PROFILE + "', Region: '" + region + "'") # 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("Not found.") exit(255)