Module 让 Terraform 使用更简单

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介: 众所周知,Terraform 是一个开源的自动化的资源编排工具,支持多家云服务提供商。阿里云作为第三大云服务提供商,[terraform-alicloud-provider](https://www.terraform.

众所周知,Terraform 是一个开源的自动化的资源编排工具,支持多家云服务提供商。阿里云作为第三大云服务提供商,terraform-alicloud-provider 已经支持了超过 140 个 Resource 和 100 个 Data Source,覆盖30多个服务和产品,吸引了越来越多的开发者加入到阿里云Terraform生态的建设中。

随着 Resource 和 DataSource 的不断增加和完善,业务架构的不断发展,Terraform 模板编写的成本和复杂度也在不断的增加。如何让Terraform 模板更加简单和重用,就是本文所要解决的问题。

本文将通过一个典型的负载均衡架构,向大家介绍如何使用 Module 简化 Terraform 的模板。

architecture.png

如图所示,这个架构中,包含 ECS 实例,SLB 实例,RDS 实例,OSS 等资源和服务,同时所有的 ECS,RDS 和部分 SLB 在一个 VPC 网络环境中。

将所有Resource放在一个模板中进行统一管理

面对这样的一个架构,模板可以有多种写法。通常的写法是将架构中涉及到的所有资源写到一个模板中,并通过参数和关系型 resource 将这些资源关联起来,如下所示:

// Images data source for image_id
data "alicloud_images" "default" {
  ...
}
// Instance_types data source for instance_type
data "alicloud_instance_types" "default" {
  ...
}
// Zones data source for availability_zone
data "alicloud_zones" "default" {
  ...
}
// A new VPC
resource "alicloud_vpc" "vpc" {
    name = "default"
    ...
}
// Two new VSwitches
resource "alicloud_vswitch" "vswitches" {
  count             = 2
  vpc_id            = "${alicloud_vpc.vpc.id}"
  ...
}
// A new Security Group
resource "alicloud_security_group" "default" {
  vpc_id = "alicloud_vpc.vpc.id}"
  ...
}
// Two Web Tier instances
resource "alicloud_instance" "web" {
  count           = 2
  image_id        = "data.alicloud_images.default.images.0.id"
  instance_type   = "data.alicloud_instance_types.default.instance_types.0.id"
  security_groups = ["${ alicloud_security_group.default.id }"]
  vswitch_id = "${element(alicloud_vswitch.vswitches.*.id, count.index)}"
  ...
}
// Two Application Tier instances
resource "alicloud_instance" "app" {
  count           = 2
  image_id        = "${data.alicloud_images.default.images.0.id}"
  instance_type   = "${data.alicloud_instance_types.default.instance_types.0.id}"
  security_groups = ["${alicloud_security_group.default.id}"]
  vswitch_id = "${element(alicloud_vswitch.vswitches.*.id, count.index)}"
  ...
}
// A SLB Instance for intranet
resource "alicloud_slb" "intranet" {
  internet = false
  vswitch_id = "${alicloud_vswitch.vswitches.0.id}"
  ...
}
// Attach Ecs instances
resource "alicloud_slb_attachment" "intranet" {
  load_balancer_id = "${alicloud_slb.intranet.id}"
  instance_ids     = ["${alicloud_instance.web.*.id}", "${alicloud_instance.app.*.id}"]
}
// SLB Instance Resource for internet
resource "alicloud_slb" "internet" {
  internet  = true
  ...
}
// Attach Ecs instances
resource "alicloud_slb_attachment" "internet" {
  load_balancer_id = "${alicloud_slb.internet.id}"
  instance_ids     = ["${alicloud_instance.web.*.id}"]
}
// Two RDS Instance
resource "alicloud_db_instance" "default" {
  count            = 2
  vswitch_id = "${element(alicloud_vswitch.vswitches.*.id, count.index)}"
  ...
}
// Add a account for each RDS instance
resource "alicloud_db_account" "default" {
  count       = 2
  instance_id = "${element(alicloud_db_instance.default.*.id, count.index)}"
  ...
}
// Add a database for each RDS instance
resource "alicloud_db_database" "default" {
  count       = 2
  instance_id = "${element(alicloud_db_instance.default.*.id, count.index)}"
  ...
}
// A OSS Bucket
resource "alicloud_oss_bucket" "default" {
  ...
}

这样写的好处是,所有资源都在一个模板中管理,编写时可以很清楚了解资源之间的引用关系;但是,当资源不断增加时,扩展非常不灵活,资源间关系越复杂,模板越难以维护。

分类管理,目录作为单元化资源

从架构图和上文模板中不难看出,并不是所有的Resource都有直接关联关系,比如VPC只和VSwitch和SecurityGroup有关,与其他资源的创建无直接关联关系。因此,为了使整个架构的逻辑可以更加清楚的展示在模板中,我们可以考虑,对资源进行分类,将每一类资源用一个单独的目录进行管理,最后用一个模板来管理所有的目录,进而完成对所有资源及资源关系的串联,如下所示:

├── main.tf
├── variables.tf
├── outputs.tf
├── modules/
│   ├── vpc/
│   │   ├── variables.tf
│   │   ├── main.tf
│   │   ├── outputs.tf
│   ├── slb/
│   │   ├── variables.tf
│   │   ├── main.tf
│   │   ├── outputs.tf
│   ├── ecs/
│   ├── rds/
│   ├── oss/

将该架构中的资源分为网络(VPC),负载均衡(SLB),计算(ECS),数据库(RDS)和存储(OSS)这几类,然后将上文模板中的资源分别在对应的目录中予以实现。

接下来,用统一的模版main.tf将这些目录关联起来,如下所示:

// VPC module
module "vpc" {
  source = "./modules/vpc"
  name = "new-netwtok"
  ...
}
// Web Tier module
module "web" {
  source = "./modules/ecs"
  instance_count = 2
  vswitch_ids = "${module.vpc.this_vswitch_ids}"
  ...
}
// Web App module
module "app" {
  source = "./modules/ecs"
  instance_count = 2
  vswitch_ids = "${module.vpc.this_vswitch_ids}"
  ...
}
// SLB module(intranet)
module "slb" {
  source = "./modules/slb"
  name = "slb-internal"
  vswitch_id = "${module.vpc.this_vswitch_ids.0.id}"
  instances = "${concat(module.web.instance_ids, module.app.instance_ids,)}"
  ...
}
// SLB module(internet)
module "slb" {
  source = "./modules/slb"
  name = "slb-external"
  internet = true
  instances = "${module.web.instance_ids}"
  ...
}
// RDS module
module "oss" {
  source = "./modules/rds"
  name = "new-rds"
  ...
}
// OSS module
module "oss" {
  source = "./modules/oss"
  name = "new-bucket"
  ...
}

可以看出,main.tf中资源的结构更加清楚,更加接近于架构图。

同时,大家已经注意到了,main.tf引入了一个 module,通过module将资源目录串联起来。

什么是Module

Module 是 Terraform 为了管理单元化资源而设计的,是子节点,子资源,子架构模板的整合和抽象。正如本文架构中提到的,在实际复杂的技术架构中,涉及到的资源多种多样,资源与资源之间的关系错综复杂,资源模版的编写,扩展,维护等多个问题的成本都会不断增加。将多种可以复用的资源定义为一个module,通过对 module 的管理简化模板的架构,降低模板管理的复杂度,这就是module的作用。

除此之外,对开发者和用户而言,只需关心 module 的 input 参数即可,无需关心module中资源的定义,参数,语法等细节问题,抽出更多的时间和精力投入到架构设计和资源关系整合上。

开源Module,使其更完善,更分享,更便捷

上文中,虽然已经实现了module,但是这个module只能在自己本地机器上实现,无法实现与他人的实时分享,无法实现团队内部的及时共享。

Terraform 提供了 Module 的注册地址,将自己的module上传到Github,并注册为一个Terraform Module后,即可将远端的Module应用到我们自己的模板中。

利用开源 module,我们可对上文中的模板进行完善:

// VPC module
module "vpc" {
  source = "alibaba/vpc/alicloud"
  ...
}
// Web Tier module
module "web" {
  source = "alibaba/ecs-instance/alicloud"
  ...
}
// Web App module
module "app" {
  source = "alibaba/ecs-instance/alicloud"
  ...
}
// SLB module(intranet)
module "slb-intranet" {
  source = "alibaba/slb/alicloud"
  ...
}
// SLB module(internet)
module "slb-internet" {
  source = "alibaba/slb/alicloud"
  ...
}
// OSS module
module "rds" {
  source = "terraform-alicloud-modules/rds/alicloud"
  ...
}
// OSS module
module "oss" {
  source = "terraform-alicloud-modules/oss/alicloud"
  ...
}

Module 让资源模板架构更清楚,模板管理更简单;开源 Module 让资源模板更便捷,更分享。除此之外,开源 Module 可实现对模板的版本控制,基于不同的版本,实现不同架构不断升级的控制和完善。

欢迎加入 Terraform AliCloud Modules

目前我们已经在在 Terraform Module 上发布了一些常用的 Module,但这些 Module 远远无法满足大家多种多样的技术架构和复杂的应用场景,非常欢迎大家可以将自己的模板Module注册到官方 Module 上,借助社区的力量,不断完善自己模板,丰富我们的社区。

相关实践学习
使用操作系统智能助手OS Copilot解锁操作系统运维与编程
在本实验场景中,将在阿里云ECS上体验OS Copilot产品。OS Copilot是阿里云操作系统团队基于大模型构建的OS智能助手。它具有自然语言问答、辅助命令执行、系统运维调优等功能,帮助用户更好地使用Linux,提升阿里云的使用体验。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10月前
|
弹性计算 Kubernetes API
Kubernetes 驱动的 IaC,Crossplane 快速入门
Crossplane 是一个开源的 Kubernetes 扩展工具,允许用户通过声明式配置直接在 Kubernetes 中管理云资源。对于阿里云开发者,借助 Crossplane 和官方提供的 provider-upjet-alibabacloud,可以像管理 Pod 一样轻松操作 ECS 实例、VPC 和 OSS Bucket 等资源。本文介绍了 Crossplane 的核心概念,并通过快速入门指南演示了如何安装 Crossplane、配置阿里云认证并创建第一个 VPC 资源。
1124 37
|
弹性计算 Prometheus 运维
一文详解阿里云可观测体系下标签最佳实践
在当今数字化转型加速的时代,企业 IT 系统的复杂度与日俱增,如何高效地管理和监控这些系统成为了一项挑战。阿里云作为全球领先的云计算服务商,提供了一整套全面的可观测性解决方案,覆盖从业务、端侧(小程序、APP、H5 等)、应用、中间件、容器/ECS 等全栈的监控体系,旨在帮助企业构建强大而灵活的可观测性体系。其中,标签(Tag)作为一种核心组织和管理手段,在阿里云可观测体系中扮演着至关重要的角色。本文将深入探讨阿里云可观测系列产品中标签的应用,以及如何运用标签在阿里云可观测产品体系下进行体系化建设并给出相关最佳实践。
1199 191
|
Web App开发 测试技术 数据中心
Terraform Module 编写指南
Module 是一个Terraform 模板,是对多个子节点,子资源,子架构模板的组合和抽象。利用Module 在降低模板编写和维护复杂度的同时,使得模板结构更加简洁清楚。为什么要使用 Module,详见文章[ Module 让 Terraform 使用更简单](https://www.atatech.org/articles/119465)。
8353 0
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
1083 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
存储 Linux 持续交付
史上最全 Terraform 入门教程,助你无坑入门!
【10月更文挑战第26天】这是一个全面的 Terraform 入门教程,涵盖了 Terraform 的基本概念、安装步骤、基础配置、变量和输出变量的使用、模块的定义与使用,以及状态管理。通过实例讲解如何创建本地文件资源和 AWS S3 桶,帮助初学者快速上手并掌握 Terraform 的核心功能。
3156 8
|
消息中间件 缓存 监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
springboot的热部署、配置的宽松绑定和校验、任务、邮件、监控、springboot整合JdbcTemplate,h2等sql技术、整合redis,mongodb,es等nosql技术、整合redis,Memcached,jetcache,j2cache等缓存技术、整合ActiveMQ,RabbitMQ,RocketMQ,Kafka等消息的中间件的入门、整合缓存/任务/邮件/监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
|
弹性计算 数据可视化 安全
Terraform Explorer 正式发布
阿里云推出可视化的Terraform调用工具——Terraform Explorer,简化云资源管理,提供可视化操作界面,免安装、免编写代码、免状态管理,助力开发者高效部署和管理基础设施。
|
人工智能 搜索推荐 安全
云上远程医疗:跨越时空的医疗革新,重塑健康服务新生态
政策支持和监管加强:随着云上远程医疗的快速发展,政府将出台更多支持政策和监管措施,促进产业的健康有序发展。同时,行业也将加强自律和协作,共同推动云上远程医疗的规范化、标准化发展。 跨界融合与生态构建:云上远程医疗将与保险、健康管理等领域实现跨界融合,构建更加完善的健康服务生态体系。这将有助于提升整个医疗健康行业的服务水平和竞争力。 结语
964 0
阿里云容器服务 ACK 产品技术动态(202312)
阿里云容器服务 ACK 产品技术动态(202312)