【问题标题】:Is it possible to upload a file to s3 via a lambda function using pre signed url?是否可以使用预签名的 url 通过 lambda 函数将文件上传到 s3?
【发布时间】: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


【解决方案1】:

预签名 URL 是您可以提供给用户以授予对特定 S3 对象的临时访问权限的 URL,它的生命周期有限,因此将它与 Lambda 一起使用没有太大意义,因为它可以访问 s3直接存储桶。

但如果您有特定需要在 Lambda 中使用预签名的 url 上传,您可以通过以下方式进行:

import boto3
    url = boto3.client('s3').generate_presigned_url(
    ClientMethod='put_object', 
    Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
    ExpiresIn=3600)

您可以在此处找到其他编程语言的其他示例:Uploading objects using presigned URLs

【讨论】:

  • 我可以通过浏览器将请求发送到 lambda,然后上传到 s3 并返回一些响应吗?
  • 为此,您需要使用 API 网关 aws.amazon.com/premiumsupport/knowledge-center/…
  • 你认为这对你有帮助吗@code0x00?
  • 我已经更新了问题,我想从后端调用 lambda 函数来获取预签名的 url,你能帮我解决一下吗。
  • 尝试在您的问题中添加 Lambda 策略摘要
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2018-12-27
  • 2020-10-23
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多