REL08-BP04 使用不可变基础设施进行部署 - AWS Well-Architected Framework

REL08-BP04 使用不可变基础设施进行部署

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

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

期望结果:使用不可变基础设施,不允许为了运行工作负载中的基础设施资源而就地修改。相反,当需要更改时,会将一组包含所有必要更改的新基础设施资源与现有资源并行部署。会自动验证此部署,如果成功,流量将逐渐转移到新的资源集。

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

常见的反面模式:

  • 对正在运行的基础设施资源实施就地更改。

建立此最佳实践的好处:

  • 提高跨环境的一致性:由于不同环境的基础设施资源没有差异,因此提高了一致性并简化了测试。

  • 减少配置偏差:通过使用已知且受版本控制的配置替换基础设施资源,可以将基础设施设置为已知、经过测试和可信的状态,从而避免配置偏差。

  • 可靠的原子部署:部署要么成功完成,要么没有任何变化,从而提高部署过程的一致性和可靠性。

  • 简化部署:由于无需支持升级,部署得到简化。升级即意味着新的部署。

  • 采用快速回滚和恢复流程的更安全部署:由于之前运行的版本未发生更改,因此部署变得更安全。您可以在检测到错误时进行回滚。

  • 增强安全状况:通过不允许更改基础设施,可以禁用远程访问机制(例如 SSH)。这样做可以减少攻击向量,改善您的组织的安全状况。

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

实施指导

自动化

在定义不可变基础设施部署策略时,建议尽可能使用自动化,来提高可重复性并最大限度地减少出现人为错误的可能性。有关更多详细信息,请参阅 REL08-BP05 使用自动化功能部署更改自动执行安全、不需要人工介入的部署

使用基础设施即代码(IaC),基础设施预置、编排和部署步骤以编程、描述性和声明性方式定义,并存储在源代码管理系统中。利用基础设施即代码可以更轻松地自动化基础设施部署,并有助于实现基础设施的不可变性。

部署模式

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

金丝雀部署:将您的少量客户引导到新版本的做法,它通常在单个服务实例(金丝雀)上运行。然后,您可以深入检查生成的任何行为更改或错误。如果遇到了严重问题,您可以将 Canary 中的流量删除,并将用户发回到以前的版本。如果部署成功,您可以继续以期望的速度进行部署,同时监控更改以便发现错误,直到所有部署完成。AWS CodeDeploy 的部署配置可以配置为允许金丝雀部署。

蓝绿部署:与金丝雀部署类似,只是会并行部署一整套应用程序。您可以在两个堆栈(蓝和绿)之间轮流部署。同样,您可以将流量发送到新版本中,如果发现部署中存在问题,可以对其进行故障恢复,然后送回旧版本中。通常来说,所有流量会被一次性切换,但您也可以通过 Amazon Route 53 的加权 DNS 路由功能向每个版本发送部分流量,以加快采用新版本的速度。AWS CodeDeploy 和 AWS Elastic Beanstalk 的部署配置可以配置为允许蓝绿部署。

Diagram showing blue/green deployment with AWS Elastic Beanstalk and Amazon Route 53

图 8:使用 AWS Elastic Beanstalk 和 Amazon Route 53 进行蓝绿部署

偏差检测

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

实施步骤

  • 禁止就地修改正在运行的基础设施资源。

  • 自动部署基础设施资源,以提高可重复性并最大限度地减少出现人为错误的可能性。

    • 正如《AWS 上的 DevOps 简介》白皮书中所述,自动化是 AWS 服务的基石,在所有服务、功能和产品中都受到内部支持。

    • 预先制作您的亚马逊机器映像(AMI)可以加快启动它们的时间。EC2 Image Builder 是一项完全托管式 AWS 服务,可协助您自动创建、维护、验证、共享和部署自定义、安全且最新的 Linux 或 Windows 自定义 AMI。

    • 一些支持自动化的服务包括:

      • AWS Elastic Beanstalk 这项服务可用于在 Apache、NGINX、Passenger 和 IIS 等熟悉的服务器上快速部署和扩展使用 Java、.NET、PHP、Node.js、Python、Ruby、Go 和 Docker 开发的 Web 应用程序。

      • AWS Proton 让平台团队能够连接和协调开发团队进行基础设施预置、代码部署、监控和更新所需的所有不同工具。AWS Proton 可实现自动化基础设施即代码预置,以及无服务器和基于容器的应用程序的部署。

    • 利用基础设施即代码可以轻松实现基础设施部署的自动化,并有助于实现基础设施的不可变性。AWS 提供的服务可用于以编程、描述和声明的方式创建、部署和维护基础设施。

      • AWS CloudFormation 让开发人员能够以有序和可预测的方式创建 AWS 资源。资源使用 JSON 或 YAML 格式写入文本文件。模板需要特定的语法和结构,具体取决于创建和管理的资源类型。您可以使用任何代码编辑器(例如 AWS Cloud9)以 JSON 或 YAML 格式编写资源,将其签入版本控制系统,然后 CloudFormation 会以安全、可重复的方式构建指定的服务。

      • AWS Serverless Application Model(AWS SAM)是一个开源框架,可用于在 AWS 上构建无服务器应用程序。AWS SAM 与其他 AWS 服务集成,是 AWS CloudFormation 的扩展。

      • AWS Cloud Development Kit (AWS CDK) 是一个开源软件开发框架,用于使用熟悉的编程语言对您的云应用程序资源进行建模和预置。您可以使用 AWS CDK 通过 TypeScript、Python、Java 和 .NET 对应用程序基础设施进行建模。AWS CDK 在后台使用 AWS CloudFormation,以安全、可重复的方式提供资源。

      • AWS Cloud Control API 引入了一组通用的创建、读取、更新、删除和列出(CRUDL)API,以协助开发人员以简单一致的方式管理其云基础设施。Cloud Control API 通用 API 允许开发人员统一管理 AWS 和第三方服务的生命周期。

  • 实施能够最大限度减少对用户的影响的部署模式。

  • 检测配置或状态偏差。有关更多详细信息,请参阅检测堆栈和资源的非受管配置更改

资源

相关最佳实践:

相关文档:

相关视频: