将客户端通过Chalice上传到S3存储桶的最佳做法是什么?

时间:2018-06-11 22:53:56

标签: python rest amazon-s3 chalice

我正在使用Chalice framework来创建API服务。我的用户需要上传图像,然后我需要将图像保存到s3存储桶。

用户应该如何将图像上传到我的终端,以及我的终端在收到它后应该做什么?

到目前为止,这是我的思考过程:

BUCKET = <bucket_name>    
@app.route('/n_number_search/', methods=['POST'])
    def n_number_search():
        body = app.current_request.raw_body
        s3_client.upload_file(body, BUCKET, UUID_file_name)
        return Response(body=f'upload successful: {}', status_code=200,
                        headers={'Content-Type': 'text/plain'})

这不起作用。我已经回顾了在烧瓶中执行此操作的方法,但由于烧瓶具有request.files属性,因此语法略有不同。

2 个答案:

答案 0 :(得分:2)

一种好的做法是使用pre-signed URL。这是高层的过程:

  1. 您的客户请求上传文件的权限
  2. 您的Lambda函数被触发,生成预签名的URL(确保Lambda对S3存储桶具有必要的权限)并响应客户端
  3. 客户端使用预先签名的URL,并将文件直接上传到S3;

优点是:

  • 通过两次上传(一次到Lambda,第二次到S3)来减少 not 的网络延迟;

  • 减少您的Lambda帐单:生成预签名的URL比等待上传要快得多,因此更便宜;

  • 消除上载失败:Lambda超时为5分钟,如果上载花费更多时间(如果文件太大或您的用户的互联网连接不正常,可能会发生),它将失败;

    < / li>

答案 1 :(得分:1)

一种好的做法是使用API Gateway作为S3存储桶的代理。使用API​​网关的主要优点是它可以处理暴露S3存储桶的许多安全方面。例如,它将负责用户身份验证以及节制滥用或过多请求。 AWS tutorial详细说明了如何实现。