python - 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 concatenatelinks\n 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(但取决于内存使用情况):
- 一种将文件系统用作 /tmp
您可以参考AWS 文档中提到的示例示例
此外,AWS Lambda 目前提供的 /tmp 大小为 512 MB,如果所有文件的总大小超过 512 MB,您将需要找到不同的解决方案。参考AWS Lambda 限制
- 第二种选择是使用 In-memory buffer。您可以使用: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
推荐阅读
- xamarin - 将应用程序部署到设备失败
- scala - 火花数据帧中的处理数组[字节]
- c - 使用 fscanf 读取可变数量的整数
- spring-boot - 添加@EnableAuthorizationServer 在服务器启动时引发异常
- python - 在 Pandas 中向量化条件计数
- sharepoint - 使用列表项信息通过 SharePoint 2013 工作流将文档从一个文档库移动到另一个文档库
- javascript - 创建自定义光标,该光标会根据鼠标沿 div 的位置而变化
- android - startService() 导致 UI 线程冻结
- c++ - 如何使用文件填充数组并将其与用户输入 c++ 进行比较
- python-3.x - 这是使用 pd.get_dummies 的正确方法吗?