【发布时间】:2021-12-07 23:56:41
【问题描述】:
我有一个场景,我想使用预签名的 url 通过 lambda 函数将文件上传到 s3。
这里有一件事很重要,我想要的是使用预签名的 url 授权 lambda 函数,以便它可以将文件上传到 s3 并将输出返回给用户。
这里看起来像:
user asks to upload a file ---> a presigned url gets created --> (which will trigger lambda function to upload file to s3) --> lambda function return some output to the user.
注意:我已经成功创建了一个预签名的 url,可以直接上传到 s3,它工作正常。但我希望它通过 lambda 函数并返回一些响应。
我需要这样的东西,但要上传图片: https://docs.aws.amazon.com/AmazonS3/latest/userguide/transforming-objects.html
但不确定它是否可以上传图片。
谁能告诉我怎么做?
编辑
我相信我需要从后端调用 lambda 函数来获取预签名的 url。
但目前出现错误
An error occurred (AccessDeniedException) when calling the Invoke operation:
User: arn:aws:iam::<user-id>:user
is not authorized to perform: lambda:InvokeFunction on resource:
arn:aws:lambda:eu-east-1:<user-id>:function:function
because no identity-based policy allows the lambda:InvokeFunction action
我对用户也有AWSLambdaRole 权限。
我用来调用 lambda 函数的这段代码:
response = client.invoke(
FunctionName=FunctionName,
InvocationType='RequestResponse',
LogType='None',
Payload=json.dumps(payload)
)
【问题讨论】:
-
你为什么要使用预签名网址呢? Lambda 可以直接访问 S3,无需 url。
-
@Marcin 我基本上想要的是我想使用浏览器和 lambda 向 lamda 发送请求,然后将图像上传到 s3,上传后 lambda 应该将响应发送回浏览器,如我在图像中发布了关于“转换对象”的链接。但我无法真正创建它。你能告诉我如何实现这个流程吗?
-
图片文件从哪里来?如果它来自用户的计算机,那么他们将需要通过浏览器上传。 Lambda 函数无权访问其计算机上的文件。
-
@JohnRotenstein 我已经更新了问题,我想从后端调用 lambda 函数来获取预签名的 url,你能帮帮我吗。
-
我还是一头雾水。正常的做法是前端调用 API Gateway 请求预签名 URL,API Gateway 会触发 Lambda 函数生成预签名 URL,返回给前端。然后前端将使用预签名的 URL 直接将文件上传到 S3。这是否映射到您想要做的事情?
标签: python amazon-web-services amazon-s3 aws-lambda