如何将 s3 内容请求重定向到 lambda?

How to redirect s3 content request to lambda?

我正在关注 this tutorial 使用 s3 和 lambda 实现动态生成缩略图。我坚持将不存在的请求重定向到 lambda

我的 s3 存储桶是私有的,我使用带有 Cognito idtoken 的预签名 url 来访问它的内容,它有效。

现在,如果我向尚未生成的缩略图发出请求(s3 中不存在),我希望 s3 将请求重定向到 lambda。我不知道该怎么做。

这里是 s3 路由角色

<RoutingRules>
  <RoutingRule>
  <Condition>
  <KeyPrefixEquals/>
  <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
  <Protocol>https</Protocol>
  <HostName>MY_LAMBDA_DOMAIN</HostName>
  <ReplaceKeyPrefixWith>dev/photos?key=</ReplaceKeyPrefixWith>
  <HttpRedirectCode>307</HttpRedirectCode>
</Redirect>

  1. 当我访问带有预签名 URL 的不存在的缩略图时,出现 403 错误,因此我尝试使用 s3 end 预签名 url点

    const s3 = new AWS.S3({endpoint: 'http://s3-website.us-east-2.amazonaws.com'})
    s3.getSignedUrl('getObject', {
      Bucket: BUCKET,
      Key: 'userId/test-thumb.jpg',
      Expires: signedUrlExpireSeconds
    })
    

    这次它给了我 404 和错误消息,但仍然没有将请求重定向到 lambda

  2. 我注意到在我上面提到的教程中,它使用了 public s3 存储桶。 我不确定是否可以在私有存储桶中实施此解决方案。

  3. 跟s3政策有关系吗?目前我的私人存储桶没有附加政策

任何建议将不胜感激,谢谢

单独使用 S3 无法完成您正在尝试的操作。 S3 不允许基于规则的重定向。

您可以尝试使用 Cloudfront 和 Lambda@Edge 来实现这一点。

您可以在此处查看重定向示例:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html

基本上,将S3设置为Cloudfront后端,然后看例子:"Example: Using an Origin-Response Trigger to Update the Error Status Code to 302-Found"。这允许您捕获 404 响应中的 403,然后根据需要重定向到另一个 URL,就像您的 Lambda 函数一样。