首页 文章

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

提问于
浏览
5

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

我的s3存储桶是私有的,我使用带有Cognito idtoken的预签名网址来访问其内容,它可以工作 .

现在,如果我向尚未生成的缩略图发出请求(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>
  • 当我使用预先签名的URL访问不存在的缩略图时,它给出了403错误,因此我尝试使用s3 endpoints 预先签名该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
enter image description here

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

  • 是否与s3政策有关?目前我的私人存储桶没有附加任何政策

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

1 回答

  • 4

    单独使用S3无法实现您的尝试 . S3不允许基于规则的重定向 .

    您可以做的是尝试使用Cloudfront和Lambda @ Edge实现这一目标 .

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

    基本上,将S3设置为Cloudfront后端,然后查看示例:“示例:使用Origin-Response触发器将错误状态代码更新为302-Found” . 这允许您捕获403的404响应,然后按需将其重定向到另一个URL,就像您的Lambda函数一样 .

相关问题