Amazon web services 当您的实例位于ELB后面时,如何为AWS设置维护页面?

Amazon web services 当您的实例位于ELB后面时,如何为AWS设置维护页面?,amazon-web-services,amazon-elb,amazon-route53,Amazon Web Services,Amazon Elb,Amazon Route53,当您想在ELB后面部署应用程序的新版本时,如何在AWS中设置维护页面?我们希望在新的自动缩放实例即将出现时,ELB将流量路由到维护实例,并且只有在新实例完全启动后才“翻转”到新实例。我们使用自动缩放来降低现有实例,增加新实例(包含新代码) 我们试图避免的情况是,ELB在为新EC2实例提供流量的同时,也为维护页面提供服务。由于我们没有启用粘性会话,我们希望防止用户在维护模式页面和部署在EC2实例中的应用程序之间来回切换。我们也不能仅仅扩大(从2到4个实例,然后再回到2个实例)来引入新实例,因为代码

当您想在ELB后面部署应用程序的新版本时,如何在AWS中设置维护页面?我们希望在新的自动缩放实例即将出现时,ELB将流量路由到维护实例,并且只有在新实例完全启动后才“翻转”到新实例。我们使用自动缩放来降低现有实例,增加新实例(包含新代码)


我们试图避免的情况是,ELB在为新EC2实例提供流量的同时,也为维护页面提供服务。由于我们没有启用粘性会话,我们希望防止用户在维护模式页面和部署在EC2实例中的应用程序之间来回切换。我们也不能仅仅扩大(从2到4个实例,然后再回到2个实例)来引入新实例,因为代码更改可能涉及数据库更改,这将破坏旧代码的更改

AWS上最简单的方法是使用他们的DNS服务

您可以使用的功能

“您可以使用WRR将服务器投入生产,执行A/B测试, 或者在不同地区或数据中心之间平衡流量 尺寸。”

更多信息请访问


编辑:Route 53最近添加了一个新功能,允许DNS故障切换到S3。查看他们的文档了解更多详细信息:

路由53不是解决此问题的好方法。DNS条目在维护页面显示之前过期需要相当长的时间(然后在维护完成后更新它们之前也需要相同的时间)。我意识到在提出这个问题时Lambda和CodeDeploy触发器并不存在,但我想让其他人知道,Lambda可以用于为此创建一个相对干净的解决方案,我在一篇博客文章中详细介绍了这一点:


该解决方案的jist是向CodeDeploy events订阅一个Lambda函数,该函数用一个微实例替换ASG,该微实例在部署期间在负载平衡器中提供静态页面。

我们的部署过程首先运行一个cloudformation来启动一个ec2微实例(维护实例)它将预定义的静态页面从s3复制到ec2上。Cloudformation随附micro ec2实例的elb一起提供。然后运行脚本(powershell或cli)从elb的离开维护实例中删除web实例(ec2)

这样,我们在部署过程中切换到维护实例

在我们的例子中,我们有两个elb,一个用于外部,另一个用于内部。在此过程中,我们的内部elb不会更新,这是我们如何完成产品部署后烟雾测试的。
测试完成后,我们运行另一个脚本将web实例连接回elb并删除维护堆栈。

提出了另一个对我们非常有用的解决方案。以下是获得简单503 http响应所需的步骤:

  • 复制您的电子商务环境以创建另一个电子商务环境,例如,将其称为
    应用程序环境维护
  • 更改自动缩放的配置,并将最小和最大服务器都设置为零。这不会花费您任何EC2服务器,而且环境将变灰并出现在您的列表中
  • 最后,您现在可以使用AWS CLI交换环境CNAME,以使主环境进入维护模式。例如:

    aws elasticbeanstalk swap-environment-cnames \
        --profile "$awsProfile" \
        --region "$awsRegion" \
        --output text \
        --source-environment-name app-prod \
        --destination-environment-name app-prod-maintenance
    
  • 这会将您的
    应用程序产品
    环境切换到维护模式。这将导致ELB抛出503,因为没有任何正在运行的EC2实例,然后Cloudfront可以捕获503并返回自定义的503错误页面(如果您愿意),如下所述


    使用Cloudfront的自定义错误页面的额外配置:

    我们使用Cloudfront,就像许多人使用HTTPS一样。Cloudfront有错误页面。这是一项要求

  • 用错误页面创建一个新的S3网站托管bucket。考虑为响应代码创建单独的文件,503等。参见目录要求和路由的第6条。
  • 将S3存储桶添加到Cloudfront发行版
  • 为类似
    /error/*
    的路由向Cloudfront分发添加新行为
  • 在Cloudfront中设置一个错误页面来处理503个响应代码,并将其指向您的S3存储桶路由,如
    /error/503 error.html
  • 现在,当您的ELB thorws a 503时,将显示您的自定义错误页面

    就这样。我知道获取自定义错误页面有很多步骤,我尝试了很多建议的选项,包括Route53等。但所有这些都存在与ELBs和Cloudfront等相关的问题


    请注意,在为环境交换主机名后,传播大约需要一分钟左右的时间。

    我意识到这是一个老问题,但在今天(2018年12月)面临同样的问题后,似乎有另一种方法可以解决此问题

    今年早些时候,AWS引入了对的支持。简言之:

    • 在控制台中找到您的ELB
    • 查看相应侦听器的规则
    • 为应用程序的主机名添加固定的503响应规则
    • 可选地提供
      text/plain
      text/html
      响应(即您的维护页面html)
    • 保存更改
    一旦规则传播到ELB(我花了约30秒),当您尝试在浏览器中访问主机时,将显示503维护页面


    部署完成后,只需删除您添加的规则。

    据我所知,上述答案不适用或不理想

    我们有一个运行Puma的Rails应用程序,在64位AmazonLinux/2.9.0上运行Ruby2.3,它似乎带有一个(经典的)ELB

    所以ALB 503处理不是一个选项

    我们还有一个
    files:
      "/etc/nginx/conf.d/maintenance.conf":
        content: |
          server {
            listen 81;
            server_name _ localhost;
            root /var/app/current/public/maintenance;
          }
    
    container_commands:
      restart_nginx:
        command: service nginx restart