AWS Lambda函数是否可以直接与s3上的文件一起工作,或者是否需要移动到/tmp/



我正试图用Python编写一个AWS lambda函数,从s3存储桶中收集一堆csv文件,将它们连接起来,删除重复的文件,并将结果写回s3。我想读取的文件以前缀/存储在s3上的一个文件夹中。目前,我正在尝试使用以下方法逐一读取文件:

resp = s3.list_objects_v2(Bucket='mybucket')
#getting all objects in the bucket in a list
for obj in resp['Contents']:
keys.append(obj['Key'])
#filtering those that are parsed entries
files = [k[6:] for k in keys if 'links/links' in k]
#reading into combined list
for file in files:
with open(file, 'r') as csvfile:
reader = csv.reader(csvfile)
links = links + list(reader)

目前我得到以下错误:

{
"errorMessage": "[Errno 2] No such file or directory: 'links2020-02-27 14:59:49.933074.csv'",
"errorType": "FileNotFoundError",
"stackTrace": [
"  File "/var/task/handler.py", line 21, in concatenatelinksn    with open(file, 'r') as csvfile:n"
]
}

在早期版本中,我没有对文件名进行切片,这导致了同样的错误。那么,我需要将所有文件加载到/tmp/中吗s3.meta.client.upload_file('/tmp/' + str(filename), bucket, 'fusedlinks/' + str(filename))使它们可以访问lamda函数,或者有更优雅的解决方案吗?

从错误中可以看出文件名约定不正确:links2020-02-27 14:59:49.933074.csv。在通过boto3客户端读取文件时,您可能需要转义">空白"。

但要读取文件,有两个选项,我个人更喜欢选项2(但取决于内存使用情况(:

  1. 将文件系统用作/tmp的一个

您可以参考AWS文档中提到的示例

此外,AWS Lambda目前提供512 MB的/tmp大小,如果所有文件的总大小超过512 MB,则需要找到不同的解决方案。参考AWS Lambda Limits

  1. 第二个选项是使用内存缓冲区。您可以使用:Python的BytesIo。以下示例:
def load_from_s3(bucket, path):
s3_resource = boto3.resource('s3')
with BytesIO() as data:
s3_resource.Bucket(bucket).download_fileobj(path, data)
data.seek(0)
# Do something with your data in file

相关内容

最新更新