与CDN的谷歌CDN连接创建了许多关键错误

时间:2017-11-04 17:20:18

标签: google-cloud-storage

我将图片上传到谷歌存储桶,我不想尝试使用负载均衡器设置CDN。

存储状态: 存储桶权限:存储对象查看器 - 读取器分配给所有用户, 存储传统存储桶读取器分配给所有用户

档案状态: 共享公共设置,并有一个公共链接

负载均衡器: 设置为主机名上的路径/广告素材/ *

但我总是得到这个消息:

 <Error>
 <Code>NoSuchKey</Code>
 <Message>The specified key does not exist.</Message>
 </Error>

我注意到的是,只要我构建/ creatives / *的路径,就会有另一个路径构建/ *直接指向自动缩放组的后端服务

我在这里缺少任何设置吗?

2 个答案:

答案 0 :(得分:1)

因为我发现Google CDN + Google http负载均衡器与其他CDN不同。

使用常规CDN,您可以将源指向您的存储桶HTTP地址并在/结构上工作。 例如 : Google CDN Bucket网址: googleapi.storage.com/my-bucket 文件夹结构: /1/1.jpg

正常的CDN来源将指向googleapi.storage.com/my-bucket 您将获得CDN的新服务端点,如: my-bucket.fastly.cdonservice.com 这个电话会起作用: my-bucket.fastly.cdonservice.com/1/1.jpg

但是在谷歌云上你正在设置的是一条连接到你在后端部分创建的CDN服务的路径。 所以这是最大的区别,让我们假设你创建了这个路径规则。 主持人:www.googlecdnnonexplainedfeautres.com 路径:/ images / * service:yourbackendservice(连接到要缓存的存储桶)

所以你可能认为这应该有效: www.googlecdnnonexplainedfeautres.com/images/1/1.jpg。

但没有...... 在挖掘日志后,您会发现存储桶中有404,因为谷歌会在存储桶中搜索此路径:

googleapi.storage.com/my-bucket/images/1/1.jpg。

等等,图片来自哪里?我认为它是一个钩子。没有谷歌把它作为一个静态的网站根(你可以在S3上检查和关闭的东西)所以这里强制性。

那么这应该如何运作?

将文件夹结构修改为:

Google CDN Bucket URL: googleapi.storage.com/my-bucket

文件夹结构: 图像/ 1 / 1.JPG

现在你很好。

此链接现在可以使用:

www.googlecdnnonexplainedfeautres.com/images/1/1.jpg。

因此,在您提交一个用作谷歌CDN源的存储桶之前,只需添加另一个与您在LB上设置的路径匹配的顶级文件夹。

当然还有..权限,所有用户,阅读等等。

享受!

答案 1 :(得分:1)

你可以使用 URL Rewrites 来解决这个问题。

这在 2017 年可能不存在,但至少在 2021 年有一个选项。


说明:

lb 的默认行为是将主机之后的整个路径传递到 Cloud Storage。这可能看起来不正确,但这是一个合理的默认设置(负载均衡器如何知道您要包含或排除路径的哪一部分?)。

我遇到了同样的问题。

我已将 mydomain.com/static/* 连接到我的云存储桶 static-assets

在访问 mydomain.com/static/static-asset.jpg 时,负载均衡器会为密钥为 static-assets/**static**/static-asset.jpg 的对象请求云存储。

由于对象的实际键是 static-assets/static-asset.jpg,这将返回 NoSuchKey 响应。

修复方法是将 /static 的路径前缀重写为 /

一种配置方法是通过 Cloud Console 负载均衡器界面——我们可以添加高级路径规则来重写前缀。

Cloud Console GUI Showing Path Rule Details

请注意:

<块引用>

重要提示:重写按原样添加到路径中。完整路径 不支持重写。 HTTP(S) 负载平衡仅实现 路径前缀重写。例如,您可以重写: host.name/path1/resource1host.name/path2/resource1。你不能host.name/path1/resource1 重写为 host.name/path1/resource2

了解 URL 重写 here