![](/img/trans.png)
[英]AWS Lambda in Python to copy new files to another s3 bucket
[英]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.