使用 S3 + CloudFront 的维护模式

Maintenance mode using S3 + CloudFront

我正在提供托管在 S3 上并通过 CloudFront 暴露在网络上的单页应用程序。当我对我的 API 执行维护时,我想要一个手动开关,使我的应用请求呈现维护页面。

我可以把维护HTML(或json)放到S3上。如何在打开维护模式时将 CloudFront 配置为 return 维护站点?

您可以对 CloudFront 上的特定文件执行 invalidation,但这意味着您必须在维护期间覆盖当前的 Web 应用程序,然后在您返回后将其恢复(并再次失效)向上。

我认为最好的解决方案是在您的应用程序中添加对维护模式的支持,并定期(以及在服务不可用错误时)检查某处的标志(通常是通过 CloudFront 提供的静态文件,最大期限较短)和如果它说你处于维护模式冻结应用程序并显示一个对话框告诉用户 API 正在维护 - 或者只是锁定需要 API 访问的功能并让用户继续使用读取 -如果可能,只使用缓存数据访问。

使用后一种解决方案,您只需将文件上传到 S3 并记得在完成后再次 remove/replace 它 - 您甚至可以包含应用程序显示的消息(也许是更新日志?)给您的用户。

创建一个 Lambda@Edge 函数来生成您的静态 "maintenance" 响应: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-static-web-server

当您想要激活它时,select Viewer Request 触发并在您想要的缓存行为的设置页面上使用 Lambda 函数的 ARN到 return 维护消息,并保存更改。要停用它,请将其删除。更改通常会在很短的时间内处理。

这将实现您的目的,因为在 检查 CloudFront 缓存之前 触发查看器请求触发器,如果​​它生成响应,则 return 编辑响应而不检查缓存并且生成的响应未存储在 CloudFront 缓存中——因此在您删除触发器后任何缓存的内容仍将存在。

请注意,当您第一次实际将这样的函数与 CloudFront 分配相关联时,我相信您需要在 Lambda 控制台中"enable trigger and replicate",以便当 CloudFront 需要时,Lambda 函数可以全局访问。在测试这个时,您不必将它与 "real" CloudFront 分发相关联——您可以创建第二个用于测试——但是函数版本需要经过这个复制周期才能在云端控制台。用于 Lambda@Edge 的函数必须在 us-east-1 区域创建,然后复制到所有区域,以便 CloudFront 边缘可以通过其最近的区域调用它。 Lambda@Edge 函数始终由其数字版本 ID 引用。 Lambda@Edge 不使用函数别名,包括魔术字符串 $LATEST