在线客服

AWS Elastic Beanstalk应用部署过程中如何实现零停机更新

⏱️2026-05-17 09:00 👁️3
AWS Elastic Beanstalk 零停机更新

AWS Elastic Beanstalk 零停机更新 🚀

Elastic Beanstalk 提供了多种策略来实现零停机更新,确保你的应用程序在部署新版本时保持可用性。以下是几种主要的方法:

1. 滚动更新 (Rolling Updates) 🔄

滚动更新逐步将新的应用程序版本部署到环境中的实例。你可以配置每次更新的批次大小和健康检查设置,确保只有健康的实例才会接收流量。

1.1 工作原理

  1. Elastic Beanstalk 将环境中的实例分成批次。
  2. 对于每个批次,Elastic Beanstalk:
    • 从负载均衡器中移除批次中的实例。
    • 更新这些实例上的应用程序版本。
    • 将更新后的实例重新添加到负载均衡器。
  3. Elastic Beanstalk 监控每个批次中实例的健康状况。如果实例变得不健康,更新将停止。

1.2 配置滚动更新

在 Elastic Beanstalk 控制台中,你可以配置滚动更新的以下设置:

  • 批次大小:每次更新的实例数量或百分比。
  • 健康检查:Elastic Beanstalk 用于确定实例是否健康的指标(例如,HTTP 状态码)。
  • 超时:等待实例变为健康状态的最长时间。

你也可以使用 .ebextensions 配置文件来配置滚动更新。例如:


option_settings:
  aws:elasticbeanstalk:environment:process:default:
    HealthCheckPath: /health
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Rolling
    RollingUpdateType: Health
    RollingUpdateMaximumBatch: 20
    RollingUpdateMinimumInstancesInService: 80

这个配置指定使用基于健康状况的滚动更新,每次更新最多 20% 的实例,并确保至少有 80% 的实例保持运行。

2. 蓝/绿部署 (Blue/Green Deployment) 💙💚

蓝/绿部署创建一个与现有环境(蓝色环境)并行的新环境(绿色环境)。在新环境上部署新版本的应用程序后,你可以将流量从蓝色环境切换到绿色环境。

2.1 工作原理

  1. 创建一个与现有环境相同的环境的克隆。
  2. 在新环境上部署新版本的应用程序。
  3. 测试新环境以确保其正常工作。
  4. 将负载均衡器指向新环境,从而将流量切换到新版本。
  5. (可选)删除旧环境或将其保留作为备份。

2.2 实施蓝/绿部署

你可以使用 Elastic Beanstalk 控制台或 AWS CLI 来实施蓝/绿部署。

使用 Elastic Beanstalk 控制台:

  1. 克隆现有环境。
  2. 在新环境中部署新版本的应用程序。
  3. 使用交换环境 URL 功能将流量切换到新环境。

使用 AWS CLI:


# 创建一个新的环境
aws elasticbeanstalk create-environment --environment-name green-env --application-name my-app --version-label v2

# 等待新环境变为 Ready 状态

# 交换环境 URL
aws elasticbeanstalk swap-environment-cnames --source-environment-name blue-env --destination-environment-name green-env

蓝/绿部署的优点是它提供了一种快速回滚到旧版本的简单方法,只需将流量切换回蓝色环境即可。👍

3. 使用负载均衡器连接耗尽 (Connection Draining) 🔌

连接耗尽允许负载均衡器在实例从服务中移除之前完成正在进行的请求。这可以防止请求在部署期间中断。

3.1 工作原理

  1. 当 Elastic Beanstalk 准备更新实例时,它首先将其从负载均衡器中移除。
  2. 负载均衡器停止将新请求发送到该实例。
  3. 负载均衡器等待正在进行的请求完成或达到超时时间。
  4. 一旦正在进行的请求完成或超时,实例将被更新。

3.2 配置连接耗尽

你可以在 Elastic Beanstalk 控制台中配置连接耗尽的超时时间。你也可以使用 .ebextensions 配置文件:


option_settings:
  aws:elb:listener:443:
    InstancePort: 80
    InstanceProtocol: HTTP
    ListenerProtocol: HTTPS
    PolicyNames: SSLNegotiation-HTTPS-443,ELB-Security-Policy-TLS-1-2-2017-01
  aws:elb:listener:80:
    InstancePort: 80
    InstanceProtocol: HTTP
    ListenerProtocol: HTTP
  aws:elb:policies:SSLNegotiation-HTTPS-443:
    SSLProtocols: TLSv1.1,TLSv1.2
    SSLCipherSuite: ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-SHA256,ECDHE-RSA-AES256-SHA384,ECDHE-RSA-AES256-SHA,DHE-RSA-AES128-GCM-SHA256,DHE-RSA-AES128-SHA256,DHE-RSA-AES256-SHA256,DHE-RSA-AES256-SHA,RSA-AES128-GCM-SHA256,RSA-AES128-SHA256,RSA-AES256-SHA256,RSA-AES256-SHA
  aws:elb:loadbalancer:
    CrossZone: true
    ConnectionDrainingEnabled: true
    ConnectionDrainingTimeout: 300

这个配置启用了连接耗尽,并将超时时间设置为 300 秒。⏰

4. 使用自定义部署脚本 📜

对于更复杂的部署场景,你可以使用自定义部署脚本来控制更新过程。这些脚本可以在 Elastic Beanstalk 实例上运行,以执行自定义任务,例如数据库迁移或缓存预热。

4.1 实施自定义部署脚本

你可以将自定义部署脚本添加到你的应用程序包中,并使用 .ebextensions 配置文件来指定何时运行这些脚本。例如:


commands:
  01_migrate_db:
    command: "php artisan migrate --force"
    cwd: "/var/app/current"
    leader_only: true

这个配置将在每个实例上运行 php artisan migrate --force 命令,以执行数据库迁移。leader_only: true 确保只有领导者实例运行此命令。👷‍♀️

总结 🎉

通过结合使用滚动更新、蓝/绿部署、连接耗尽和自定义部署脚本,你可以实现 AWS Elastic Beanstalk 应用程序的零停机更新。选择哪种方法取决于你的应用程序的特定需求和复杂性。

希望这些信息对你有帮助! Good luck! 😊

鲨鱼云自助平台

鲨鱼云自助平台是一站式国际云服务解决方案平台,支持阿里云国际、腾讯云国际、亚马逊AWS、谷歌云GCP等主流云厂商账号的开通、充值与管理。

热门文章
更多>