【问题标题】:Modifying CloudFront Origin Request for S3修改 S3 的 CloudFront 源请求
【发布时间】:2021-03-14 03:48:40
【问题描述】:

我在 CloudFront 分配后面有两个 S3 存储桶。

一个桶是默认的行为来源;一种是特定路径模式下的附加行为。

问题在于 CloudFront 使用整个路径来请求存储桶对象,这需要确切的路径作为存储桶中对象名称的一部分存在。

如果我请求.../auth/index.html.,路径模式auth/* 需要auth/index.html 对象

如果我更改路径,我将不得不更改存储桶中的所有对象名称。

有没有办法解决这个问题?

【问题讨论】:

  • 一种可能的解决方案是使用 lambda edge 来修改源请求。
  • 可以缓存吗?否则,它可能太贵了。
  • 我刚刚看到,原始请求的 Lambda@Edge 仅在缓存未命中后执行。

标签: amazon-s3 amazon-cloudfront


【解决方案1】:

感谢评论,我找到了 Lambda@Edge 的解决方案。

如果您在 CloudFront 行为中使用了路径模式 auth/*,以便所有以 auth/ 开头的 URL 都被路由到特定的 S3 存储桶,并且您希望将所有文件保存在该存储桶中而不使用 auth/ 前缀.然后您需要将此边缘 Lambda 添加到您的 CloudFront 行为中:

const prefix = "auth/"
exports.handler = async (e) => {
  const { request } = e.Records.pop().cf;
  if (request.uri.contains(prefix))
    request.uri = request.uri.replace(prefix, "");
  return request;
});

事件类型是源请求。

auth/index.html 的请求,CloudFront 将从您的关联存储桶中获取index.html,而不是从auth/index.html

由于只有在发生缓存未命中时才会将原始请求发送到 S3 存储桶,因此这应该是一个非常便宜的解决方案。

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2019-08-21
    • 2019-06-07
    • 2015-04-15
    • 2020-06-07
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多