amazon-web-services - 使用签名 URL 上传到 Amazon S3
问题描述
我正在实现将由 Angular 应用程序使用的文件上传功能。但是我在让它工作时遇到了很多问题。并且需要帮助弄清楚我错过了什么。以下是现有资源的概述,以及我得到的测试和结果。
基础设施
- 我创建了一个启用版本控制、启用加密并且所有公共访问都被阻止的 Amazon S3 存储桶。
- 具有 Lambda 函数的 API 网关,可生成预签名 URL。代码如下所示。
def generate_upload_url(self):
try:
conditions = [
{"acl": "private"},
["starts-with", "$Content-Type", ""]
]
fields = {"acl": "private"}
response = self.s3.generate_presigned_post(self.bucket_name,
self.file_path,
Fields=fields,
Conditions=conditions,
ExpiresIn=3600)
except ClientError as e:
logging.error(e)
return None
return response
- 存储桶名称和文件路径设置为类构造函数的一部分。在此示例中,存储桶和文件路径是
def construct_file_names(self):
self.file_path = self.account_number + '-' + self.user_id + '-' + self.experiment_id + '-experiment-data.json'
self.bucket_name = self.account_number + '-' + self.user_id + '-resources'
通过 Postman 进行测试
在我的角度应用程序中实现它之前。我正在通过 Postman 测试上传功能。
- 我的 API 端点对预签名 URL 的响应如下所示
- 使用这些值,我从 Postman 发出另一个 API 调用并收到以下响应
如果有人能看到我在这里可能做错了什么。我在 boto3 方法中使用了不同的字段,但最终,我收到了 403 错误,其中包含与策略条件相关的不同消息。任何帮助,将不胜感激。
更新 1
- 我试图调整“文件”和“acl”的顺序,但收到如下所示的另一个错误
更新二 - 使用签名 v4
- 我更新了预签名的 URL 代码,如下所示
def upload_data(x):
try:
config = Config(
signature_version='s3v4',
)
s3 = boto3.client('s3', "eu-west-1", config=config)
sts = boto3.client('sts', "eu-west-1")
data_upload = UploadData(x["userId"], x["experimentId"], s3, sts)
return data_upload.generate_upload_url()
except Exception as e:
logging.error(e)
- 当 API 调用触发 Lambda 函数时,Postman 收到以下内容
- 使用从 API 返回的新键值,我继续尝试另一个测试上传。结果如下所示
再次出现错误,但我认为我正在朝着正确的方向前进。
解决方案
尝试在该行acl
上方移动。file
确保file
在最后。
推荐阅读
- javascript - if else 条件下 localStorage 的 Angular 单元测试
- python - Python调用表达式的被调用者什么时候可以是调用表达式?
- javascript - 在 Vanilla javascript 中呈现所有 DOM 元素后如何加载 javascript?
- python - wxpython 带有整数的 Checklistbox
- iso8583 - 授权、授权建议、授权调整和重新授权有什么区别
- node.js - 使用 Node WKHTMLTOPDF 将页面添加到 PDF
- excel-formula - 按分隔值公式拆分单元格(excel)
- angular - 仅在外部单击时调用函数不能按预期工作
- c# - 使用个人帐户托管的 Blazor Asp.Net Core 未部署
- python - Python Shapely 似乎为多边形分配了错误的点