【发布时间】: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