【问题标题】:AWS Lambda getUTCMinute avoiding cold startAWS Lambda getUTCMinute 避免冷启动
【发布时间】:2021-11-06 16:52:50
【问题描述】:

我有一个 lambda 函数,它每分钟运行一次,以从由 "#{folder_name}/#{year}/#{month}/#{day}/#{hour}/#{minute}/#{System.os_time()}-#{file_name}.#{file_ext}" 分区的 S3 获取我的所有文件。众所周知,Lambda 冷启动导致我的minute 不断关闭。有没有办法在我的 lambda 函数中获得正确的分钟?例如,如果当前分钟为 22,但 Lambda 冷启动于 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

【问题讨论】:

  • 是什么让您认为冷启动是问题所在?通常冷启动只会引起几百毫秒的延迟,所以我怀疑它是由冷启动引起的。分页也可能需要一分钟。
  • @LRutten 当我查看云监视日志时,我看到时间戳跳过。例如 1,2,4,4。

标签: python python-3.x amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

如果它真的与冷启动期有关(如果您为 lambda 启用 X 射线主动追踪,则可以检查这一点),提高性能的最简单方法是

  1. 使用更大的 lambda(至少 1GB 内存)。这大大缩短了冷启动时间。
  2. 尝试在 lambda 处理程序的外部设置 s3_client 和 s3_resource(这会减少执行时间)。所以把它们放在导入之后。

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

但是我仍然不确定冷启动是您的问题。非常定期地查看this research lambda crons 在分钟开始时不会执行。相反,通常是在一分钟开始后 40 秒或更长时间开始。您可以通过检查调用的 cloudwatch 日志时间戳来检查是否是这种情况。同样,您可以通过启用 X 射线检查冷启动时间(无需更改代码)。但是 40 仍然不足以完全跳过一分钟,所以不确定这是怎么回事。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 2022-10-04
    • 2019-11-21
    • 2020-07-02
    • 1970-01-01
    • 2020-05-18
    • 2019-04-16
    • 2020-10-24
    相关资源
    最近更新 更多