【问题标题】:Upload files to S3 from multipart/form-data in AWS Lambda (Python)在 AWS Lambda (Python) 中将文件从 multipart/form-data 上传到 S3
【发布时间】:2021-02-15 13:04:10
【问题描述】:

我正在通过 API Gateway 调用此 Lambda 函数。我的问题是图像文件格式错误,这意味着它无法打开。

import boto3
import json

def lambda_handler(event, context):
    print(event)

    # removing all the data around the packet
    # this also results in a malformed png
    start = '<?xpacket end="r"?>'
    end = '\r\n------'
    content = str(event['body'])
    content = content[content.index(start) + len(start):content.index(end)].encode('utf-8')
    
    bucket_name = "bucket-name"
    file_name = "hello1.png"
    lambda_path = "/tmp/" + file_name
    s3_path = file_name

    s3 = boto3.resource("s3")
    s3.Bucket(bucket_name).put_object(Key=s3_path, Body=content)
    
    return {
        'statusCode': 200,
        'headers': {
            'Access-Control-Allow-Origin': '*',
        },
        'body': json.dumps(event)
    }

【问题讨论】:

  • 我在格式错误的图像上也遇到过类似的问题,在我的情况下,这是因为 API Gateway 默认使用 base64 编码作为 multipart/form-data。因为我需要在上传图像时处理图像,所以预签名 URL 不适合我的用例。这个答案帮助我指出了正确的方向:stackoverflow.com/a/41770688/12992963您能否分享您的 lambda 生成的日志输出(来自上传小图像)?

标签: python amazon-web-services aws-lambda boto3 multipartform-data


【解决方案1】:

Lambda 的同步调用负载限制为 6mb,异步调用负载限制为 256KB。

https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html

此外,API 网关对于 RESTfull API 的限制为 10MB,对于套接字消息的限制为 128KB

https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

这可能是文件的某些部分被上传的主要原因,而有些则没有。

即使您没有达到较小文件大小的限制,您也需要在上传时为 lambda 执行付费。这只是浪费 lambda 的时间。

API 网关上也可能有配置来修改有效负载,同时将其推送到 lambda。确保在点击 lambda 之前没有可以转换请求的活动模板,并检查是否在 gateway-api 仪表板中针对此资源检查了使用 lambda 作为代理。

要更好地上传到 S3,请使用预签名 URL 进行 Amazon S3 PUT 操作:

https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-presigned-urls.html

【讨论】:

  • 我查看了预签名的 URL,它们似乎可以解决我的问题。我会检查一下并在这里发布我的发现。谢谢!
猜你喜欢
  • 2020-05-11
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2016-11-30
  • 1970-01-01
  • 2018-04-08
相关资源
最近更新 更多