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

pay*_*ike 5 thumbnails amazon-s3 amazon-web-services aws-lambda

我正在按照本教程使用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>
Run Code Online (Sandbox Code Playgroud)

  1. 当我使用预先签名的URL访问不存在的缩略图时,它给出了403错误,因此我尝试使用s3端点预先签名该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
    })
    
    Run Code Online (Sandbox Code Playgroud)

    这次它给我404和错误消息,仍然没有重定向请求到lambda 在此输入图像描述

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

  3. 它与s3政策有什么关系吗?目前我的私人存储桶没有附加任何政策

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

col*_*lde 5

单独使用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函数一样.