amazon-web-services - Cloudfront 同一存储桶中的多个来源
问题描述
我有一个云端分发,我使用单个 S3 存储桶作为源。存储桶中既有私有数据也有公共数据,按文件夹分隔 - public_folder_1, public_folder_2, private_folder_1, private_folder_2
。我想使用 cloudfront 仅提供 2 个公共文件夹中的内容。我想要请求xxx.cloudfront.net/public_folder_1/file1
去public_folder_1
和请求xxx.cloudfront.net/public_folder_2/file1
去public_folder_2
。
我在发行版中创建了 2 个来源,带有来源名称 + 路径 -mybucket/public_folder_1
以及mybucket/public_folder_2
2 个文件夹。我还使用路径模式创建了两种行为 -public_folder_1/*
并且public_folder_2/*
(我尝试/
在路径模式中添加一个引导,它似乎没有任何区别)。但我无法通过云端访问文件。
如果我将任一行为的路径模式更改为*
,public_folder_x/*
那么我可以使用xxx.cloudfront.net/filex
. 我对此的担忧是,如果我在两个文件夹中有 2 个同名的文件,cloudfront 将如何知道要使用哪个文件夹作为源?我不想为每个原始路径创建和管理单独的发行版。
解决方案
就我而言,我不明白当 CloudFront 发现匹配行为时,它会将整个 URL 路径转发到 S3。如果您的 S3 存储桶子目录中未显示匹配的目录结构,您将收到 403 响应。例如,如果您在 上有一个行为匹配/developer/*
,并且 url 是{hostname}/developer/thing.html
,则代表您的源的 S3 存储桶目录必须有一个名为“developer”的根级子目录,其中包含thing.html
.
我对此的担忧是,如果我在两个文件夹中有 2 个同名的文件,cloudfront 将如何知道要使用哪个文件夹作为源?
您必须找到某种方法通过匹配模式来区分文件。我建议向每个来源添加唯一命名的文件夹,然后根据提供的路径创建行为以转移流量:
- 起源1:
mybucket/stuff
- 起源2:
mybucket/things
- 行为1:
/stuff/*
-> 起源1 - 行为2:
/things/*
-> origin2 cloudfront-url/stuff/file.html
-->file.html
在 stuff 目录中返回,也就是 origin1。cloudfront-url/things/file.html
-->file.html
在 things 目录中返回,也就是 origin2。
编辑:
我刚刚创建了一个具有以下两个来源的发行版...
通过以下行为...
而下面的桶结构...
结果如下:
- https://d103l0p0xb29zj.cloudfront.net/file.html > 匹配默认行为,因此
file.html
从S3-stackoverflow-test-bucket/public_folder_1
. - https://d103l0p0xb29zj.cloudfront.net/pub1/file.html > 匹配第一个行为,
file.html
从S3-stackoverflow-test-bucket/public_folder_1/pub1
- https://d103l0p0xb29zj.cloudfront.net/pub2/file.html > 匹配第二个行为,
file.html
从S3-stackoverflow-test-bucket/public_folder_2/pub2
- 请注意,根据当前规则
S3-stackoverflow-test-bucket/public_folder_2/file.html
根本无法访问。
我会将发行版保留几天,以便您可以单击链接。