如何使用事件触发的 lambda 从 S3 存储桶中获取最新的文件名或文件

新手上路,请多包涵

我是 AWS 服务的新手,只有一周的无服务器架构经验,我的要求是在将新文件上传到特定存储桶时触发事件,一旦设置了事件触发器,我的 Lambda 应该获得详细信息最新文件,例如名称、大小和创建日期。

来源每次都将此文件上传到一个新文件夹中,并用当前日期命名该文件夹。

到目前为止,我已经能够破解如何创建我的 Lambda 函数并监听事件触发器。

这是我的代码。

 import boto3
import botocore
import datetime
import logging

def lambda_handler(event, context):
    logging.info('Start function')
    s3 = boto3.resource('s3')
    DATE = datetime.datetime.today().strftime('%Y-%m-%d')
    BUCKET_NAME = 'monkey-banana-dev'
    KEY = '/banana/incoming/daily/{}'.format(DATE)
    logging.info('Getting file from {}'.format(KEY))
    try:
        s3.Bucket(BUCKET_NAME).download_file(KEY, 'name_of_my_file')
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "404":
            print("The object does not exist.")
        else:
            raise

在这里,因为我知道这将是今天的日期,因此我使用 datetime 来获取确切的 KEY,但文件名将始终不同。虽然我知道这将是一个带有 .txt 后缀的文本文件,但我无法解决如何从触发器中获取最新上传文件的名称和其他详细信息。

原文由 Shek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 885
1 个回答

你有一个 事件对象,它包含一个键“记录”,它是一个列表。

您可以过滤 eventName ‘ObjectCreated:Put’ 的记录,然后按“eventTime”键对列表进行排序以获取最新的事件数据。

 def lambda_handler(event, context):
    records = [x for x in event.get('Records', []) if x.get('eventName') == 'ObjectCreated:Put']
    sorted_events = sorted(records, key=lambda e: e.get('eventTime'))
    latest_event = sorted_events[-1] if sorted_events else {}
    info = latest_event.get('s3', {})
    file_key = info.get('object', {}).get('key')
    bucket_name = info.get('bucket', {}).get('name')

原文由 T4rk1n 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题