在上一部分,我们一同探讨了构建 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的更多相关文章

  1. Java 异常处理的 20 个最佳实践,你知道几个?

    异常处理是 Java 开发中的一个重要部分,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java 提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建 ...

  2. 大规模使用 Apache Kafka 的20个最佳实践

    必读 | 大规模使用 Apache Kafka 的20个最佳实践 配图来源:书籍<深入理解Kafka> Apache Kafka是一款流行的分布式数据流平台,它已经广泛地被诸如New Re ...

  3. Kafka在大型应用中的 20 项最佳实践

    原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...

  4. 【转】Talend作业设计模式和最佳实践-Part I

    原文地址:https://mp.weixin.qq.com/s?__biz=MzA3OTg1Mzk4Nw==&mid=2453261363&idx=2&sn=e0f426022 ...

  5. 最佳实践 | 通过使用 Jira Service Management 改进 HR 工作流程

    ​​ Jira Service Management 承诺解锁高速团队.技术团队和与之合作的业务部门都可以从 Jira Service Management中受益,尤其是 HR 团队. Atlassi ...

  6. Git工作流程最佳实践总结

    Git作为一个目前非常流行的版本管理工具,深受开发者的喜爱.那么怎样才能将Git的作用发挥的更好呢?我根据实际的项目经验,归纳总结了以下Git工作流的最佳实践.这里所谓的最佳,是经过多次项目经验后,根 ...

  7. 移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践

    这篇是计算机类的优质预售推荐>>>><移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践> 国内顶级互联网公司測试实战经验总结.阿里.腾讯.京东.携程.百 ...

  8. atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php

    atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服 ...

  9. paip.提升效率--gui 的选择--swing最佳实践swt awt

    paip.提升效率--gui 的选择--swing最佳实践swt awt ////////////////弹出消息框. ////////////////myeclipse swing 开发最佳实践.. ...

  10. 工作流程,编程,调试,性能:Unity游戏开发者应该学习的20个改进技巧

    Unity 是一个备受欢迎的游戏开发平台.它的功能令人印象深刻,同时也迎合了不同的游戏开发需求.游戏开发者可以使用 Unity 创建任何类型的游戏,从世界级的 RPG 游戏到最流行的增强现实游戏 Po ...

随机推荐

  1. Apikit 自学日记:如何安装 Apikit

    肯定会有和我一样的小白,第一次听说 Apikit这个工具,那么我今天和大家一起学习下这个工具如何安装. Apikit 有三种客户端,你可以依据自己的情况选择.三种客户端的数据是共用的,因此你可以随时切 ...

  2. 【可视化大屏】用Python开发「淄博烧烤」微博热评舆情分析大屏

    目录 一.开发背景 二.爬虫代码 2.1 爬微博列表 2.2 爬微博评论 2.3 导入MySQL数据库 三.可视化代码 3.1 大标题 3.2 词云图(含:加载停用词) 3.3 玫瑰图(含:snown ...

  3. LeetCode 双周赛 106(2023/06/10)两道思维题

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 加入知识星球提问. 往期回顾:LeetCode 单周赛第 348 场 · 数位 DP 模版学会了吗? 双周赛 106 ...

  4. Visual Studio2019如何添加引用

    ​ 同一解决方案中添加引用 比如我们想在Test项目中添加Queue项目的引用 1.鼠标右击引用-->添加引用 2."引用管理器"-->项目-->解决方案--&g ...

  5. 理解ffmpeg

    ffmpeg是一个完整的.跨平台的音频和视频录制.转换和流媒体解决方案. 它的官网:https://ffmpeg.org/ 这里有一份中文的文档:https://ffmpeg.p2hp.com/ ff ...

  6. CF1799B Equalize by Divide题解

    本蒟蒻学习了jiangly大佬的思想,来发一个题解. 大致题意: 给定一个 \(n\) 个元素的数组 \(a\),每次可以选择 \(a[i]\) 和 \(a[j]\),然后使 \(a[i] = \lc ...

  7. Vue-Element UI 文件上传与下载

    项目结构 后端 前端 效果演示 上传文件 下载文件 Code 后端代码 跨域 /** * 跨域配置 * @author Louis * @date Jan 12, 2019 */ @Configura ...

  8. 我和ChatGPT聊数字人

    ​ 近期,聊天机器人ChatGPT火了,写诗写文写代码,才艺狠狠拉满. 面对如此"会聊"的ChatGPT,很多人好奇相同的问题提问ChatGPT和真人,会有什么样的结果? 于是我们 ...

  9. 《Among Us》火爆全球,实时语音助力派对游戏开启第二春

    今年在全球"宅经济"的影响下,社交派对类游戏意外的迎来了爆发. 8月份,<糖豆人:终极淘汰赛>突然爆火,创造了首日150万玩家.首周Steam 200万销量.单周Twi ...

  10. 【后端面经-Java】JVM垃圾回收机制

    目录 1. Where:回收哪里的东西?--JVM内存分配 2. Which:内存对象中谁会被回收?--GC分代思想 2.1 年轻代/老年代/永久代 2.2 内存细分 3. When:什么时候回收垃圾 ...