为什么通过 CodeDeploy 执行就地部署时流量会被路由到 EC2 实例?

为什么通过 CodeDeploy 执行就地部署时流量会被路由到 EC2 实例?

我已经使用 CodePipeline 和 CodeDeploy 配置了 CD。

  • 自动扩展组中的 EC2 实例(3 个实例)
  • 已配置运行状况检查的应用程序负载均衡器
  • EC2 实例上的 UWSGI 应用程序

CodeDeploy 部署组配置:

  • 已分配应用程序负载均衡器
  • 目标自动扩展组(带有附加的应用程序负载均衡器)。
  • 就地部署。

然后我有 appspec,它有以下钩子:

hooks:
  BeforeInstall:
    - location: scripts/clean_instance.sh
      timeout: 120
      runas: root
  AfterInstall:
    - location: scripts/install_python_dependencies.sh
      timeout: 300
      runas: project_user
    - location: scripts/compile_translations.sh
      timeout: 300
      runas: project_user
  ApplicationStart:
    - location: scripts/start_application.sh
      timeout: 120
      runas: project_user
  ApplicationStop:
    - location: scripts/stop_application.sh
      timeout: 120
      runas: project_user

当部署进行时,用户会收到 5xx 错误,感觉就像没有从 ALB 中取出实例一样。文档在这里https://docs.aws.amazon.com/en_us/codedeploy/latest/userguide/integrations-aws-elastic-load-balancing.html指出,

当您将 Elastic Load Balancing 负载均衡器与就地部署结合使用时,部署组中的实例将从负载均衡器中取消注册,使用最新的应用程序修订进行更新,然后在部署成功后作为同一部署组的一部分重新注册到负载均衡器。

我可以在部署控制台中看到实际的 BlockTraffic 和 AllowTraffic 事件。但后来我发现了这个存储库https://github.com/aws-samples/aws-codedeploy-samples/tree/master/load-balancing/elb-v2,其中指出必须执行一些自定义脚本来从负载均衡器中取消注册实例。

我真的应该使用这些脚本吗?如果是,那么为什么文档指出 ALB 不会在部署过程中的实例上路由流量?如果不是,那么为什么用户在部署应用程序时会遇到那些 5xx 错误?

相关内容