AWS Lambda getUTCMinute避免冷启动



我有一个lambda函数,它每分钟运行一次,以获取由"#{folder_name}/#{year}/#{month}/#{day}/#{hour}/#{minute}/#{System.os_time()}-#{file_name}.#{file_ext}"分区的S3中的所有文件。我们都知道Lambda有冷启动,这导致我的minute不断关闭。有没有一种方法可以在lambda函数中得到正确的分钟?例如:当前分钟为22,而λ冷启动时间为23

import boto3
import json
from datetime import date, datetime,timedelta
import _datetime
import uuid
def lambda_handler(event,context):
s3_client = boto3.client("s3")
s3_resource = boto3.resource('s3')
paginator = s3_client.get_paginator('list_objects_v2')
keys = []
#result = []
utc_today = datetime.utcnow()
utc_today_delta = utc_today + timedelta(hours=-1)
folder_path = {
"now" : int(str(round(time.time() * 1000))),
"utc_year" : datetime.utcnow().strftime('%Y'),
"utc_month" : datetime.utcnow().strftime('%-m'),
"utc_day" : datetime.utcnow().strftime('%-d'),
"utc_hour" : datetime.utcnow().strftime('%-H'),
"utc_minute" : datetime.utcnow().strftime('%-M'),
"year_delta" : utc_today_delta.strftime('%Y'),
"month_delta" : utc_today_delta.strftime('%-m'),
"day_delta" : utc_today_delta.strftime('%-d'),
"hour_delta" : utc_today_delta.strftime('%-H'),
"minute_delta" : utc_today_delta.strftime('%-M'),
"file_ext" : f"{str(uuid.uuid4().hex)}.json"
}
prefix = f"Uploads/{folder_path['year_delta']}/{folder_path['month_delta']}/{folder_path['day_delta']}/{folder_path['hour_delta']}/{folder_path['minute_delta']}"
pages = paginator.paginate(Bucket='my_bucket', Prefix=prefix)
for page in pages:
if page.get('KeyCount') != 0:
for obj in page['Contents']:
get_object = s3_resource.Object('my_bucket',key = obj['Key']) 
file_content = get_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(file_content)
keys.append(json_content)
return create_object_path(keys,folder_path,s3_resource)
def create_object_path(get_keys,get_folder_path,get_s3_resource):
folder_name = f"FE-Uploads/{get_folder_path['utc_year']}/{get_folder_path['utc_month']}/{get_folder_path['utc_day']}/{get_folder_path['utc_hour']}/{get_folder_path['now']}-{get_folder_path['file_ext']}"
s3object = get_s3_resource.Object('my_bucket_2', folder_name)
s3object.put(
Body=(bytes(json.dumps(get_keys, indent=2, sort_keys=False).encode('UTF-8')))
)
return None

如果它确实与冷启动周期有关(如果您为lambda启用x射线活动跟踪,则可以检查这一点),那么提高性能的最简单方法是

  1. 使用更大的lambda(至少1GB内存)。这大大减少冷启动时间。
  2. 尝试设置lambda处理程序的s3_client和s3_resource OUTSIDE(这减少了执行时间)。所以把它们放在进口商品后面。

如果这还不够,请使用预置的并发。为此,为最新的lambda代码创建一个lambda版本。为该lambda版本启用预置的并发性。由于不需要并发运行,因此可以将提供的并发设置为最多1或2个。关于配置并发的更多信息请点击此处。

但是我仍然不确定冷启动是你的问题。看看这个研究lambda crons很有规律地不会在会议开始时执行。相反,它通常在一分钟开始后40秒或更长时间才开始。您可以通过检查调用的cloudwatch日志时间戳来检查是否存在这种情况。同样,您可以通过启用x射线来检查冷启动时间(不需要更改代码)。但40分钟仍然不足以让你完全跳过一分钟,所以我不确定这是怎么回事。

由于您在耗时的for循环之前创建了路径,因此我认为for循环不是问题所在。

我建议查看x射线和执行日志时间戳,以进一步检查问题所在。

最新更新