Shutdown EC2 instances that do not have a certain tag using Python

匿名 (未验证) 提交于 2019-12-03 02:34:02

问题:

I'm using this script by mlapida posted here: https://gist.github.com/mlapida/1917b5db84b76b1d1d55#file-ec2-stopped-tagged-lambda-py

The script by mlapida does the opposite of what I need, I'm not that familiar with Python to know how to restructure it to make this work. I need to shutdown all EC2 instances that do not have a special tag identifying them.

The logic would be: 1.) Identify all running instances 2.) Strip out any instances from that list that have the special tag 3.) Process the remaining list of instances to be shutdown

Any help is greatly appreciated.

回答1:

That's should do the trick:

# open connection to ec2 conn = get_ec2_conn() # get a list of all instances all_instances = conn.get_all_instances() # get instances with filter of running + with tag `Name` instances = conn.get_all_instances(filters={'tag-key': 'Name', 'instance-state-name': 'running'}) # make a list of filtered instances IDs `[i.id for i in instances]` # Filter from all instances the instance that are not in the filtered list instances_to_delete = [to_del for to_del in all_instances if to_del.id not in [i.id for i in instances]] # run over your `instances_to_delete` list and terminate each one of them for instance in instances_to_delete:     conn.stop_instances(instance.id) 

And in boto3:

# open connection to ec2 conn = get_ec2_conn() # get a list of all instances all_instances = [i for i in conn.instances.all()] # get instances with filter of running + with tag `Name` instances = [i for i in conn.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}, {'Name':'tag-key', 'Values':['Name']}])] # make a list of filtered instances IDs `[i.id for i in instances]` # Filter from all instances the instance that are not in the filtered list instances_to_delete = [to_del for to_del in all_instances if to_del.id not in [i.id for i in instances]] # run over your `instances_to_delete` list and terminate each one of them for instance in instances_to_delete:     instance.stop() 


回答2:

With credits to mlapida and Yonatan, I have a working script that shuts down all instances that don't have a tag "AutoOff" and any instance that does have "AutoOff" set to "False" stays on, hope this helps someone out there.

import boto3 import logging  #setup simple logging for INFO logger = logging.getLogger() logger.setLevel(logging.INFO)  #define the connection ec2 = boto3.resource('ec2') # open connection to ec2 #conn = get_ec2_conn()  # get a list of all instances all_instances = [i for i in ec2.instances.all()]  def lambda_handler(event, context):      #instances = ec2.instances.filter(Filters=filters)     # get instances with filter of running + with tag `Name`     instances = [i for i in ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}, {'Name':'tag:AutoOff', 'Values':['False']}])]      # make a list of filtered instances IDs `[i.id for i in instances]`     # Filter from all instances the instance that are not in the filtered list     instances_to_delete = [to_del for to_del in all_instances if to_del.id not in [i.id for i in instances]]      # run over your `instances_to_delete` list and terminate each one of them     for instance in instances_to_delete:         instance.stop() 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!