Elastic Beanstalk 提供了多种策略来实现零停机更新,确保你的应用程序在部署新版本时保持可用性。以下是几种主要的方法:
滚动更新逐步将新的应用程序版本部署到环境中的实例。你可以配置每次更新的批次大小和健康检查设置,确保只有健康的实例才会接收流量。
在 Elastic Beanstalk 控制台中,你可以配置滚动更新的以下设置:
你也可以使用 .ebextensions 配置文件来配置滚动更新。例如:
option_settings:
aws:elasticbeanstalk:environment:process:default:
HealthCheckPath: /health
aws:elasticbeanstalk:command:
DeploymentPolicy: Rolling
RollingUpdateType: Health
RollingUpdateMaximumBatch: 20
RollingUpdateMinimumInstancesInService: 80
这个配置指定使用基于健康状况的滚动更新,每次更新最多 20% 的实例,并确保至少有 80% 的实例保持运行。
蓝/绿部署创建一个与现有环境(蓝色环境)并行的新环境(绿色环境)。在新环境上部署新版本的应用程序后,你可以将流量从蓝色环境切换到绿色环境。
你可以使用 Elastic Beanstalk 控制台或 AWS CLI 来实施蓝/绿部署。
使用 Elastic Beanstalk 控制台:
使用 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
蓝/绿部署的优点是它提供了一种快速回滚到旧版本的简单方法,只需将流量切换回蓝色环境即可。👍
连接耗尽允许负载均衡器在实例从服务中移除之前完成正在进行的请求。这可以防止请求在部署期间中断。
你可以在 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 秒。⏰
对于更复杂的部署场景,你可以使用自定义部署脚本来控制更新过程。这些脚本可以在 Elastic Beanstalk 实例上运行,以执行自定义任务,例如数据库迁移或缓存预热。
你可以将自定义部署脚本添加到你的应用程序包中,并使用 .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! 😊