基础设施即代码 (IaC) 是一个自动化云资源供应和管理的过程。IaC 软件采用一些描述所需状态的输入脚本,然后通常通过 API 与云供应商进行通信,以使现实与所需状态相匹配。本文将涵盖 IaC 的重要方面,首先是它是如何产生的(即它解决了哪些问题),然后是它的好处,最后是如何将 IaC 集成到您的组织中。
对 IaC 的需求
曾几何时,当企业想要运行软件时,唯一的选择是从网络提供商处订购一些物理设备和互联网接入。这些是现场数据中心,公司必须根据预期流量提前数周甚至数月订购服务器和网络设备,然后在现场手动配置。这需要一个带有冷却系统的物理位置和无数小时来执行安装和维护操作。但是后来,出现了可以管理其他企业服务器的公共数据中心。
运营数据中心本身成为一项可行的业务,为客户带来巨大优势:
- 无需专用且昂贵的服务器机房
- 通用服务器和网络项目的交货时间可能会缩短
- 由数据中心提供商处理的服务器/设备的物理管理
- 释放宝贵的资源
虚拟化的出现带来了另一种演变:云。在公共(或私有)云中,物理设备位于云供应商的数据中心,仍然需要人工处理。虚拟服务器可通过 Web 界面供企业使用,使他们能够在几秒钟内(或最大资源的几分钟内)配置服务器和其他资源。在这个阶段,虽然虚拟化允许非常快速的配置,但大多数操作仍然是手动的。
IaC 概念和工具的出现带来了最终的发展。一旦可以通过 API 访问云,资源的配置和管理就可以由脚本和自动化工具而不是人工来处理。所以现在,一旦安装并连接了物理设备(仍然是手动操作),其他一切都可以自动化,包括所有虚拟硬件资源的配置。
以编程方式访问公共云的能力促成了 IaC 的兴起。在 IaC 出现之前,系统工程师必须手动通过 Web 界面来供应和配置资源。使用 IaC,资源的供应和配置在脚本中描述,这些脚本由与公共云 API 通信的工具读取,以确保现实与所需状态相匹配。
IaC 的好处
如上所述,IaC 工具使用来自脚本的输入;这些脚本由人类编写,描述了给定云资源的理想状态。这些工具通过其 API 与云供应商通信以创建、更新或删除资源,以便现实与输入脚本中描述的所需状态相匹配。与手动供应和配置相比,IaC 提供了单一的真实来源(输入脚本),从而消除了大多数人为错误。
运行 IaC 脚本是一个可重复的操作,每次都会产生完全相同的结果。这可以在很多方面提供帮助,例如:
- 在不同位置和/或为不同项目部署相同的工作负载
- 创建单独但相同(或接近相同)的环境(暂存、生产、测试??等)
- 通过从 IaC 脚本和生产环境的最后备份快速创建一个新的、相同的环境来执行灾难恢复
IaC 脚本可以保存在 git 存储库中,为您提供基础架构的历史记录。作为额外的好处,由于脚本只是文本,因此可以比较版本以查看已添加、更改或删除的内容。
另一个好处是 IaC 允许初级系统管理员或非技术人员在没有技术知识的情况下创建整个工作负载。如果您正确配置您的云帐户,您甚至可以允许具有有限权限的用户通过 IaC 工具创建这样的工作负载,即使该用户没有直接创建资源的权限。您还可以利用额外的工具和模板来确保更早地实施安全策略,以限制实例化 IaC 堆栈的任何人造成安全漏洞和错误配置的可能性。
除了精确的可重复性之外,IaC 相对于手动操作的最大优势之一是它的可扩展性。事实上,您只需编写一次 IaC 脚本,然后工作负载就可以随心所欲地实例化,几乎是即时的。最后,通过花更多时间在 IaC 脚本中设计正确的权限,可以避免手动工作向角色和资源授予过多权限的典型缺点。
如何开始
通常,您希望将当前手动执行的一些操作自动化。因此,第一步是记录构建工作负载所需基础架构所需的手动步骤。这些是您将通过 IaC 自动化的步骤。
然后你需要选择一个 IaC 软件。这应该不是一个困难的选择,因为只有少数几个,而且三大云提供商都有自己的:Amazon Web Services 提供CloudFormation,Microsoft Azure 提供Azure Resource Manager,Google Cloud Platform 提供Google Cloud Deployment Manager。与供应商无关的最著名的选项是Terraform,它不仅支持上述三个云供应商,而且支持更多云供应商。
接下来,您需要为您选择的 IaC 工具编写一些脚本,以重现您记录的手动步骤。在进行过程中测试这些通常是个好主意。换句话说:编写一些 IaC 代码,部署它,测试它,当你满意它看起来不错时,继续下一段代码。如果一次性编写所有内容,代码中可能会出现重大缺陷,只有在工作数小时后才会发现,这意味着您可能不得不重写脚本的很大一部分。
左移
此外,Shift Left 的话题也持续上热搜。这实质上意味着您尽早开始测试并专注于预防问题(而不是在问题发生后检测和解决)。这个想法是整体质量和安全性将因此提高。
理想情况下,这种左移应该尽可能地利用自动化。事实上,有多种工具可用于自动化编写 IaC 脚本的某些方面,例如安全性和合规性。这些工具会在任何部署之前扫描代码,以减少错误配置、过于宽松的设置和已知漏洞等问题的发生。此处提供了一些与此相关的用例供您细读。
需要一个集中的团队
为了正确使用 IaC,编写 IaC 脚本的人必须对所使用的云平台有深入的了解。因此,建议确保您的 IaC 工作中最关键的部分由高级 DevOps 工程师完成。
拥有一支(或至少一名)高级 DevOps 工程师团队负责领导您的 IaC 工作通常是个好主意。该团队将能够专注于最佳实践和安全性,从而为更多初级工程师提供可遵循的蓝图。它还将能够编写可在组织内跨 IaC 脚本重复使用的通用模块,为更多初级工程师提供易于使用的预先审查的构建块。
如果严格的安全性很重要,并且很可能这个团队也可以负责审查公开可用的模块和软件。在网上很容易找到一些 IaC 模块;Terraform 甚至拥有这些的官方存储库。但是,此类公开可用的模块可能不符合您的组织或项目中应用的安全标准。因此,确保您的 IaC 团队只使用经过审查的模块非常重要。
此外,让您的 SecOps 团队与您的 DevOps 团队一起工作是个好主意。这种合作将使 DevOps 流程在项目早期的安全性方面得到优化。生产部署后检测到的错误可能代价高昂,尤其是在客户关系方面。在过程的早期确保高质量将大大有助于避免任何此类灾难。
结论
虽然 IaC 是最近才发展起来的,但现在 IaC 应该成为任何需要云资源的组织的配置策略的重要组成部分,并且至少应该对其进行评估以包含在您的团队中。无论您的组织规模如何,您很可能希望 IaC 至少管理您的部分工作负载。