

# REL08-BP04 使用不可变基础设施进行部署
<a name="rel_tracking_change_management_immutable_infrastructure"></a>

 不可变基础设施模式要求在生产工作负载上不会出现就地更新、安全补丁或配置更改。需要更改时，会在新的基础设施上构建架构，并将其部署到生产环境中。 

 遵循不可变基础设施部署策略，以提高工作负载部署的可靠性、一致性和可重复性。 

 **期望结果：**使用不可变基础设施，不允许为了运行工作负载中的基础设施资源而[就地修改](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/in-place-deployments.html)。相反，当需要更改时，会将一组包含所有必要更改的新基础设施资源与现有资源并行部署。会自动验证此部署，如果成功，流量将逐渐转移到新的资源集。 

 此部署策略适用于软件更新、安全补丁、基础设施更改、配置更新和应用程序更新等。 

 **常见的反面模式：** 
+  对正在运行的基础设施资源实施就地更改。 

 **建立此最佳实践的好处：** 
+  **提高跨环境的一致性：**由于不同环境的基础设施资源没有差异，因此提高了一致性并简化了测试。 
+  **减少配置偏差：**通过使用已知且受版本控制的配置替换基础设施资源，可以将基础设施设置为已知、经过测试和可信的状态，从而避免配置偏差。 
+  **可靠的原子部署：**部署要么成功完成，要么没有任何变化，从而提高部署过程的一致性和可靠性。 
+  **简化部署：**由于无需支持升级，部署得到简化。升级即意味着新的部署。 
+  **采用快速回滚和恢复流程的更安全部署：**由于之前运行的版本未发生更改，因此部署变得更安全。您可以在检测到错误时进行回滚。 
+  **增强安全状况：**通过不允许更改基础设施，可以禁用远程访问机制（例如 SSH）。这样做可以减少攻击向量，改善您的组织的安全状况。 

 **在未建立这种最佳实践的情况下暴露的风险等级：**中等 

## 实施指导
<a name="implementation-guidance"></a>

 **自动化** 

 在定义不可变基础设施部署策略时，建议尽可能使用[自动化](https://aws.amazon.com/iam/)，来提高可重复性并最大限度地减少出现人为错误的可能性。有关更多详细信息，请参阅 [REL08-BP05 使用自动化功能部署更改](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_tracking_change_management_automated_changemgmt.html)和[自动执行安全、不需要人工介入的部署](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/)。 

 使用[基础设施即代码（IaC）](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)，基础设施预置、编排和部署步骤以编程、描述性和声明性方式定义，并存储在源代码管理系统中。利用基础设施即代码可以更轻松地自动化基础设施部署，并有助于实现基础设施的不可变性。 

 **部署模式** 

 当需要更改工作负载时，不可变基础设施部署策略要求部署一组新的基础设施资源，包括所有必要的更改。这组新资源必须遵循可最大限度地减少对用户影响的推出模式，这一点非常重要。此部署有两种主要策略： 

 [https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/canary-deployments.html](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/canary-deployments.html)：将您的少量客户引导到新版本的做法，它通常在单个服务实例（金丝雀）上运行。然后，您可以深入检查生成的任何行为更改或错误。如果遇到了严重问题，您可以将 Canary 中的流量删除，并将用户发回到以前的版本。如果部署成功，您可以继续以期望的速度进行部署，同时监控更改以便发现错误，直到所有部署完成。AWS CodeDeploy 的[部署配置](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)可以配置为允许金丝雀部署。 

 [https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html)：与金丝雀部署类似，只是会并行部署一整套应用程序。您可以在两个堆栈（蓝和绿）之间轮流部署。同样，您可以将流量发送到新版本中，如果发现部署中存在问题，可以对其进行故障恢复，然后送回旧版本中。通常来说，所有流量会被一次性切换，但您也可以通过 Amazon Route 53 的加权 DNS 路由功能向每个版本发送部分流量，以加快采用新版本的速度。AWS CodeDeploy 和 [AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2020-05-18-ts-deploy.html) 的部署配置可以配置为允许蓝绿部署。 

![Diagram showing blue/green deployment with AWS Elastic Beanstalk and Amazon Route 53](http://docs.aws.amazon.com/zh_cn/wellarchitected/2023-10-03/framework/images/blue-green-deployment.png)


 **偏差检测** 

 *偏差*是指导致基础设施资源的状态或配置不同于预期的任何更改。任何类型非受管配置更改都与不可变基础设施的概念背道而驰，因此应加以检测和修复，以便成功实施不可变基础设施。 

### 实施步骤
<a name="implementation-steps"></a>
+  禁止就地修改正在运行的基础设施资源。 
  +  您可以使用 [AWS Identity and Access Management（IAM）](https://aws.amazon.com/iam/)来指定谁或什么可以访问 AWS 中的服务和资源，集中管理精细权限，并分析访问权限以细化 AWS 中的权限。 
+  自动部署基础设施资源，以提高可重复性并最大限度地减少出现人为错误的可能性。 
  +  正如[《AWS 上的 DevOps 简介》白皮书](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/automation.html)中所述，自动化是 AWS 服务的基石，在所有服务、功能和产品中都受到内部支持。 
  +  *[预先制作](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/prebaking-vs.-bootstrapping-amis.html)*您的亚马逊机器映像（AMI）可以加快启动它们的时间。[EC2 Image Builder](https://aws.amazon.com/image-builder/) 是一项完全托管式 AWS 服务，可协助您自动创建、维护、验证、共享和部署自定义、安全且最新的 Linux 或 Windows 自定义 AMI。 
  +  一些支持自动化的服务包括： 
    +  [AWS Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/) 这项服务可用于在 Apache、NGINX、Passenger 和 IIS 等熟悉的服务器上快速部署和扩展使用 Java、.NET、PHP、Node.js、Python、Ruby、Go 和 Docker 开发的 Web 应用程序。 
    +  [AWS Proton](https://aws.amazon.com/proton/) 让平台团队能够连接和协调开发团队进行基础设施预置、代码部署、监控和更新所需的所有不同工具。AWS Proton 可实现自动化基础设施即代码预置，以及无服务器和基于容器的应用程序的部署。 
  +  利用基础设施即代码可以轻松实现基础设施部署的自动化，并有助于实现基础设施的不可变性。AWS 提供的服务可用于以编程、描述和声明的方式创建、部署和维护基础设施。 
    +  [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 让开发人员能够以有序和可预测的方式创建 AWS 资源。资源使用 JSON 或 YAML 格式写入文本文件。模板需要特定的语法和结构，具体取决于创建和管理的资源类型。您可以使用任何代码编辑器（例如 AWS Cloud9）以 JSON 或 YAML 格式编写资源，将其签入版本控制系统，然后 CloudFormation 会以安全、可重复的方式构建指定的服务。 
    +  [AWS Serverless Application Model（AWS SAM）](https://aws.amazon.com/serverless/sam/)是一个开源框架，可用于在 AWS 上构建无服务器应用程序。AWS SAM 与其他 AWS 服务集成，是 CloudFormation 的扩展。 
    +  [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/) 是一个开源软件开发框架，用于使用熟悉的编程语言对您的云应用程序资源进行建模和预置。您可以使用 AWS CDK 通过 TypeScript、Python、Java 和 .NET 对应用程序基础设施进行建模。AWS CDK 在后台使用 CloudFormation，以安全、可重复的方式提供资源。 
    +  [AWS 云端控制 API](https://aws.amazon.com/cloudcontrolapi/) 引入了一组通用的创建、读取、更新、删除和列出（CRUDL）API，以协助开发人员以简单一致的方式管理其云基础设施。Cloud Control API 通用 API 允许开发人员统一管理 AWS 和第三方服务的生命周期。 
+  实施能够最大限度减少对用户的影响的部署模式。 
  +  金丝雀部署： 
    + [设置 API Gateway 金丝雀版本部署](https://docs.aws.amazon.com/apigateway/latest/developerguide/canary-release.html)
    + [使用 AWS App Mesh 为 Amazon ECS 的金丝雀部署创建管道](https://aws.amazon.com/blogs/containers/create-a-pipeline-with-canary-deployments-for-amazon-ecs-using-aws-app-mesh/)
  +  蓝绿部署：[《AWS 上的蓝绿部署》白皮书](https://docs.aws.amazon.com/whitepapers/latest/blue-green-deployments/welcome.html)描述了实施蓝绿部署策略的[示例技术](https://docs.aws.amazon.com/whitepapers/latest/blue-green-deployments/implementation-techniques.html)。 
+  检测配置或状态偏差。有关更多详细信息，请参阅[检测堆栈和资源的非受管配置更改](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)。 

## 资源
<a name="resources"></a>

 **相关最佳实践：** 
+ [REL08-BP05 使用自动化功能部署更改](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_tracking_change_management_automated_changemgmt.html)

 **相关文档：** 
+ [自动执行安全、不需要人工介入的部署](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/)
+ [利用 AWS CloudFormation 在 Nubank 创建不可变的基础设施](https://aws.amazon.com/blogs/mt/leveraging-immutable-infrastructure-nubank/)
+ [基础设施即代码](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)
+ [实现警报以自动检测 AWS CloudFormation 堆栈中的偏差](https://docs.aws.amazon.com/blogs/mt/implementing-an-alarm-to-automatically-detect-drift-in-aws-cloudformation-stacks/)

 **相关视频：** 
+ [AWS re:Invent 2020：通过不可变性带来的可靠性、一致性和信心](https://www.youtube.com/watch?v=jUSYnRztttY)