我在Elastic Beanstalk上运行一个应用程序,每当我需要部署一个新版本时,我需要:
在此期间,我希望ELB停止将stream量redirect到EC2实例,并且只有在安全的情况下(当软件和数据库版本匹配时)才将stream量回收给它们。
是否有可能暂时将ELB的stream量redirect到其他地方? 例如,执行HTTPredirect到S3存储桶,还是从这个存储桶读取而不是EC2实例?
我知道我可以通过DNS更改来做到这一点,但是这需要花费额外的时间进行传播,即使TTL较低,我仍然无法保证客户端能够正确地服从TTL,并在我做出更新。
因此理想情况下,DNS应始终指向ELB,然后ELB应该将stream量实时切换到其他地方,以便升级。
AFAIK,没有办法这样做。
不过,我find了一个替代解决scheme,为我检查所有的盒子。
我更新了我的应用程序的前端控制器来读取一个环境variablesAPP_MAINTENANCE ,并返回一个503 Service Unavailable响应,如果这个variables是TRUE 。
数据库修补通过container_commands运行,并在部署期间自动执行。
现在部署过程如下,使用Elastic Beanstalk API :
APP_MAINTENANCE设置为TRUE UpdateEnvironment部署新的应用程序版本 UpdateEnvironment将APP_MAINTENANCE设置为FALSE 。 这样,我可以确定在数据库升级过程中没有任何数据库正在使用。 在此期间(大约3分钟),应用程序不可用,并且任何请求都会返回503响应,这在我的使用情况中是可以接受的。
任何接收这个响应的客户都会被邀请在几分钟内再次尝试,不pipe是真实的人(友好的消息都会邀请这样做),还是API消费者(HTTP表明这是暂时的失败,客户端应该稍后重试)。
你可以使用交换环境的URL,这里描述:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.CNAMESwap.html
将新版本加载到第二个beanstalk并交换URL或将维护站点部署到第二个Beanstalk并交换到它 – 所有stream量都redirect到新的环境。
您也可以在负载平衡器上设置安全组以临时阻止公共访问。 不优雅,但它的作品。