1.3.1. 如何设计一个 Terraform 模块
在上一章中我们大致介绍了一个可复用的 Terraform 模块应该包含哪些内容,应该遵循哪些规范,然而这只是描述了一个模块应该长什么样子,那么下一个问题:我们如何决定该如何设计一个模块?如何决定我们在一个模块里声明哪些资源?
1.3.1.1. 三种模块分类
在这里我们可以粗略地将模块分成三种大类:
我们将在对应节内对它们的类型进行进一步解释。
1.3.1.2. 接口规范
公有云平台会提供一些可以与各种服务结合使用的功能,例如 AWS 与 Azure 都支持 PrivateLink,使用户可以通过 VPC 流量访问托管在公有云上的 Paas 服务,获得额外的安全保障;再比如 Azure 平台目前推荐的为部署的应用配置 Azure 权限的方法是 Managed Identity,你可以在许多不同的服务上配置 Managed Identity,再为 Identity 配置相关权限,这样不同的服务之间就可以实现身份认证和权限验证,完全不需要存储任何的凭据或是机密。与之类似的情况还有例如 Customer Managed Key、Private Endpoint 等。
鉴于这样的情况,有必要为所有模块设计一份统一的模块接口规范。
- 增强模块的可重用性和一致性
通过统一的接口规范,模块开发者可以遵循一致的结构和命名约定,确保模块在不同环境和项目中的可重用性。例如,诊断设置的接口规范定义了日志类别、存储账户资源 ID、事件中心授权规则资源 ID 等参数,使得模块在不同资源上应用时保持一致的行为。
- 提高模块的可维护性
统一的接口规范使得模块的维护变得更加高效。当 Azure 服务的 API 或功能发生变化时,模块调用者只需与接口变更相关的部分代码,而无需逐个修改模块中的所有资源定义。这种集中管理的方式降低了维护成本,提高了模块的可维护性。
- 促进模块的自动化和集成
接口规范的统一使得模块更容易与自动化工具和 CI/CD 流水线集成。例如,角色分配和托管身份的接口规范定义了所需的参数和结构,自动化工具可以根据这些规范自动生成相应的配置,减少了手动配置的错误和时间成本。
- 提升模块的合规性和安全性
通过统一的接口规范,可以确保模块在实现时遵循 Azure 的最佳实践和安全要求。例如,Private Endpoint 的接口规范定义了相关的参数和结构,确保模块在部署时符合网络安全和访问控制的要求。
我们将在本章讲解一个来自 AVM 的接口规范,使得读者可以对接口规范有一个直观的认识。