我 10 年的基础设施管理经验告诉我,可以通过以下策略来优化云基础设施的效率和安全性。
译自 5 Hacks Learned by Writing Thousands of Lines of IaC,作者 Eran Bibi。
在几十年的基础设施和云资源配置过程中,我们了解到手动执行这些操作既繁琐又容易出错。这就是从 Chef、Puppet 和 Ansible 等自动化工具发展到 CloudFormation、Terraform 和 Pulumi 等 基础设施即代码 (IaC) 框架的动力。
IaC 一直是提供最佳实践和保障措施的支柱,使工程团队能够像管理软件一样管理现代的复杂基础设施。这种方法将版本控制、同行评审、CI/CD 工具、安全漏洞扫描、不变性和成本预测等熟悉的实践纳入基础设施管理。
IaC 引入了使用带有变量的单个模板来一致地部署环境,从而减少错误并简化操作。这在 灾难恢复场景 中特别有用,能够快速重新部署和从问题中恢复,并且所有内容都经过版本控制和一致管理。
在近十年的基础设施管理中,从编写脚本到 IaC 的出现,我学到了很多经验教训,改变了我对大规模基础设施的思考和管理方式。这些指导实践支持在现代云舰队规模上管理您的 IaC,以提供工程效率和安全性。
以下是我从编写数千行 IaC 代码中学到的五个技巧:
DRY(“不要重复自己”)模式在软件工程中变得非常流行,用于通过 集成开发环境 (IDE) 和 linter 自动化代码质量。这些通过样板文件、模板等强制执行代码策略和格式。对 IaC 采用这种模式有助于通过模块化组件来避免重复代码,从而显着提高可维护性。
随着基础设施规模的扩大,管理具有重复组件的大型代码库变得繁琐且容易出错。通过使用模块,基础设施代码库可以保持干净、有条理和高效,就像应用程序代码库一样。对基础设施配置的更改更加直接,因为对模块的修改会自动反映在使用该模块的任何地方。这将导致更有效的开发周期、更快的部署时间以及在更新期间降低引入错误的风险。
例如,虚拟私有云 (VPC) 模块可以在项目之间重复使用,从而防止每个团队成员创建单独的 VPC。Terraform 模块促进了这一点,简化了 VPC、AWS EC2 实例及其关联资源等共享组件的管理。
DRY 还促进了 IaC 中更好的版本控制和同行评审。每个模块都可以独立版本化,从而可以精确跟踪更改并在出现问题时更容易回滚。同行评审流程得到增强,因为团队成员可以专注于特定模块,从而确保更高的质量并遵守最佳实践。这种模块化方法还有助于协作,因为开发人员可以同时处理不同的模块,而不会干扰彼此的工作。
IaC 工具的一个共同特征是它们附带的注册表。这些注册表是中央组件存储库,您可以在其中查找、共享和发布社区可以利用的模块和包。
这些包括从 AWS、Microsoft Azure 和 Google Cloud 等云提供商最常见的模块,到自定义模块和特定于工具的组件。几乎所有现代 IaC 平台,包括 Terraform、Pulumi、CloudFormation,甚至 Kubernetes 生态系统中的 Helm,都提供与其平台无缝协作的专用注册表。
例如,Terraform Registry 拥有海量预构建模块,可以加速开发过程。这些模块封装了可重复使用的基础设施组件,从设置 VPC 等简单配置到涉及多个互连资源的复杂部署,应有尽有。这些模块已经过其他用户的测试和验证,为构建基础设施提供了可靠的基础,而无需从头开始。
通过使用预构建模块,团队可以快速实施符合最佳实践并针对性能和安全性进行优化的基础设施组件。这不仅减少了部署基础设施所需的时间和精力,还有助于确保不同环境之间的一致性。
但是,在使用之前,必须扫描所有公共模块是否存在漏洞和配置错误,以防止在模块包含恶意代码或意外配置错误时引入安全问题。例如,创建身份和访问管理(IAM)角色的模块可能会无意中授予过多权限,导致未经授权的访问。
因此,必须对从 IaC 注册表获取的任何模块进行全面的安全审查和漏洞扫描,以降低这些风险。
保持一致性对于有效管理大规模基础设施至关重要。一致的命名约定和实践不仅使代码库更易于理解和维护,而且还有助于团队成员之间的协作。这是因为随着基础设施的增长,保持代码库的清晰度和组织性变得越来越重要。
对资源、模块和变量采用标准化命名约定有助于团队成员理解每个组件的用途和范围,从而促进更轻松的维护和协作。这种一致性减少了混乱和错误,使新团队成员更容易上手,现有成员更容易管理和更新基础设施。
使用一致的命名约定还可以定义更好的流程和实践来跟踪更改和 IaC 代码库的演变。例如,实施命名约定可以更轻松地记录系统及其更改、自动化 linter 和验证器、执行有效的代码审查、模块化以及维护一致的目录结构和资源标记。
实施命名约定和良好实践有助于团队维护干净、有序且易于理解的基础设施代码库。这种一致性增强了协作,减少了错误,并使基础设施更具可扩展性,并且随着其增长更易于管理。
当开源 Terraform 分支 OpenTofu 决定包含状态文件加密 时,它引起了人们对 Terraform 社区长期以来提出的这一功能请求的关注(代码贡献可以追溯到 2016 年)。
正确管理 Terraform 状态文件是 IaC 最佳实践的一个关键方面。状态文件表示基础设施的当前状态,对于跟踪和应用更改至关重要。正确的管理可确保一致性,防止数据损坏并支持协作工作流程。
管理状态文件的重要性怎么强调都不为过。集中式状态管理允许多个开发人员在同一个基础设施上工作而不会发生冲突,并且正确的状态管理通过提供基础设施的共享、最新视图来支持协作。
使用确保状态文件一致且未损坏的方法可以防止由于并发修改、手动编辑和数据损坏而引起的问题,从而维护基础设施的完整性。正确的状态管理包括定期备份和版本控制,以便在意外删除、损坏或其他灾难发生时能够快速恢复,并将停机时间和数据丢失降至最低。
虽然状态管理的具体实现细节和工具因 IaC 平台而异,但以下维护一致、可靠和最新的 Terraform 或 OpenTofu 基础设施状态的基本原则普遍重要。这可确保基础设施保持稳健、可扩展并与定义的配置保持一致。
- 使用远程状态存储:不要将状态文件存储在本地,而是使用远程存储解决方案,例如 AWS S3、Google Cloud Storage 或 Azure Blob Storage。远程存储可以集中存储状态文件,使其可供所有团队成员和 CI/CD 管道访问。这种方法可确保每个人都使用相同的状态,防止冲突和不一致。
- 实现锁定机制:为防止并发修改,请使用锁定机制。例如,AWS DynamoDB 可以在更新期间锁定状态文件。锁定可确保一次只有一个进程可以修改状态,从而防止出现竞争条件和数据损坏。
- 避免手动编辑:尽管状态文件是人类可读的,但手动编辑可能会导致损坏。始终使用 Terraform 命令对状态文件进行任何更改。这种做法可以维护文件的完整性,并确保正确应用更改。
- 定期备份和版本控制:定期备份状态文件以防止数据丢失。对存储桶启用版本控制,以自动保留状态文件的先前版本。这样可以在意外删除或损坏的情况下轻松恢复。
- 保护状态文件:确保状态文件已加密,并且访问权限仅限于授权用户和服务。加密状态文件可以保护敏感信息(例如访问密钥和凭据)免遭未经授权的访问。实施严格的访问控制,以限制可以读取和修改状态文件的人员。
通过遵循这些高级最佳实践,组织可以有效地管理 Terraform 状态文件,确保其基础设施的一致性、安全性和可用性。正确的状态管理支持稳健且可扩展的基础设施部署,促进协作并增强整体基础设施完整性。
利用数据源是 IaC 管理中一项强大的策略。数据源允许 IaC 配置从云提供商和 API 动态查询和检索信息,从而增强基础设施的灵活性、适应性和可维护性。这种方法最大限度地减少了硬编码值,例如 Amazon Machine Image (AMI) ID 或网络配置;确保基础设施始终使用最新、最准确的数据,从而减少错误并简化更新,使代码库更易于管理。
无论您使用的是 Terraform、Pulumi、AWS CloudFormation 还是 Azure 资源管理器,结合使用数据源都有助于创建更动态、可重复使用的配置。您可以使这些配置适应各种环境而无需修改,从而保持一致性并推广最佳实践。例如,查询最新的虚拟机 (VM) 映像或网络 ID 可以使配置与最少的干预保持最新状态,从而无缝地支持开发和生产环境。
此外,使用数据源有助于缓解基础设施漂移,这是 IaC 中的一个常见挑战。当基础设施的实际状态与其在 IaC 配置中定义的状态不同时,就会发生漂移,从而导致不一致和潜在的安全风险。
通过 CI/CD 管道中的工具和集成检查定期进行漂移检测,有助于及时识别和纠正任何更改,以维护基础设施的完整性和可靠性。这种通过数据源进行 IaC 管理的通用方法有助于确保跨平台和工具的部署一致性和安全性。
IaC 管理改变了大规模云运营。从手动配置到利用 Terraform、Pulumi 和 CloudFormation 等高级 IaC 工具的历程,改变了现代基础设施的管理方式。大规模管理 IaC 的经验表明,采用最佳实践(例如遵循 DRY 模式、使用注册表、保持一致性、正确管理状态文件和利用数据源)有助于工程团队实现更高的效率、安全性和可扩展性。
这些实践使工程团队能够有效地管理复杂的基础设施、简化运营并增强其部署的整体稳健性。这些从编写数千行 IaC 代码中汲取的经验教训为构建弹性、可扩展和安全的云环境奠定了基础。最终,它们使组织能够更高效地运营,更迅速地响应变化、事件和停机时间,并更快地恢复关键数字服务。