REL08-BP04 使用不可变基础设施进行部署
不可变基础设施模式要求在生产工作负载上不会出现就地更新、安全补丁或配置更改。需要更改时,会在新的基础设施上构建架构,并将其部署到生产环境中。
遵循不可变基础设施部署策略,以提高工作负载部署的可靠性、一致性和可重复性。
期望结果:使用不可变基础设施,不允许为了运行工作负载中的基础设施资源而就地修改。相反,当需要更改时,会将一组包含所有必要更改的新基础设施资源与现有资源并行部署。会自动验证此部署,如果成功,流量将逐渐转移到新的资源集。
此部署策略适用于软件更新、安全补丁、基础设施更改、配置更新和应用程序更新等。
常见的反面模式:
-
对正在运行的基础设施资源实施就地更改。
建立此最佳实践的好处:
-
提高跨环境的一致性:由于不同环境的基础设施资源没有差异,因此提高了一致性并简化了测试。
-
减少配置偏差:通过使用已知且受版本控制的配置替换基础设施资源,可以将基础设施设置为已知、经过测试和可信的状态,从而避免配置偏差。
-
可靠的原子部署:部署要么成功完成,要么没有任何变化,从而提高部署过程的一致性和可靠性。
-
简化部署:由于无需支持升级,部署得到简化。升级即意味着新的部署。
-
采用快速回滚和恢复流程的更安全部署:由于之前运行的版本未发生更改,因此部署变得更安全。您可以在检测到错误时进行回滚。
-
增强安全状况:通过不允许更改基础设施,可以禁用远程访问机制(例如 SSH)。这样做可以减少攻击向量,改善您的组织的安全状况。
在未建立这种最佳实践的情况下暴露的风险等级:中等
实施指导
自动化
在定义不可变基础设施部署策略时,建议尽可能使用自动化
使用基础设施即代码(IaC),基础设施预置、编排和部署步骤以编程、描述性和声明性方式定义,并存储在源代码管理系统中。利用基础设施即代码可以更轻松地自动化基础设施部署,并有助于实现基础设施的不可变性。
部署模式
当需要更改工作负载时,不可变基础设施部署策略要求部署一组新的基础设施资源,包括所有必要的更改。这组新资源必须遵循可最大限度地减少对用户影响的推出模式,这一点非常重要。此部署有两种主要策略:
金丝雀部署:将您的少量客户引导到新版本的做法,它通常在单个服务实例(金丝雀)上运行。然后,您可以深入检查生成的任何行为更改或错误。如果遇到了严重问题,您可以将 Canary 中的流量删除,并将用户发回到以前的版本。如果部署成功,您可以继续以期望的速度进行部署,同时监控更改以便发现错误,直到所有部署完成。AWS CodeDeploy 的部署配置可以配置为允许金丝雀部署。
蓝绿部署:与金丝雀部署类似,只是会并行部署一整套应用程序。您可以在两个堆栈(蓝和绿)之间轮流部署。同样,您可以将流量发送到新版本中,如果发现部署中存在问题,可以对其进行故障恢复,然后送回旧版本中。通常来说,所有流量会被一次性切换,但您也可以通过 Amazon Route 53 的加权 DNS 路由功能向每个版本发送部分流量,以加快采用新版本的速度。AWS CodeDeploy 和 AWS Elastic Beanstalk 的部署配置可以配置为允许蓝绿部署。
图 8:使用 AWS Elastic Beanstalk 和 Amazon Route 53 进行蓝绿部署
偏差检测
偏差是指导致基础设施资源的状态或配置不同于预期的任何更改。任何类型非受管配置更改都与不可变基础设施的概念背道而驰,因此应加以检测和修复,以便成功实施不可变基础设施。
实施步骤
-
禁止就地修改正在运行的基础设施资源。
-
您可以使用 AWS Identity and Access Management(IAM)
来指定谁或什么可以访问 AWS 中的服务和资源,集中管理精细权限,并分析访问权限以细化 AWS 中的权限。
-
-
自动部署基础设施资源,以提高可重复性并最大限度地减少出现人为错误的可能性。
-
正如《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 服务集成,是 CloudFormation 的扩展。 -
AWS Cloud Development Kit (AWS CDK)
是一个开源软件开发框架,用于使用熟悉的编程语言对您的云应用程序资源进行建模和预置。您可以使用 AWS CDK 通过 TypeScript、Python、Java 和 .NET 对应用程序基础设施进行建模。AWS CDK 在后台使用 CloudFormation,以安全、可重复的方式提供资源。 -
AWS 云端控制 API
引入了一组通用的创建、读取、更新、删除和列出(CRUDL)API,以协助开发人员以简单一致的方式管理其云基础设施。Cloud Control API 通用 API 允许开发人员统一管理 AWS 和第三方服务的生命周期。
-
-
-
实施能够最大限度减少对用户的影响的部署模式。
-
金丝雀部署:
-
蓝绿部署:《AWS 上的蓝绿部署》白皮书描述了实施蓝绿部署策略的示例技术。
-
-
检测配置或状态偏差。有关更多详细信息,请参阅检测堆栈和资源的非受管配置更改。
资源
相关最佳实践:
相关文档:
相关视频: