与 CDN 的 Google CDN 连接不会产生类似的关键错误

Met*_*ata 2 google-cloud-storage

我将图像上传到 google 存储桶,但我不想使用负载平衡器设置 CDN 来工作。

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

文件状态:已设置共享公共且有公共链接

负载均衡器:设置为主机名上的路径 /creatives/*

但我总是收到这个消息:

 <Error>
 <Code>NoSuchKey</Code>
 <Message>The specified key does not exist.</Message>
 </Error>
Run Code Online (Sandbox Code Playgroud)

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

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

Met*_*ata 5

所以我发现 Google CDN + Google http 负载均衡器的工作方式与其他 CDN 不同。

使用常规 CDN,您可以将源定向到您的存储桶 HTTP 地址并处理 / 结构。例如:Google CDN Bucket URL: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(连接到你要缓存的bucket)

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

但不.. 挖掘日志后,您会在存储桶上找到 404,因为谷歌会在存储桶上搜索此路径:

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

等等,图片是哪里来的?我以为是钩子。没有谷歌将其作为静态网站根目录(您可以在 S3 上打开和关闭的东西),因此这里是强制性的。

那么这应该如何工作?

修改文件夹结构如下:

Google CDN 存储桶 URL:googleapi.storage.com/my-bucket

文件夹结构:images/1/1.jpg

现在你很好。

此链接现在应该可以使用:

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

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

当然还有 .. permissions 、 allUsers 、 read 等等。

请享用!


Gov*_*Rai 5

您可以使用 URL 重写来解决此问题。

这在 2017 年可能还不存在,但至少到 2021 年就有一个选择。


解释:

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

我面临着同样的问题。

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

访问mydomain.com/static/static-asset.jpg负载均衡器时,将请求具有 key 的对象的云存储static-assets/**static**/static-asset.jpg

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

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

配置此功能的一种方法是通过 Cloud Console 负载均衡器 UI - 我们可以添加高级路径规则来重写前缀。

显示路径规则详细信息的 Cloud Console GUI

请注意:

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

请在此处阅读有关 URL 重写的信息。