I was recently asked to update a single tag in all of our 800 hosts only if there was already another tag present. So I need to look at all hosts, if I find a tag called ‘Type’ that contains the text ‘copy-from’ or ‘copy-from’ is in the value at all, then I need to add another new tag called ‘no-copy’ and set its value to ‘true’. Well, there was no way I was going to manually do this using the AWS GUI. So here is an example of a boto3 script that does the work.
# Import boto and create an ec2 client session import boto3 ec2 = boto3.client('ec2', region_name='us-east-1', aws_access_key_id='xxxxxxxxxxxxxx', aws_secret_access_key='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ) # I'm not using a paginator here since I know I have under 1000 hosts. # This code will not work if you have more than 1k hosts. # You need to use a paginator for more than 1k hosts or you will not list all hosts. response = ec2.describe_instances() # iterate over each host. for each_res in response['Reservations']: for each_inst in each_res['Instances']: # I set this matchhost as a flag as I iterate through each host. matchhost = False # On each host, I iterate through all the tags on the host. for each_tag in each_inst['Tags']: # On each tag, if the key and values match my target values, then I set matchhost to True. if each_tag['Key'] == 'Type' and 'copy-from' in each_tag['Value']: matchhost = True # Now that I've run through all tags on this 1 host, if I matched the values, then I create a new tag. if matchhost: response = ec2.create_tags( Resources=[each_inst['InstanceId']], Tags = [ { 'Key': 'no-copy', 'Value': 'true' } ] )
That’s all there is to it. I let the script run and in a few minutes, the task was complete.