使用S3 + CloudFront的维护模式

时间:2017-10-24 07:49:58

标签: amazon-s3 amazon-cloudfront

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

我可以将维护HTML(或json)放到S3中。当我打开维护模式时,如何配置CloudFront以返回维护站点?

2 个答案:

答案 0 :(得分:5)

创建Lambda @ Edge函数以生成静态"维护"响应:  http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-static-web-server

如果要激活它,请选择 Viewer Request 触发器,并在设置页面上使用Lambda函数的ARN,以获取要返回维护消息的缓存行为,并保存更改。要取消激活它,请将其删除。通常会在很短的时间内处理更改。

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

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

答案 1 :(得分:0)

您可以在CloudFront上执行invalidation个特定文件,但这意味着您必须在维护期间覆盖当前的Web应用程序,然后在备份后将其还原(并再次使其无效)。

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

使用后一种解决方案,您只需要将文件上传到S3并记得在完成后再次删除/替换它 - 您甚至可以包含应用程序向您的用户显示的消息(可能是更改日志?)。