在 AWS Lambda (Python) 中将文件从 multipart/form-data 上传到 S3

Upload files to S3 from multipart/form-data in AWS Lambda (Python)

我正在通过 API 网关调用此 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)
    }

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