

# 部署方法
<a name="deployment-methods"></a>

 在持续交付过程中推出新版软件时，您可以考虑多种部署策略和变体。本节讨论最常见的部署方法：一次部署全部（就地部署）、滚动、不可改变和蓝/绿。AWS 会指出 AWS CodeDeploy 和 AWS Elastic Beanstalk 支持其中哪些方法。 

 下表总结了每种部署方法的特征。 


|  方法  |  部署失败带来的影响  |  部署时间  |  零停机时间  |  无 DNS 更改  |  回滚过程  |  代码部署到  | 
| --- | --- | --- | --- | --- | --- | --- | 
|  就地部署  |  停机时间  |  ![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)  |  ☓  |  ✓  |  重新部署  |  现有实例  | 
|  滚动  |  单个批处理服务中断。任何在故障之前成功的批处理将运行新应用程序版本。  |  ![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)†  |  ✓  |  ✓  |  重新部署  |  现有实例  | 
|  附加批处理滚动部署（beanstalk）  |  如果第一个批处理失败，则影响最小；否则类似于滚动部署。  |  ![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)†  |  ✓  |  ✓  |  重新部署  |  新实例和现有实例  | 
|  不可改变  |  最低  |  ![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)  |  ✓  |  ✓  |  重新部署  |  新实例  | 
|  流量拆分  |  最低  |  ![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)  |  ✓  |  ✓  |  重新路由流量并终止新实例  |  新实例  | 
|  蓝/绿  |  最低  |  ![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image18.png)  |  ✓  |  ☓  |  切换回旧环境  |  新实例  | 

## 一次部署全部（就地部署）
<a name="all-at-once-in-place-deployment"></a>

 一次部署全部（就地部署）是一种可用于将新的应用程序代码部署到现有服务器机群的方法。此方法在一个部署操作中替换所有代码。它要求停机，因为机群中的所有服务器都会一起更新。无需更新现有的 DNS 记录。如果部署失败，恢复运营的唯一方法是再次在所有服务器上重新部署代码。 

 在 AWS Elastic Beanstalk 中，此部署称为[一次部署全部](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html)，可用于单个负载均衡的应用程序。在 AWS CodeDeploy 中，此部署方法称为部署配置 `AllAtOnce` 的[就地部署](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments.html)。

## 滚动部署
<a name="rolling-deployment"></a>

 通过滚动部署，机群分成若干部分，这样就不会一次升级整个机群。在部署过程中，两个软件版本（新版本和旧版本）在同一个机群上运行。此方法可实现零停机时间更新。如果部署失败，则只有机群的已更新部分受到影响。 

 滚动部署方法的一种变体称为金丝雀发布 (Canary release)，首先是在极小比例的服务器上部署新的软件版本。这样，您就可以在少数服务器上观察软件在生产环境中的运行情况，同时最大限度地减少重大更改带来的影响。如果 Canary 版本部署的错误率提高，则会回滚软件。否则，使用新版本的服务器的百分比将逐渐增加。 

 AWS Elastic Beanstalk 已遵循滚动部署模式，并提供两个部署选项：[滚动部署和附加批处理滚动部署](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html)。这些选项允许应用程序在服务器停止服务之前先纵向扩展，从而在部署期间保留完整的功能。AWS CodeDeploy 通过使用类似于 [OneAtATime 和 HalfAtATime](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html) 等模式的就地部署变体来实现此模式。

## 不可改变和蓝/绿部署
<a name="immutable-and-bluegreen-deployment"></a>

 不可改变模式通过使用新的应用程序代码配置或版本来启动一组全新的服务器，以指定应用程序代码的部署。这种模式利用了云功能，此功能通过简单的 API 调用创建新的服务器资源。 

 蓝/绿部署策略是一种不可改变部署，它还要求创建另一个环境。新环境启动并通过所有测试后，流量将立即转移到这一新部署。至关重要的是，旧环境（即“蓝”环境）保持空闲状态，以防需要回滚。 

 AWS Elastic Beanstalk 支持[不可改变](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environmentmgmt-updates-immutable.html)和[蓝/绿](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.CNAMESwap.html)部署模式。AWS CodeDeploy 也支持[蓝/绿模式](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html#welcome-deployment-overview-blue-green)。有关 AWS 服务如何实现这些不可改变模式的更多信息，请参阅 [AWS 上的蓝/绿部署](https://d1.awsstatic.com/whitepapers/AWS_Blue_Green_Deployments.pdf)白皮书。