20个最佳实践提升Terraform工作流程|Part 2

最佳,实践,提升,terraform,工作,流程,part · 浏览次数 : 58

小编点评

## Terraform 代码提升指南:最佳实践和策略 **标记资源:** * 当出现问题或试图找出基础设施的哪一部分导致云费用激增时,强大的标记策略将提供巨大帮助。 * 您可以在需要时根据标签制定一些访问控制策略。 * 例如,定义命名规则一样,尽量保持一致并始终相应地标记资源。 **参数标签:** * 声明为最后一个参数(如果相关,仅 depends_on或生命周期参数应在标签之后定义)。 **策略:** * 引入策略即代码(PaC)随着业务团队和基础设施规模的扩大,对个人用户的信任通常会降低。 * 制定政策即代码流程使我们能够定义大规模安全和可接受的规则,并自动验证这些规则。 **机密管理:** * 在使用 Terraform 时,机密管理可能不是首要任务,但最终还是要回到定义处理机密的策略。 * 通过设置环境变量并使用 sensitive = true 标记敏感变量来传递机密。 **测试:** * 在正式进行以上步骤前,可以通过启动来设置一些集成测试复制沙箱环境,在此环境中验证一切是否按预期工作,收集结果,然后销毁沙箱,并将其应用到生产中。 **调试:** * 在出现问题时,我们必须快速有效地收集所有必要的信息来解决问题。 * 可以使用 TF_LOG级别进行调试,设置 TF_LOG_PATH 环境变量将日志保留在文件中。 **代码构建:** * 使用循环和条件你的代码应该能够创建资源的多个实例,因此建议对可能从一种环境更改为另一种环境的实例使用 count 或 for_each 。 * 使用函数除了循环和条件之外,Terraform 函数对于在代码中实现通用性也至关重要。 **辅助工具:** * Terraform WorkSpace:可重复使用相同的配置。 * LifeCycle Modules:用于处理复杂的条件。 * Variable 验证:限制某些内容并且没有实施 PaC。 **其他:** * 使用 Visual Studio Code 或任何其他 IDE,可以利用其扩展来加快开发过程。 * 利用 IDE 扩展来构建 Terraform 扩展,快速生成文档。 * 在本地计算机上安装 Terraform 以确保其正常工作。

正文

在上一部分,我们一同探讨了构建 Terraform 项目的一些策略,以及使用 Terraform 管理 IaC 的部分最佳实践。今天,我们将继续深入研究将 Terraform 代码提升到新水平的具体要点,希望能够为你和你的团队提供有意义的提示和指导。
 

标记资源

当出现问题或试图找出基础设施的哪一部分导致云费用激增时,强大且一致的标记策略将提供巨大帮助。您还可以在需要时根据标签制定一些访问控制策略。像定义命名规则一样,尽量保持一致并始终相应地标记资源。
 

Terraform 参数标签应声明为最后一个参数(如果相关,仅depends_on或生命周期参数应在标签之后定义)。
 

在进行标记时,可以定义一些适用于提供者管理的所有资源的default_tags。如果使用的提供程序不支持默认标签,则需要手动将这些标签传递到模块并将它们应用到资源。
 

引入策略即代码(PaC)

随着业务团队和基础设施规模的扩大,对个人用户的信任通常会降低。这时应该制定一些政策来确保我们的系统继续运行且保持安全。制定政策即代码流程使我们能够定义大规模安全和可接受的规则,并自动验证这些规则。
 

实施机密管理策略

当开始使用 Terraform 时,机密管理可能不是首要任务,但最终还是要回到定义处理机密的策略。
 

如所有教程所说,切勿以明文形式存储机密并将其提交到版本控制系统中。可以通过使用 TF_VAR 设置环境变量并使用 sensitive = true 标记敏感变量来传递机密。
 

或者采用更成熟的解决方案,即设置一个机密存储(例如 Hashicorp Vault 或 AWS Secrets Manager)来处理对机密信息的访问。这样,就可以保护静态机密并强制执行加密。还可以选择更高级的功能,例如密钥轮换和审核日志。不过需要注意的是,这种方法通常会为企业带来使用此托管服务的成本。
 

测试 Terraform 代码

与所有其他代码一样,IaC 代码应该经过相应测试。运行 terraform plan 是验证更改是否能快速按预期工作的最简单方法。接下来,可以对 Terraform 代码执行一些静态分析而无需应用它。单元测试也是验证系统不同部分是否正常运行的一种选择。
 

另一步骤是将 Terraform linter 集成到 CI/CD 流水线中,并尝试捕获与云提供商、已弃用的语法、强制实施最佳实践等相关的任何潜在错误。
 

在正式进行以上步骤前,可以通过启动来设置一些集成测试复制沙箱环境,在此环境中验证一切是否按预期工作,收集结果,然后销毁沙箱,并将其应用到生产中。
 

启用调试/故障排除

当出现问题时,我们必须快速有效地收集所有必要的信息来解决问题。你会发现在这些情况下设置 Terraform 日志级别以进行调试很有帮助。

TF_LOG=DEBUG

还通过设置 TF_LOG_PATH 环境变量将日志保留在文件中。
 

尽可能构建模块

如果社区中没有适用于你的用例的模块,可以尝试构建自己的模块。一般会从一些基础的东西开始构建,随着基础设施的成熟,你可能需要回到简单的模块并向其添加更多功能。当在另一个环境中复制代码时,需要做的就是从该模块创建一个对象,并使用新环境的正确参数去进行填充。
 

使用循环和条件

你的代码应该能够创建资源的多个实例,因此建议对可能从一种环境更改为另一种环境的实例使用 countfor_each 。这样将能够灵活地使用相同的代码来适应许多不同的用例,并为参数提供通用性。
 

使用函数

除了循环和条件之外,Terraform 函数对于在代码中实现通用性也至关重要。它们使您的代码更加动态并确保您的配置是 DRY(Don't repeat yourself)的。函数允许您执行各种操作,例如将表达式转换为不同的数据类型、计算长度以及构建复杂变量。
 

充分利用动态模块

如果没有动态模块,代码就无法达到 DRY 状态。当此功能可用时,能够实现按照您喜欢的方式构建资源的灵活性。例如,某些云提供商没有用于安全组规则的专用资源,并且这些规则通常嵌入在安全组本身中。利用动态模块,你只需要更改输入即可。但如果没有动态模块,每当添加新规则时则需要相应更改配置。
 

使用 Terraform WorkSpace

请使用 Terraform Workspace,这样你将能够在不同的环境中重复使用相同的配置。
 

使用生命周期模块(Lifecycle Block)

有时代码中可能有一些复杂的条件。比如,有一个脚本必须在资源标签上更改 Terraform 之外的某些内容(当然并不建议这样做)。这时可以使用生命周期模块来忽略标签上的更改,确保不会回滚到以前的版本。
 

如果有些资源,由于某种原因它看似工作正常,但你必须在不停机的情况下重新创建它,那么生命周期模块也可以提供帮助。这时可以使用 create_before_destroy=true 来实现此目的。
 

使用变量验证

Terraform 在验证变量是否接收正确的输入方面做得非常好,但是如果想要限制某些内容并且没有实施 PaC 该怎么办?这时可以使用变量验证。此验证块存在于变量内部,可以参考 Terraform 官方说明[1]了解更多。
 

灵活利用辅助工具

Terraform 是最常用和最受喜爱的 IaC 工具之一,其社区也是非常庞大且活跃的。与这个社区一起,有许多辅助工具被创造以帮助用户更好地使用 Terraform。当然为我们的工作流程选择和采用正确的工具并不是件简单的事,通常需要一个实验阶段。这里我们总结出一些有用的工具清单供大家参考:

  • tflint – Terraform linter,用于检查计划无法捕获的错误。

  • tfenv – Terraform 版本管理器

  • checkov – Terraform 静态分析工具

  • terratest – 帮助您对 Terraform 进行自动化测试的 Go 库

  • pre-commit-terraform – 用于自动化的 pre-commit git hooks

  • terraform-docs – 从模块快速生成文档

  • atlantis – Terraform 项目协作工作流程

  • terraform-cost-estimation – 为您的计划提供成本估算服务
     

利用 IDE 扩展

如果你在编写 Terraform 代码时使用 Visual Studio Code 或任何其他 IDE,则可以利用其扩展来加快开发过程,并确保代码格式正确。在 vscode 上,您可以使用 Anton Kulikov 构建的 Terraform 扩展。请记住在本地计算机上安装 Terraform 以确保其正常工作。
 


 

总 结

我们探索了 Terraform 和 IaC 的许多不同最佳实践,分析了处理和构建 Terraform 项目的各种选项,并了解了采用辅助工具如何让我们的生活更轻松。当然这些并不是必须盲目遵循的秘诀,我们希望通过这篇文章,能够成为提供指导和提示并触发你构建自己的最佳 Terraform 工作流程和项目的指南。
 

原文链接
https://spacelift.io/blog/terraform-best-practices
参考链接
1.https://developer.hashicorp.com/terraform/language/values/variables

 

与20个最佳实践提升Terraform工作流程|Part 2相似的内容:

20个最佳实践提升Terraform工作流程|Part 1

将 Terraform 管理laC的技能提升到一个新的水平。

20个最佳实践提升Terraform工作流程|Part 2

将 Terraform 管理 IaC 的技能提升到一个新的水平。

Spring Boot 编写 API 的 10条最佳实践

10 个最佳实践,让您像专业人士一样编写 Spring Boot API,并结合编码示例和解释: 1. RESTful API 设计原则: 清晰一致的资源命名:使用准确反映 API 管理的资源的名词(例如,/products、/users)。 @GetMapping("/products/{id}"

20个 Git 命令玩转版本控制

想要在团队中处理代码时有效协作并跟踪更改,版本控制发挥着至关重要的作用。Git 是一个版本控制系统,可以帮助开发人员跟踪修订、识别文件版本,并在必要的时候恢复旧版本。Git 对于有一定编程经验的用户来说虽然不算太难,但是想要玩转一些高级功能也并不是件容易的事情。在这篇文章中,我将向你展示一些最实用的

[转帖]《Linux性能优化实战》笔记(二)—— CPU 上下文切换(上)

上一篇的最后一个例子,在多个进程竞争CPU时,我们看到每个进程实际上%usr部分只有20%多,70%多是在wait,但是load远远高于单个进程使用CPU达到100%。 这让我想到之前看的RWP公开课,里面有一篇连接池管理。为什么相同的业务量,起6千个连接(进程)远远要慢于200个连接,因为绝大多数

acme.sh的简单学习过程

acme.sh的简单学习过程 背景 公司内部测试环境为了节约费用(不要学我) 自己花十块到一百块之前从腾讯云购买一个域名 然后使用NDSPOD进行解析内网IP地址 偶尔需要申请临时证书进行HTTPS的验证. 但是免费的证书最多20个. 然后想了下就想试试acme.sh进行免费证书的申请 注意: 本方

我们从 CircleCI 安全事件获得的3个经验教训

CircleCI 作为业内最受欢迎的 CI/CD 平台提供商之一,有超过20万个 DevOps 团队使用其平台。该公司在今年1月在其官网报告了一起安全事件引起客户恐慌。在此事件中,有身份不明的恶意攻击者入侵了一名员工的笔记本电脑,利用恶意软件窃取了员工的 2FA 支持的单点登陆会话 cookie,使

[转帖]警惕Oracle数据库性能“隐形杀手”——Direct Path Read

一、 简介 Oracle 的11g版本正式发布到今天已经10年有余,最新版本也已经到了20c,但是Direct Path Read(直接路径读)导致性能问题的案例仍时有发生,很多12c的用户还是经常遇到这个问题,所以有必要把这个事情再跟大家讲一遍,通过2个典型案例加深理解。 早在2012年,盖国强大

Python 潮流周刊#56:NumPy 2.0 里更快速的字符串函数(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期周刊分享了 12 篇文章,12 个开源项目,赠书 5 本,全文 2100 字。

20个Golang片段让我不再健忘

本文使用代码片段的形式来解释在 go 语言开发中经常遇到的小功能点,由于本人主要使用 java 开发,因此会与其作比较,希望对大家有所帮助。