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

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

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

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

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

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

常见反模式:

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

建立此最佳实践的好处:

  • 提高环境间的一致性:由于环境间的基础设施资源没有差异,可以提高一致性并简化测试。

  • 减小配置偏差:通过使用已知且版本受控的配置替换基础设施资源,基础设施被设置为已知经过测试的可信状态,避免配置偏差。

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

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

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

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

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

实施指导

自动化

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

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

部署模式

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

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

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

图中显示了使用 AWS Elastic Beanstalk 和 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 格式写入文本文件。模板需要特定的语法和结构,具体取决于创建和管理的资源类型。可以使用任何代码编辑器以 JSON 或 YAML 格式创作资源,将其签入版本控制系统,然后 AWS 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 和第三方服务的生命周期。

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

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

资源

相关最佳实践:

相关文档:

相关视频: