超越高级基础设施即代码的应用案例

超越高级基础设施即代码的应用案例

除了基础的基础设施即代码知识外,你可能希望更深入地了解某些方面。本节涵盖了其中许多内容。

翻译自 Going Beyond with Advanced Infrastructure as Code Use Cases

图片来自 Shutterstock 的 Danny

这是一个由三部分组成的系列的第三部分。请阅读第一部分第二部分

使用 Pulumi 对基础设施即代码进行现代化改造,可以获得两类优势:1

  1. 使用基础设施即代码开发云基础设施。
  2. Pulumi Cloud,能够在规模化的情况下管理云基础设施。

我们已经在上面详细介绍了第一类优势,但对于第二类优势还未深入探讨。

许多基础设施即代码的解决方案要求你明确地管理所谓的“状态”。这个状态是一个产物,用于跟踪你通过基础设施即代码定义的基础设施样式,以便可以轻松地将其与实际基础设施进行比较。这是实现差异和更新的方法。每个基础设施即代码工具都会存储这个基础设施状态,实际上它只是关于所有云资源、属性和依赖关系的元数据。然而,工具将其暴露给你的程度各不相同。

像 AWS CloudFormation 和 Azure Resource Manager(ARM) 这样的托管服务会将这个状态抽象到服务后面。而其他工具如 Terraform 则要求你手动管理这个状态,通常将其存储在你选择的云上的 S3 存储桶或等效物中。托管服务的方法往往更容易使用,还可以避免常见的问题,包括安全问题(比如意外地将机密信息明文提交到 Terraform 状态文件中)以及可靠性问题(比如代码合并出错导致基础设施崩溃)。Pulumi Cloud 提供了这两种选项,但默认情况下是像托管服务一样使用它。

Pulumi Cloud 可以无限免费使用,团队可以使用免费版,并为更大的团队和企业提供高级版本。Pulumi 的 SDK 是完全开源的,可以在不使用该服务的情况下使用(在此阅读更多详情),但是云服务是使用 Pulumi Cloud 最简单、最安全和最可靠的方式。

Pulumi Cloud 的架构允许您的云凭证保留在您的客户端。当与身份集成和秘密管理等功能结合使用时,可以解决许多紧迫的安全问题,并且使用该服务甚至可能比自行管理基础设施即代码状态更安全。

该服务可以与您选择的身份提供者集成,如 GitHub、GitLab、Atlassian、Okta、Azure ActiveDirectory 或任何 SAML/SSO Provider,并提供完整的视觉历史记录,显示谁在何时更改了哪些基础设施,非常类似于 GitHub 对代码提交的提供。它还可以更轻松地查看和控制团队中正在进行的工作,通过组织、基于角色的访问控制和策略强制执行。它通过 Web 钩子实现丰富的工作流程,并使用户能够通过单击按钮或直接从 git 仓库部署。

您可以通过阅读这个概述页面来更好地了解 Pulumi Cloud 提供的功能。尽管 Pulumi Cloud 得到许多全球 2000 家公司的信任,定期由外部公司进行审计,以进行良好架构和安全最佳实践的验证,并且符合 SOC 2 Type II 标准,但也提供了一个自托管版,可以在任何地方运行

测试您的基础设施即代码

使用通用编程语言的好处是我们可以测试我们的代码。大多数人在不测试应用程序代码的情况下不会考虑编写应用程序代码,基础设施即代码也不例外。不仅仅是我们可以测试它,而且我们可以使用标准的工具和实践。

测试可以采用许多不同的形式,包括单元测试、属性测试和集成测试。下表总结了这三种方法之间的区别:

首先是基本的单元测试,由于使用常规编程语言,可以以通常的方式进行。例如,内置的 Python 和 Go 测试框架“正常工作”,流行的第三方框架如 Mocha(用于JavaScript)、NUnit(用于.NET)、JUnit(用于Java)也是如此。这可以很好地确保例如计算 CIDR 块的函数是正确的。测试基础设施本身要更复杂一些,仅因为在部署完成之前很多资源的属性是未知的。但是,当与 Pulumi Cloud 的基础设施模拟框架结合使用时,可以测试基础设施拓扑和属性。在这里阅读更多信息。

接下来是断言。这背后的思想是在实际程序中嵌入断言,以便立即捕获意外情况。这可以与任何程序状态相关联,包括资源本身。在这里阅读更多关于断言的信息

接下来是集成测试。对于基础设施即代码,集成测试的典型含义是为了测试目的而单独启动一个堆栈,通常称为“临时堆栈”。由于 Pulumi Cloud 可以轻松地创建独立、隔离的基础设施副本,这些工作流程非常容易实现,这些副本可以与您的典型测试流程集成,无论是手动运行还是作为 CI/CD 流程的一部分自动运行。通常会创建一个与单个拉取请求关联的临时堆栈,以验证所提议的更改是否正确:在打开拉取请求时创建(和测试)它,在对其进行新推送时更新(和测试)它,并在关闭时销毁它。您可以在这里阅读有关集成测试和临时堆栈技术的更多信息

最后,还有许多更特别的测试可能。例如,您可以通过添加随机性来对基础设施即代码进行模糊测试,以确保在面对奇怪的输入时基础设施的行为是否正确。您可以通过禁用实例或将关键服务的扩展降低到通常的阈值以下来对基础设施进行混乱测试,以了解应用程序的行为方式。您可以通过对基础设施施加不合理的需求来进行压力测试,看看会出现什么问题。这里的可能性是无限的,但是通过在通用编程语言中使用基础设施即代码,您拥有比通常可用的工具更多的工具。

要了解更多关于测试基础设施即代码的信息,以及具体的代码示例,请参阅“ Pulumi 程序的自动化测试”用户指南。

通过策略即代码来强制执行安全性、合规性、成本等

与基础设施即代码和测试相邻的方法是所谓的策略即代码。与基础设施即代码一样,这个想法是在一个实际的代码工件中编码定义。区别在于这些是用于分析和标记基础设施问题的策略。然而,以代码方式表达这些策略的好处与基础设施即代码非常相似:您可以随着需求的变化随时间对策略进行版本控制,团队可以审核它,而且它更加富有表现力。

这些策略可以涵盖可以分析和检查的任何内容。这通常包括安全性(例如确保数据库不对外开放)、合规性(只使用 FIPS 端点用于政府关键基础设施)、成本(即将要部署的部署不超过团队的预算)和最佳实践(根据团队的约定为所有资源打上标签)。这个想法类似于 linter 和静态分析,两者都可以用于通用编程语言编写的基础设施即代码,只是针对基础设施分析进行了特定的构建。

正如 Pulumi Cloud 允许您使用通用编程语言进行基础设施即代码,它也允许您在策略即代码方面使用通用编程语言。这受益于这些语言的丰富性,并且可以实现高级用例,如与成本管理或类似 ServiceNow 的工单系统集成以强制执行 IT 策略。Pulumi Cloud 还支持 Open Policy Agent(OPA) 语言 Rego,以便更轻松地利用现有策略。

如果我们违反策略,我们会在错误(强制检查)或警告(咨询性)之前立即得到通知,甚至在错误进入生产之前:

从工程师的角度来看,这可能有些“无聊”,但对于组织来说非常重要,尤其是对于正在构建平台团队的人来说。

使用 Pulumi Cloud 的好处是,您可以在整个组织中管理和强制执行策略,而无需个别工程师甚至知道如何运行它们。有关策略即代码的更多信息,请参阅 Pulumi 的策略即代码 CrossGuard 用户指南

持续部署您的基础设施即代码

大多数工程团队都通过 CI/CD 系统(如 GitHub Actions、Atlassian BitBucket、GitLab Pipelines、CircleCI、Travis、TeamCity、Spinnaker 或内置云 CI/CD 服务,如 AWS CodePipeline、Azure DevOps 或 Google CloudBuild)持续部署其应用程序。这解锁了强大的 git 驱动的工作流,可以将代码推送到生产环境,而无需手动部署。但许多团队尚未在基础设施方面采取这种方法。

采用基础设施即代码可以帮助您做两件事情。首先,您可以通过推送和审核代码来验证和发布基础设施更改,就像您发布应用程序更改一样,这是我们已经评估为基础设施即代码的核心优势。其次,您可以将应用程序和基础设施交付流程进行协调,使它们不再如此分散和不连贯。这有助于更快地交付,同时在软件取得更多成功后,扩展到更多复杂的环境。

容器、无服务器和托管服务的转变使“应用程序代码”和“基础设施代码”的界限变得模糊。无服务器功能在基础设施线和应用程序线之间,是应用还是基础设施?容器 registry 呢?发布/订阅主题呢?通过使用完全不同的工具和交付流程来处理应用程序与基础设施,这在大多数基础设施工具中历来如此,我们引入了一个错误的二分法,这会减慢团队的速度。

Pulumi Cloud 为自动化基础设施交付提供了两种解决方案:首先,上述任何一个 CI/CD 系统都可以用来交付应用程序代码,同时也可以交付您的基础设施即代码。其次,Pulumi Cloud 提供了一个名为“Pulumi 部署”的内置系统,以便您可以开始并根据 git 工作流触发部署。在 Pulumi Deployments 和/或持续交付用户指南中阅读更多信息。

使用自动化 API 进行高级 IaC 自动化

如果基础设施即代码是您所选择的语言中的一个普通库,而不是一个命令行工具,会怎么样?在创建自动化 API 之前,这就是我们提出的问题。为什么这是一个有趣的问题?这很有趣,因为它将基础设施即代码提升到任何更大的软件核心功能,可以自动化,而不仅仅是一个需要人工手动运行的工具。如上所述,将 Pulumi Cloud 放入您的 CI/CD 中是朝这个目标迈出的一小步,但自动化 API 将其提升到了一个全新的层次。

这个 API 可以解锁的场景在前面提到过 - 定制工具和库、内部基础设施配置门户,甚至是整个 SaaS 产品 - 所有这些都需要基础设施即代码作为核心能力。实际上,您喜欢的一些 SaaS 产品,甚至那些可以使用 Pulumi 进行管理的产品,都在后台使用 Pulumi 来在云和集群之间提供和管理基础设施。

有趣的是,我们发现平均而言,相对于传统的基础设施即代码用例,利用自动化 API 的人能够管理 10 倍以上的基础设施。这是一个重要的问题,也是自动化的目标:在更少的情况下实现更多的工作,减少手动劳动,以及更有信心地更快地交付。

Pulumi 使用通用编程语言的方法使自动化 API 成为基础设施即代码进入新领域的一种自然而独特的扩展。有关自动化 API 的更多信息,请查看这个页面,其中描述了一些常见的场景,包括完整的示例。

检测IaC漂移并采取措施

使用任何基础设施即代码工具的一个问题是所谓的“漂移”:当有人在基础设施即代码工具之外手动更改您的基础设施时,就会发生漂移。在这种情况下,实际的基础设施已经“漂移”出了根据您的基础设施即代码定义应该是什么样的状态。检测漂移是一回事,纠正它是另一回事。

举一个具体的例子,想象团队中的一名工程师正在对生产环境中的问题进行调试。为了做到这一点,他们打开了 22 号端口,以便能够 SSH 到 Bastion 主机中(也许还有更好的方法,但是正如我们所知,在发生实际问题时,速度很重要,有时会采取捷径)。不幸的是,在解决问题后,工程师忘记了删除 22 号端口的访问权限。这可能会带来潜在的安全风险,我们希望能够捕捉并解决。

对于漂移,通常有两种可能的纠正方法:1)重新应用基础设施即代码,从而消除漂移,在这种情况下关闭 22 号端口的访问权限;2)将基础设施更改合并到我们的程序中,以便漂移状态成为我们前进的最后已知状态。有时,将不同的环境进行比较,以查看其中的基础设施是否发生了漂移,这也是有趣的,尽管由于 Pulumi 的项目和堆栈模型,这在实践中是不常见的。对于每个堆栈配置来说,这更是一个关注点,对于这一点,Pulumi Cloud 提供了检测和解决的功能。

Pulumi Cloud 的刷新命令可用于检测漂移,然后您可以决定如何纠正它。通过刷新、自动化 API 以及 Pulumi Deployments 功能的组合,您可以根据需要或按计划检测和纠正漂移。在这里阅读更多关于漂移检测和纠正的信息,或者在这里观看视频

了解更多关于基础设施即代码的信息

Pulumi 入门指南是了解基础设施即代码最简单的方法。除此之外,还有 Pulumi 模板和示例等资源:

教程系列“基础设施即代码推荐实践”是一个关于在基础设施即代码旅程中可能会遇到的许多问题的综合概述。这包括如何组织项目代码和堆栈、如何在本地开发和测试代码、如何随着需求变化演化这些结构、自动化场景等等。

Pulumi Learn 系列是一个漫游特定基础设施即代码主题的系列,例如更深入地研究基本概念、如何使用抽象和封装简化您的基础设施项目等。

我们希望本文为您提供了一个对核心基础设施即代码概念的良好理解,无论您选择哪个工具,以及展示了 Pulumi Cloud 通过使用通用和流行的编程语言所提供的一些独特优势。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注