让客户端通过 Chalice 将图像上传到 S3 存储桶的最佳做法是什么?
What is best practice to have client upload image to S3 bucket via 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'})
这是行不通的。我已经回顾了在 flask 中执行此操作的方法,但语法略有不同,因为 flask 具有 request.files
属性。
一个好的做法是使用 pre-signed URL。这是高级过程:
- 您的客户请求上传文件的权限
- 您的 Lambda 函数被触发,生成预签名 URL(确保 Lambda 对 S3 存储桶具有必要的权限)并响应客户端
- 客户端取预签名URL,直接上传文件到S3;
优点是:
通过而非上传两次(一次到 Lambda,第二次到 S3)减少网络延迟;
减少您的 Lambda 费用:生成预签名 URL 比等待上传要快得多 - 因此更便宜;
消除上传失败:Lambda 超时为 5 分钟,如果上传时间更长,将会失败(如果文件太大或您的用户的互联网连接状况不佳,可能会发生这种情况);
一个好的做法是使用API Gateway as a proxy to your S3 bucket. The main advantage of using an API Gateway is that it can handle many security aspects of exposing your S3 bucket. For example, it will take care of user authentication and also throttling abusive or excessive requests. This AWS tutorial详细解释了如何实施。
我正在使用 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'})
这是行不通的。我已经回顾了在 flask 中执行此操作的方法,但语法略有不同,因为 flask 具有 request.files
属性。
一个好的做法是使用 pre-signed URL。这是高级过程:
- 您的客户请求上传文件的权限
- 您的 Lambda 函数被触发,生成预签名 URL(确保 Lambda 对 S3 存储桶具有必要的权限)并响应客户端
- 客户端取预签名URL,直接上传文件到S3;
优点是:
通过而非上传两次(一次到 Lambda,第二次到 S3)减少网络延迟;
减少您的 Lambda 费用:生成预签名 URL 比等待上传要快得多 - 因此更便宜;
消除上传失败:Lambda 超时为 5 分钟,如果上传时间更长,将会失败(如果文件太大或您的用户的互联网连接状况不佳,可能会发生这种情况);
一个好的做法是使用API Gateway as a proxy to your S3 bucket. The main advantage of using an API Gateway is that it can handle many security aspects of exposing your S3 bucket. For example, it will take care of user authentication and also throttling abusive or excessive requests. This AWS tutorial详细解释了如何实施。