amazon-s3 - S3 后备存储桶
问题描述
我已经建立了一个有产品模板的系统。品牌将覆盖模板以创建产品。图像可以上传到模板并覆盖在产品上。商品图片上传到对应品牌的 S3 存储桶。但在产品模板上,图像被上传到通用 S3 存储桶。
如果品牌的存储桶收到带有文件 url 的 404 或 403,有没有办法让品牌的存储桶回退到通用存储桶。类似于托管网站重定向规则?这些只是带有图像的存储桶,因此它不是托管网站,我希望避免打开它。
解决方案
单独使用 S3 无法做到这一点,但可以使用 CloudFront 与两个 S3 存储桶一起完成,并在具有适当源故障转移设置的源组中配置,以便第一个存储桶的 403/404 错误导致 CloudFront从第二个存储桶发出后续请求。
为缓存行为配置源故障转移后,CloudFront 对查看器请求执行以下操作:
当缓存命中时,CloudFront 会返回请求的文件。
当缓存未命中时,CloudFront 会将请求路由到您在源组中标识的主要源。
当返回尚未为故障转移配置的状态代码(例如 HTTP 2xx 或 HTTP 3xx 状态代码)时,CloudFront 会提供请求的内容。
当主源返回您为故障转移配置的 HTTP 状态代码时,或超时后,CloudFront 会将请求路由到源组中的备份源。
这似乎是您所描述的期望行为。当然,这意味着需要回退到第二个存储桶的缓存未命中将需要额外的时间来提供服务,但是对于缓存命中,不会有任何延迟,因为 CloudFront 只经历了“尝试一个,然后尝试另一个”关于缓存未命中。这也意味着您将在主存储桶上为不存在的对象支付一些流量,因此如果主存储桶经常拥有该对象是最有意义的。
此解决方案不会重定向浏览器 - CloudFront 在返回响应之前遵循第二条路径 - 因此您需要注意在Cache-Control
上传回退对象时附加到它们的设置,因为添加(以前不存在)回退对象已获取并缓存(通过 CloudFront 或浏览器)之后的主对象将不可见,直到任何缓存对象过期。
推荐阅读
- angular6 - 反应式表单 - 在提交时,检查表单中是否至少有一项更改,然后才调用 API
- ionic4 - Ionic 4 迁移:IonicModule 更改
- javascript - setTimeout() 跳转到数组的最后一个元素我该如何防止这种情况?
- mysql - 我需要在下面的 sql 查询中使用什么类型的连接来检索正确的结果?
- node.js - 服务器端渲染和生成缓存的 index.html(Vuejs、Nodejs)
- javascript - 从 ftp 运行时“THREE.GLTFLoader: Unable to parse model”
- sql - SQL - 在单个记录中分组和汇总
- django - 无法在 VueJs 中从 Django API 渲染图像
- javascript - 方法不等待异步 REST 调用
- c# - 为什么 C# 列表由带符号的 int 索引