基础架构即代码(IaC)意味着使用代码来定义和管理基础架构,而不是使用手动流程。更重要的是,IaC是将软件工程原理和方法引入到云基础设施中。本文将探讨IaC的基础知识以及如何设置相关环境。IaC简介在IaC之前,基础设施是(在某些情况下仍然是)通过简单的操作用户界面、批处理脚本和配置管理工具提供的,这些不适合今天的云计算。同样,很多所谓的IaC其实在很大程度上更接近于“infrastructureastext”。作为以结构化文本编写的基础设施,它是可重复的和版本控制的。但是,在实施需要与应用程序代码一起使用的软件工程时,它就显得不足了。例如,不支持标准开发工具、测试框架或包管理。真正的IaC解决方案需要使用专为云端基础架构设计的平台,以便可以应用标准的软件工程实践和工具。为什么IaC很重要?IaC之所以重要,主要有以下三个原因:第一,企业现在正在全面上云。越来越多的工作负载正在从本地数据中心转移到云端,而且这种趋势将继续下去。然而,云计算本身并不是确保和维护可靠且可扩展的基础架构的灵丹妙药。与物理数据中心一样,云基础设施可能具有不一致、记录不当的脚本集等。因为IaC是关于执行经过验证的工程实施步骤,所以可以从混乱中恢复秩序。其次,公众使用云的方式更加复杂。企业用户试图改变设施、模型和工作方式来提高盈利能力。IaC不仅仅是简单的资本支出与运营支出,它是关于如何集成构成工程生命周期的所有元素,例如版本控制和测试,以释放云可以提供的所有价值。它可以利用工程实践充分挖掘云计算的潜力,更好更快地推动创新来推动业务发展。第三,管理云上基础设施的负荷不断增加。可用的云服务种类每年都在增加,越来越多的公司正在采用现代云基础设施(例如容器或无服务器设施)。这些设施通常包含许多松散耦合和相互依赖的组件,导致工程师必须管理的云资源数量惊人地增长。这当然是一件好事,因为这意味着业务用户正在从云中获得更多,推动业务增长,但结果是云资源的复杂性和规模不断增加。例如,从云中获益的方法之一是利用云提供商提供的越来越多的服务。这些服务可以推动创新并加速业务进步。但与此同时,每一项新服务都会带来新的API,这增加了基础架构的复杂性。随着云资源规模和复杂性的增加,需要一种现代的IaC方法。它帮助工程师构建、部署和管理基础设施。如果一个工程师管理1到10个资源,简单的点击可能就可以了;当管理10到100个资源时,基础设施即文本或遗留IaC工具可能仍然可以完成这项工作。但是一旦资源数量达到数百或数千会怎样?这在今天并不少见!最重要的是,这数千种资源不是每月更新一次,而是每天更新多次。管理所有这些的最佳方法是采用与应用程序代码相同的软件工程实践和工具。考虑以下问题:(1)我如何确保我的基础设施能够快速扩展、改变和发展以支持业务并创造竞争优势?(2)您如何保持对云基础架构及其任何更改的可见性?(3)如何制定策略和数据护栏来保证安全可靠?(4)我如何才能最科学地授权我的团队通过更好的协作和流程来构建、部署和管理基础设施?解决上述问题需要现代IaC方法。现代IaC方法是释放云计算全部潜力的方法。使用IaC的重要注意事项IaC平台的选择至关重要。如果用户打算使用现有的标准软件工程工具和操作,在选择时应注意以下特点:1、标准语言对标准语言的良好支持意味着开发者可以方便地使用相同的应用代码语言使用TypeScript、Go、Python和C#等通用语言定义和配置基础设施。许多遗留IaC工具使用它们自己的领域特定语言(DSL),这可能会导致问题,因为开发人员经常发现缺少通用的编程工具。在选择的平台上,工程师应该能够轻松地创建强类型、便利的配置并使用他们已经开始依赖的特性,例如循环、常量和函数。而且,使用标准语言的另一个好处是开发人员已经熟悉它,他们可以立即开始编码。如果你需要学习DSL的特性和局限性,那可能是一件耗时且令人沮丧的事情。2、标准的开发工具使用标准的编程语言意味着开发者也可以使用标准的开发工具,比如IDE。一个优势仍然是熟悉,开发人员可以在他们习惯的环境中工作;另一个是开发人员可以在一个他们可以轻松编写、调试、测试和部署代码的环境中表现出色。3.测试框架与应用程序一样,彻底测试您的基础架构很重要。合格的IaC平台应该支持标准测试框架,还应该能够帮助团队扩展他们执行的测试类型。标准操作测试侧重于验收测试。这意味着运营团队在云中启动基础架构,然后测试它们以查看它们是否完整。毫无疑问,如果它没有正常启动,运维团队需要销毁它并重新部署它。但这不是最佳方法,因为可能不应该发生的事情已经发生,这取决于团队的反应速度。一个合格的IaC平台应该通过部署前和部署中的频繁测试帮助团队“转移风险”。如果没有执行上述步骤,那么团队应该能够使用IaC平台执行以下类型的测试:(1)单元测试单元测试孤立地评估基础设施的行为。数据库等外部依赖项被替换为模拟,以检查资源配置和响应。使用模拟是因为云服务提供商的响应是众所周知的并且经过测试。测试人员已经知道提供者将如何响应给定的一些参数。单元测试在内存中运行,没有任何进程外调用,这使得它们非常快。在开发过程中将它们用于快速反馈循环。单元测试确实可以帮助开发人员在基础设施生命周期的早期解决问题。(2)集成测试集成测试(又称黑盒测试)是在单元测试之后进行的,它采用了不同的方法。集成测试部署云资源并验证它们的实际行为——当然是在临时环境中。暂存环境是模拟生产环境的短期环境。它通常很简单,只包括被测代码的一级依赖。集成测试完成后,可以销毁暂存基础设施。(3)安全测试很多时候,安全测试都是留到最后一刻,或者作为“完成”的代码丢给安全团队,他们被排除在整个开发过程之外。其实,这种想法可以说是“自杀”。道路”。现代IaC平台应该加密敏感配置数据并启用符合标准的安全实现,例如密钥轮换。还要检查平台是否加密状态元数据并确保秘密值永远不会以明文形式暴露。平台还应该轻松轻松地与云提供商提供的安全服务集成。此外,与其他类型的测试一样,IaC平台应帮助开发人员将自己的安全测试添加到工作流程中。就像您应该尽早对代码进行单元测试一样可能的话,你还应该尽早测试安全问题。这些测试是CI/CD管道的一部分,因此在发布之前对基础设施进行了全面的漏洞测试。4.创建可重用组件可重用组件意味着开发人员可以从中构建更高级别的资源一个单一的组件。有了它们,工程师能够创建有用的抽象,可以在别处重用。这些组件可以用最好的方式编写公司内部的实践,并在内部和社区内共享。使用可重复使用的组件有助于创建可重复、可靠的基础设施。因此,认真研究一下为您正在考虑的平台创建这些组件的难易程度。5.标准包管理器如果你想创建可重用的组件,你需要一种方法来打包它们以便于共享它们。除了使用标准工具外,还需要支持标准包管理器。例如,开发人员可能希望将组件放入GitHub存储库并通过NPM发布。那么IaC平台应该能够轻松地做到这一点。6.可见的创建行为为了便于明确职责和相互协作,所有基础设施资源的集中可见性和变化的历史视图非常重要。开发人员选择的平台应该具有日志审计功能,并且能够在云资源发生变化时查看差异(类似于团队使用Git等协作工具的方式),从而使开发人员能够了解整个基础架构。此外,该平台还应允许对用户可以访问和更改基础架构的内容进行细粒度控制。7.支持多个云供应商并不是每个公司都想使用多个云供应商,但这是应该考虑的事情。如果开发人员想要保留多个选项,请选择一个不限于单个云提供商的IaC平台。8.策略即代码IaC的另一个经常被忽视的方面是策略即代码。现代IaC平台应该允许开发人员将软件工程原理和方法应用于他们自己的策略,就像它对基础设施所做的那样。策略即代码的好处与基础设施即代码的好处大致相同。政策在安全性、合规性和成本控制方面不断加强组织的云治理。策略清晰,可以使用标准语言和工具编写,可以进行版本控制、测试,并最终集成到CI/CD管道中,以便所有基础设施都遵循公司的最佳实践。基础架构即代码工具许多开源IaC工具可用于自动化资源分配、部署和管理。使用的关键是正确选择适合自己的基础设施自动化工具。以下是常见的IaC类别和工具:使用Terraform实现基础设施即代码Terraform是一种与平台无关的开源工具,允许开发人员将基础设施编写为声明性配置文件。Terraform支持众多云提供商,使开发者能够在AWS、GoogleCloud、Azure和Oracle等主流云平台中配置资源。借助Terraform,工程师可以快速扩展基础设施资源的配置。自动化部署过程提高了组织中开发团队的工作效率,使他们能够对部署基础架构进行更改。Terraform有助于减少对集中式基础架构团队的依赖,使开发团队能够更快地移动并缩短业务功能的周期时间。要使用Terraform配置资源,请使用以下命令:使用Terraform模块创建可重用的基础设施Terraform模块的概念很简单——开发人员可以在模块内编写代码,并在整个代码库的多个位置重用它。使用Terraform模块,只需几行代码即可快速构建基础设施。随着基础设施的激增,开发人员需要在不同的环境(例如开发和暂存)中部署类似的资源,没有人愿意一遍又一遍地复制和粘贴相同的代码。Terraform模块更易于阅读。他们强制执行开发人员不会在Terraform文件中进行硬编码的最佳实践。为了让一个模块可以被不同的团队重用并适应不同的实例,它需要变得可配置。并能够将附加参数传递给环境的多个资源。Terraform非常可靠,因为它是一个经过严格测试和完整记录的集中式模块。对于最佳实践,请开始将基础架构视为可重用模块。Terraform模块促进代码重用,避免重复,并促进组织内的模块共享。允许开发人员花费更多的时间和精力来提高集中式可重用模块的质量。示例代码:以下是使用Terraform模块在各种环境中创建AWSS3存储桶所需的步骤。首先,我们使用AWS与所需资源进行交互。以下代码配置AWS提供商:1terraform{2required_providers{3aws={4source="hashicorp/aws"5version="~>4.9"6}7}8}910provider"aws"{11region="us-east-1"12}现在创建一个用于配置S3存储桶资源的Terraform模块:1resource"aws_s3_bucket""s3-bucket"{2bucket=var.bucket3policy=var.policy!=null?变种。政策:空4标签=合并(var.tags,{名称=“${var.bucket}-bucket”})56server_side_encryption_configuration{7规则{8apply_server_side_encryption_by_default{9sse_algorithm=“AES256”10}11}31}1动态“lifecycle_rule”{15for_each=var.expire-days>0?[var.expire-days]:[]16content{17id="expire"18enabled=true19expiration{20days=var.expire-days21}22}23}24}左右滑动查看完整code该模块支持存储桶、策略、有效期、标签等多种参数:1variable"bucket"{2description="S3BucketName"3type=string4}56variable"policy"{7description="要应用的可选S3bucket策略。应该是一个有效的JSON字符串"8type=string9default=null10}1112variable"expire-days"{13description="如果设置为正数,在指定天数后使对象过期的生命周期策略将附加到存储桶"14type=number15default=016}1718variable"tags"{19description="Commontagstobeappliedtoallresources"20type=map(any)21}左右滑动查看完整代码现在我们已经创建了可重用的S3模块,我们现在可以selectfromvariousenvironment(suchasdevorlive)调用模块并传入需要的变量1模块“dev-dzone-bucket”{2source=“../modules/s3-bucket”3bucket=“dev-dzone-iac-bucket”4policy=null5expire-days=76tags=local.标签7}89模块“live-dzone-bucket”{10source=“../modules/s3-bucket”11bucket=“live-dzone-iac-bucket”12policy=null13expire-days=1414标签=local.tags15}左右滑动查看完整代码Terraform项目中的文件布局类似下图,在“terraform-modules”(即Terraformmodules)下分别有开发环境和生产环境的文件夹,其中包含AWS资源。启用IaC的工作清单向初创公司或拥有许多未开发软件项目的公司引入现代IaC平台可能并不困难。然而,对于大多数企业来说,这并不是一件简单的事情。许多公司,无论大小,已经拥有大量通过云提供商提供的简单控制台创建的基础设施。许多新项目就是这样开始的。然后,有一天,一位运营工程师醒来,意识到新项目现在是生产基础设施。为了让它更“官方”,运维团队编写了一个操作手册或维基百科,详细说明如果有人想执行一项常见任务,应该点击哪些按钮等等。被只有一两个人理解的Bash或PowerShell脚本包围的情况也很常见.遇到这样的情况怎么办?(1)保持冷静你应该明白,改变有时是可怕的。很多人一想到触及基础设施就觉得自己要崩溃了。他们认为理解这个东西是如何工作的太复杂了。因此,您必须有信心才能解决问题。(2)正确定义“完美”的概念开发人员在开始评估工具和方法之前,应该了解什么是“完美”对于公司而言。无论开发人员使用何种工具,都会有一些假设。只有了解这些,才能实现目标。群体决策是正确实现贵公司云基础设施业务目标的方法之一。(3)评估工具的选择在考虑以上关键点后,将完美平台的选择范围缩小到少数几个评估对象。开发人员可以设计一个小项目来测试平台,看看它是否符合工作要求。(4)导入已有的基础设施选择工具后,尝试导入一些已有的基础设施。如果开发人员选择了正确的平台,这一步应该是轻而易举的。(5)与现有工程实现集成如果基础设施代码与持续交付流水线集成,您就可以开始构建与应用程序代码相同的最佳实践。(6)从小事做??起,创建新服务或从非关键服务开始——这样即使出现问题,也不会影响业务。选择一个项目,尽快了解其意义和价值,然后迭代更新。结论现代IaC是降低云复杂性和释放云潜力以推动创新的最佳方式。选择合适的平台,使用现代IaC,开发人员可以将标准软件工程实践和工具应用于基础设施。一般来说,可以获得以下好处。1.推动创新,提高速度和敏捷性借助现代IaC,团队可以将现代软件开发中的相同操作、严格测试和自动化应用到云基础架构,从而提高发布速度和可靠性,从而使公司能够交付给客户反馈反应迅速,及时更新。2.降低基础设施风险因为开发者可以使用标准的测试框架,IaC可以“转移风险”。早期、充分和完整的测试可以成为开发过程以及CI/CD管道的一部分。由于策略和安全要求也包含在代码中,因此每个部署都会自动进行合规性和安全性测试。3.加强协作现代IaC平台使用标准工具和语言,可以打破基础架构、应用程序开发和安全团队之间的孤岛。每个人都使用共享的实践和工具,这可以促进团队之间的协作。参考链接:https://dzone.com/refcardz/getting-started-with-iac
