在同一存储桶中使用多个源的Cloudfront

5
我有一个CloudFront分发,使用一个S3桶作为源。该桶中有公共和私有数据,由文件夹进行隔离 - public_folder_1、public_folder_2、private_folder_1、private_folder_2 。我想要使用CloudFront仅提供来自两个公共文件夹的内容。我希望请求xxx.cloudfront.net/public_folder_1/file1将被发送到public_folder_1,请求xxx.cloudfront.net/public_folder_2/file1将被发送到public_folder_2
我在分发中创建了两个源,原始名称和路径为mybucket/public_folder_1mybucket/public_folder_2。我还创建了两个行为,路径模式为public_folder_1/*public_folder_2/*(我尝试添加前导/到路径模式, 但看起来没有区别)。但我无法通过CloudFront访问文件。
如果我将任一行为的路径模式更改为*而不是public_folder_x/*,那么我可以使用xxx.cloudfront.net/filex访问文件。但我的担忧是,如果两个文件名相同,如何让CloudFront知道使用哪个文件夹作为源? 我不想为每个源路径创建和管理单独的分发。

你找到解决方案了吗?我面临着一个非常类似的困境。 - Nick Spreitzer
不行。我想唯一的出路就是为每个公共文件夹创建一个单独的发行版。 - Keegan
1个回答

9
在我的情况下,我没有意识到 CloudFront 找到匹配的 behavior 时会将 整个 URL 路径转发至 S3。 如果在您的 S3 子目录中没有表示匹配的目录结构,则会收到 403 响应。例如,如果您有一个与 /developer/* 匹配的 behavior,并且该 URL 是 {hostname}/developer/thing.html,则代表源头的 S3 bucket 目录 必须 命名为“developer”的根级子目录,其中包含 thing.html

我的担忧是,如果两个文件在这两个文件夹中具有相同的名称,CloudFront 如何知道使用哪个文件夹作为 origin?

您需要找到一种通过匹配模式区分文件的方法。 我建议为每个 origin 添加唯一命名的文件夹,然后创建基于提供的路径重定向流量的 behavior:

  • origin1: mybucket/stuff
  • origin2: mybucket/things
  • behavior1: /stuff/* --> origin1
  • behavior2: /things/* --> origin2
  • cloudfront-url/stuff/file.html --> 返回 stuff 目录中的 file.html,即 origin1。
  • cloudfront-url/things/file.html --> 返回 things 目录中的 file.html,即 origin2。

编辑:

我刚刚创建了一个带有以下两个 origin 的单一分发器...

origins

具有以下 behaviors...

behaviors

以及以下桶结构...

S3

这是结果:

我将保留这个发行版几天,以便您可以点击链接。


嘿,尼克,这正是我的问题所在。我已经设置了两个路径(在我的根目录中),并使用2个行为 - “我已经创建了2个源,源名称+路径为mybucket/public_folder_1和mybucket/public_folder_2,用于这两个文件夹。我还创建了两个路径模式的行为 - public_folder_1/* 和 public_folder_2/*”。但它不起作用。Cloudfront最终只会缓存一个目录。 - Keegan
我不认为那完全正确。在这个例子中,public_folder_1public_folder2。每个源相当于hostname/的一个URL。你需要在每个源中有一个区别明显的子目录,然后创建匹配子目录名称的行为以使其生效。换句话说,在你的例子中,你不能匹配名称为public_folder_1public_folder2的内容。请稍等,我将更新答案以便更清晰。 - Nick Spreitzer
2
谢谢您的评论。第一段解决了我所有的问题。如果可以的话,我会请您喝一杯啤酒。 - Tye2545
1
这个很好用。非常感谢,Nick!这是一个感叹号! - Kristoffer Berg - EcodeAS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接