【问题标题】:How to filter tag values of an Ec2 Instance by a date in Boto3如何在 Boto3 中按日期过滤 Ec2 实例的标签值
【发布时间】:2021-04-27 06:41:06
【问题描述】:

我正在尝试获取具有标记名称“ttl”和标记值“比今天更早”的实例。 我们的用户根据未来日期 (yyyy.mm.dd) 标记他们的实例,因此脚本不应在该日期之前自动删除它们。下面的过滤器应该只能获取标签值小于今天日期的实例。有没有办法根据这个逻辑过滤标签值 -> 让我得到

today = = datetime.today().strftime('%Y.%m.%d')

filters = [{'Name': 'tag:ttl','Values': ['<today']},{'Name': 'instance-state-name','Values': ['running']}]

完整的代码如下所示:

import boto3
import logging

#setup 简单的 INFO 日志记录

logger = logging.getLogger()
logger.setLevel(logging.INFO)

#定义连接

ec2 = boto3.resource('ec2')
def lambda_handler(event, context):

filters = [{'Name': 'tag:ttl','Values': ['<today']},{'Name': 'instance-state-name','Values': ['running']}]

#locate all running instances
RunningInstances = [instance.id for instance in instances]

print (RunningInstances)

#make sure there are actually instances to shut down.

if len(RunningInstances) > 0:

shuttingDown = ec2.instances.filter(InstanceIds=RunningInstances).stop()
print "shuttingDown"


else:
    print "Nothing to see here"

【问题讨论】:

    标签: amazon-web-services amazon-ec2 aws-lambda boto3 python-3.7


    【解决方案1】:

    您无法按照您指定的方式比较查询中的日期。您需要编写一些代码来比较 Python 脚本中的日期并采取行动。大致如下:

    import datetime
    import boto3
    
    
    # Connect to EC2
    ec2 = boto3.resource('ec2')
    
    def get_ttl(instance):
        for tag in instance.tags:
            if 'ttl'in tag['Key']:
                ttl = tag['Value']
                return ttl
    
    def lambda_handler(event,context):
        running_instances = ec2.instances.filter(Filters=[{
            'Name': 'instance-state-name',
            'Values': ['running']}])
    
        for instance in running_instances:
                ttl = get_ttl(instance)
                if ttl:
                    if datetime.date.today() > datetime.datetime.strptime(ttl, "%Y-%m-%d").date():
                        print('stopping instance')
                    else:
                        print("nothing to do here")
    

    基本上,它解决了比较日期问题

    In [30]: datestring = '2021-02-22'
    
    In [31]: datetime.date.today() == datetime.datetime.strptime(datestring, "%Y-%m-%d").date()
    Out[31]: False
    
    In [32]: datetime.date.today() <  datetime.datetime.strptime(datestring, "%Y-%m-%d").date()
    Out[32]: True
    
    In [33]: datetime.date.today() >  datetime.datetime.strptime(datestring, "%Y-%m-%d").date()
    Out[33]: False
    

    【讨论】:

    • 谢谢。您的解决方案似乎非常好。但是,我在实施解决方案时遇到以下 2 个错误:1) NameError: name 'get_ttl' is not defined 2) NameError: name 'running_instances' is not defined 我想我可以通过这样定义'running_instances'来解决第二个错误:(不确定它是否正确)。 running_instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name','Values': ['running']}]) 有什么建议,我该如何解决错误?
    • @QBits 你能通过gist 分享你的代码吗,我分享的上面的代码只是为了让你朝着正确的方向前进,正如我提到的那样,它可能无法正常工作
    • 我没有太大变化。这是要点。请看一下。 gist.github.com/thenervousgeek/5080bcc2cbae0c99fc76fe9dbd1d14fc
    • @QBits 通过示例执行评论了您的要点。
    • 奇怪的是,它在我这边抛出了错误。该错误在上面的要点中进行了注释。这就是我所做的:1)我创建了一个 lamda 函数(处理权限(策略、角色)),而不是通过 sshing 到 ec2(安装了 python 等)来运行代码。 2)粘贴在代码中。 3) 部署功能。 4)通过选择“aws 批量提交作业”作为“事件模板”创建了一个测试(我不确定这是否正确)。 5) 运行测试
    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2018-06-12
    • 2020-09-30
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多