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