在代码中考虑Lambda热启动?

时间:2017-02-08 13:33:38

标签: python amazon-web-services aws-lambda

背景:我每隔15分钟调用一次特定的Lambda函数来启动我的EC2实例。这通过查询标记的值来工作,如果该值与当前时间匹配,则将实例添加到要启动的实例列表中。

问题:但是,此功能仅适用于每四个小时一次,因为它保持温暖"由于经常被调用。虽然函数是热的,但我在当前时间所拥有的变量 - 调用的时间 - 在温暖的环境中持久存在,并且永远不会更新到当前的,实际的,真正实际的实时时间。请参阅下面的代码。

# This lambda script start EC2 instances

import boto3
import logging
from datetime import datetime, time

ec = boto3.resource('ec2')

startup = datetime.now().strftime('%H%M')
now = int(startup)
minutes = [now-5,now-4,now-3,now-2,now-1,now]
logger = logging.getLogger()
logger.setLevel(logging.ERROR)

print 'The current time is: %s' % (startup)

def lambda_handler(event, context):
    for min in minutes:
        wave = ec.instances.filter(
            Filters=[
                {'Name': 'instance-state-name', 'Values': ['stopped']},
                {'Name': 'tag:Autostop', 'Values': ['%d' % (min)]}
            ]
        )
        for i in wave:
            iid = (i.instance_id)
            for t in i.tags:
                if t['Key'] == 'Autostop':
                    start_value = t['Value']
                    print 'Instance %s should be started at %s UTC' % (iid, start_value)
                    try:
                        print 'Starting %s' % (iid)
                        i.start()
                    except:
                        print 'ERROR -- Error starting instance %s' % (iid)
                        pass

在我的CloudWatch日志中,我看到每四个小时出现一个新的日志流,初始日志条目包含第15行的输出(当前时间是:X)但是日志流中的每个后续条目都是只是START和END请求,没有提到当前时间。这持续了大约四个小时,然后功能似乎被回收并开始冷却#34;一遍又一遍。

我对编程比较陌生,想知道是否有办法确保我的基于时间的变量(启动现在每次调用函数时都会更新,无论是热调用还是冷调用。

1 个答案:

答案 0 :(得分:5)

你需要在lambda_handler函数中移动变量

def lambda_handler(event, context):
    startup = datetime.now().strftime('%H%M')
    now = int(startup)
    minutes = [now-5,now-4,now-3,now-2,now-1,now]
    for min in minutes:
        [...]