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



我通过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 = 'rn------'
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,对socket消息的限制为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

最新更新