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

问题描述 投票:0回答:1

我有一个用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。

如果问题不能很清楚,请提出进一步的问题。

python amazon-web-services amazon-s3 aws-lambda amazon-cloudwatch
1个回答
2
投票

当Amazon S3事件触发AWS Lambda函数时,它将提供Bucket名称和Object键作为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。

© www.soinside.com 2019 - 2024. All rights reserved.