CloudFront:使用 RoutingRule 在内部重定向到 S3 存储桶文件中的特定文件

CloudFront: Internally redirect to specific file in S3 bucket file using RoutingRule

我正在使用 AWS CDK 设置一个新的私有 S3 静态站点存储桶,并使用 CloudFront 配置为其提供服务。 S3 bucket的结构如下:

bucketname/1.2.3-SNAPSHOT/
bucketname/1.2.3-SNAPSHOT/index.html
bucketname/1.2.3-SNAPSHOT/config
bucketname/1.2.3-SNAPSHOT/config/config-dev.js
bucketname/1.2.3-SNAPSHOT/config/config-tst.js
bucketname/1.2.3-SNAPSHOT/config/config-acc.js
bucketname/1.2.3-SNAPSHOT/config/config-prd.js

例如,当我部署静态站点的 4.5.6-SNAPSHOT 版本时,会在 bucketname S3 存储桶中创建一个新文件夹 4.5.6-SNAPSHOT。目前,index.html 包含以下内容:

<html>
  <head>
    <script src="https://dev.somesite.com/config/config-dev.js" />
  </head>
  <body>...</body>
</html>

我已经成功配置云端配置,使用 S3 destinationPrefixhttps://dev.somesite.com/some-path 映射到 bucketname/1.2.3-SNAPSHOT/some-path。当我导航到 https://dev.somesite.com/ 时,会提供 index.html 并加载配置 js。到目前为止一切顺利。

但是,正如您在 HTML 中所见,对 config-dev.js 的引用仍然是硬编码的。我希望 CloudFront 配置在内部(不是 30x)将调用 https://dev.somesite.com/config/config.js 重定向到 bucketname/1.2.3-SNAPSHOT/config/config-dev.js。我曾尝试使用 KeyPrefixEqualsReplaceKeyWith 值的多样性来设置 RoutingRule,但无济于事。我正在尝试设置一个类似于 this 的配置(示例 2)。

我的 CDK 脚本生成以下路由规则:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>1.2.3-SNAPSHOT/config</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>1.2.13-SNAPSHOT/config/config-dev.js</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>

但是,对 https://dev.somesite.com/config/anything 的调用不会被重定向到所需的配置-dev.js 文件。有人知道解决这个问题的最佳方法吗?设置 RoutingRule 是正确的方法吗?

[编辑]

我使用 S3 destinationPrefix=1.2.3-SN 设置来确保将新文件夹上传到存储桶 bucketName 中的新目标(前缀)文件夹“1.2.3-SN”中。同时,我已将 CloudFront 的 originPath 配置为 /1.2.3-SN 以确保将文件夹设置为 "root" 文件夹。这按预期工作;导航到 https://dev.somesite.com/ 会导致 bucketname/1.2.3-SN/index.html 被提供。

我想要完成的是能够 "rerouting" 对 https://dev.somesite.com/config/**.js 的任何调用都位于 bucketname/1.2.3-SN/config 中的单个配置文件。我这样做的原因是为了确保 index.html 中的脚本引用不需要根据环境进行更改,同时屏蔽掉当前环境中不需要的其他配置文件。

您可以 运行 CloudFront 边缘的 Lambda 函数。它被称为 lambda@edge 当CDN得到一个请求(Viewer request),你可以设置很多东西比如:

  • 转发到特定的桶
  • 设置响应headers
  • ...

相信这就是您所需要的。