【问题标题】:AWS Lambda and S3: passing s3 object path to image process functionAWS Lambda 和 S3:将 s3 对象路径传递给图像处理函数
【发布时间】:2023-03-13 15:17:01
【问题描述】:

我的目的是在我的 S3 服务器上存储一个大图像,然后获取一个 lambda 函数来读取/处理文件并保存结果输出。我正在使用一个名为 python-bioformats 的包来处理专有图像文件(基本上是一堆堆在一起的 tiff)。当我使用

def lambda_handler(event, context):

    import boto3

    key = event['Records'][0]['s3']['object']['key'].encode("utf-8")
    bucket = 'bucketname'

    s3 = boto3.resource('s3')
    imageobj = s3.Object(bucket, key).get()['Body'].read()

    bioformats.get_omexml_metadata(imageobj)

我感觉 lambda 函数在制作 imageobj 时会尝试下载整个文件(5GB)。有没有办法让第二个函数(它以文件路径作为参数)以类似文件路径的方式引用 s3 对象?我也不想公开暴露 s3 存储桶/对象,所以在服务器端做这个是理想的。

【问题讨论】:

    标签: python amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    如果您的 bioformats.get_omexml_metadata() 函数需要文件路径作为参数,那么您需要在调用函数之前下载对象。

    这可能是 AWS Lambda 函数中的一个问题,因为可用磁盘空间有 500MB 的限制(并且仅限于 /tmp/)。

    如果数据可以作为流处理,您可以根据需要读取数据,而无需先保存到磁盘。但是,python-bioformats documentation 并未将其显示为选项。事实上,如果您的上述代码有效,我会感到惊讶,因为它需要 pathimageobj 是文件的内容

    【讨论】:

    • 这也是我的想法。我最初假设 lambda 可以像普通文件路径一样读取 s3 对象。然后我虽然也许流可以工作 - 但正如你所说,生物格式需要一条路径。我感觉自己运气不好,必须在上传之前处理文件。
    • 还考虑使用 s3fs 将 s3 安装到 lambda,但不建议这样做:stackoverflow.com/questions/50982548/…
    • Boto 流媒体主体很可能无法提供我需要的数据片段,因为文件以不透明的方式分隔:botocore.amazonaws.com/v1/documentation/api/latest/reference/…
    • 是啊,想不出别的办法了:/
    • Amazon EC2 实例的成本非常低(t3.micro 约为 1c/小时),因此请随意使用它来代替 Lambda(或让 Lambda 启动一个 EC2 实例)。
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2022-01-26
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2021-10-15
    • 2013-03-07
    • 2017-10-26
    相关资源
    最近更新 更多