繁体   English   中英

在 AWS S3 中新文件到达时触发 AWS Lambda

[英]Triggering AWS Lambda on arrival of new files in AWS S3

我有一个用 Python 编写的 Lambda 函数,它具有从位于 AWS S3 中的 3 个文件中为 3 个表运行 Redshift 复制命令的代码。

例子:

我有表 A、B 和 C。

The python code contains:

'copy to redshift A from "s3://bucket/abc/A.csv"'
'copy to redshift B from "s3://bucket/abc/B.csv"'
'copy to redshift C from "s3://bucket/abc/C.csv"'

每当三个文件中的一个新文件到达S3中的“s3://bucket/abc/”位置时,就会触发此代码。 因此,即使只有一个 csv 文件到达,它也会加载所有三个表。

最佳案例解决方案:将代码分解为三个不同的 Lambda 函数,并将它们直接映射到每个源文件更新/上传。

但是,我的要求是继续使用单个 Lambda 代码,该代码将选择性地仅针对那些已更新的 csv 文件运行其中的一部分(使用 if)。

例子:

if (new csv file for A has arrived):
    'copy to redshift A from "s3://bucket/abc/A.csv"'
if (new csv file for B has arrived):
    'copy to redshift B from "s3://bucket/abc/B.csv"'
if (new csv file for C has arrived):
    'copy to redshift C from "s3://bucket/abc/C.csv"'

目前,为了实现这一点,我将这些文件的元数据 (LastModified) 存储在 python dict 中,文件名是关键。 打印字典将是这样的:

{'bucket/abc/A.csv': '2019-04-17 11:14:11+00:00', 'bucket/abc/B.csv': '2019-04-18 12:55:47+00:00', 'bucket/abc/C.csv': '2019-04-17 11:09:55+00:00'}

然后,每当三个文件中的任何一个出现新文件时,Lambda 就会被触发,我正在读取字典并将每个文件的时间与字典中的相应值进行比较,如果新的 LastModified 增加,我是运行该表的复制命令。

所有这些,因为我找不到针对此类用例的 S3 事件/CloudWatch 解决方法。

如果问题不能很好地表达,请提出进一步的问题。

当 Amazon S3 事件触发 AWS Lambda 函数时,它会提供存储桶名称和对象键作为event一部分:

def lambda_handler(event, context):

  # Get the bucket and object key from the Event
  bucket = event['Records'][0]['s3']['bucket']['name']
  key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])

虽然对象详细信息作为列表传递,但我怀疑每个事件只提供一个对象(因此使用[0] )。 但是,我并不能 100% 确定情况会一直如此。 最好假设它,除非另有证明。

因此,如果您的代码需要特定对象,则您的代码将是:

if key == 'abc/A.csv':
    'copy to Table-A from "s3://bucket/abc/A.csv"'
if key == 'abc/B.csv':
    'copy to Table-B from "s3://bucket/abc/B.csv"'
if key == 'abc/C.csv':
    'copy to Table-C from "s3://bucket/abc/C.csv"'

无需存储LastModified ,因为每当上传新文件时都会触发该事件。 此外,请注意将数据存储在全局字典中并期望它在未来执行时可用——情况并非总是如此。 如果 Lambda 容器在一段时间内没有运行,则可以将其删除,如果存在并发执行,则可能会创建其他 Lambda 容器。

如果您始终知道您需要 3 个文件并且它们总是按特定顺序上传,那么您可以改为使用第 3 个文件的上传来触发该过程,然后将所有 3 个文件复制到 Redshift。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM