Terraform 一分钟部署阿里云ECS集群(含视频)

本文涉及的产品
云服务器 ECS,每月免费额度280元 3个月
对象存储 OSS,20GB 3个月
云服务器ECS,u1 2核4GB 1个月
简介: “企业上云”是当下大势所趋,“提效、降成本” 是企业上云、迁云和管理云必须关注的问题。今天将从一个集群部署的场景出发,介绍阿里云如何借助生态工具Terraform持续降低企业上云、迁云和管理云的成本。

本文已在下方公众号中发布:听说“一分钟就能部署阿里云ECS集群”?,欢迎大家围观
aliyun_

1 为什么要有资源编排

传统运维模式下,业务上线需经过设备采购,机器上架,网络环境搭建和系统安装等准备阶段。随着云计算的兴起,各大公有云厂商均提供了非常友好的交互界面,用户借助一个浏览器就可以按需采购各种云资源,快速实现业务架构的搭建。

然而,随着业务架构的不断扩展,云资源采购的规模和种类也在持续增加。当用户需要快速采购大量不同类型的云资源时,云管理页面间大量的交互操作反而降低了云资源的采购效率。在阿里云控制台上初始化一个经典的VPC网络架构,从创建VPC、交换机VSwitch到创建Nat网关、弹性IP再到配置路由等工作,大概要花费20分钟甚至更久。同时,工作成果的不可复制性,带来的是跨Region和跨云平台场景下的重复劳动。

事实上,对业务运维人员而言,只关心对资源的配置,无需关心这些资源的创建步骤。如同喝咖啡,只需要告诉服务员喝什么,加不加冰等就够了。如果有一份完整的云资源采购清单,这张清单清楚的记录了所需要购买的云资源的种类,规格,数量以及各云资源之间的关系,然后一键完成购买,并且当业务需求发生变化时,只需要变更清单就可以实现对云资源的快速变更,那么效率就会提高很多。在云计算中这被称作资源编排,目前很多云平台也提供了资源编排的能力,如阿里云的ROS,AWS的CloudFormation等。

将云资源、服务或者操作步骤以代码的形式定义在模板中,借助编排引擎,实现资源的自动化管理,这就是基础设施即代码(Infrastructure as Code,简称IaC),也是资源编排最高效的实现模式。

然而,多种云编排服务带来的是高昂的学习成本、低效的代码复用率和复杂的多云协同工作流程。每一种服务仅限于管理自家的单一云平台上,无法满足对多个云平台,多种层级(如IaaS,PaaS)资源的统一管理。

如何解决如上问题,是否可以使用统一的编排工具,共用一套语法实现对包括阿里云在内的多云的统一管理呢?这就是本文所要介绍的主角 - Terraform。

2 Terraform简介

Terraform是由Hashicorp公司于2014年推出的一个开源项目,是一个典型的IaC工具。在Terraform中,Infrastructure是一个广泛的抽象,几乎涵盖了所有可以被管理的资源和服务,如计算资源虚拟机,存储资源磁盘、对象存储,网络资源虚拟网络、交换机、路由器、IP、负载均衡等,安全资源防火墙、其他安全产品和设备,数据库资源MySQL、PostgreSQL等等。

Terraform与前文提到的ROS等各家的资源编排服务相比,主要有几个特点:

  • 开源
    从诞生之初,Terraform就是一个开源项目,任何开发者都可以对其贡献代码,完善功能。
  • 多云管理
    支持对多种云服务的统一管理,各云服务厂商提供自家的管理插件Provider(后文会提到),用户只需要学习统一的Terraform语法,选择不同的Provider,定义不同的资源模板即可。
    对不同云服务厂商云资源的描述可以定义在同一个模板中,相互之间不会产生干扰。
  • 面向客户端
    只要在操作机器上完成对Terraform的安装,就可以通过简单的Terraform命令实现对云资源的一键管理,非常方便,无需再借助与API、SDK等方式整合后进行调用。

目前,市场上的IaC工具大体可以分为两类:一类是配置管理类,典型代表有Ansible,Chef,Puppet等;另一类是以Terraform为代表的资源编排类。运维人员可能对前者更加熟悉,并且认为这些工具也可以实现对资源的管理,比如阿里云的Ansible Module同样可以实现阿里云ECS实例,VPC,SLB等的管理和配置。

但两者存在很大差别:

  • 使用场景不同
    配置管理工具侧重于操作系统级别配置和管理,如机器的启停,系统软件的安装和配置等,它的目的是为了实现对机器及其上应用的控制和管理,而资源编排解决的是基础设施整体资源栈的编排和管理问题,触达的资源更广。
  • 工作模式不同
    资源编排是面向声明式的。声明式只关心最终的操作结果,对用户而言,只关心我定义的那堆资源是否都已经创建完成。如果结果和声明的不一致,则会触发变更操作,直到最终状态。而配置管理工具是面向过程式的,过程式需要关心每一步的操作结果,在执行时通常是串行的,直到所有步骤结束,如先创建VPC,VSwitch,安全组,然后再利用创建好的资源创建ECS实例,SLB实例等。可以理解为按顺序自动化执行所有的操作。

阿里云作为国内第一家与 Terraform 集成的云厂商,经过两年多的努力,目前已经提供了超过 148 个 Resource 和 98 个 Data Source,覆盖计算,存储,网络,负载均衡,CDN,容器服务,中间件,访问控制,数据库等超过30款产品,已经满足如SAP,西门子这样大客户的自动化上云需求。从 Terraform 0.12.2 版本开始,阿里云支持将对象存储服务 OSS 作为标准的 Remote State Backend ,开始提供远端存储 State 的能力,在提高 state 安全性的同时,提升多人协作效率。阿里云Modules的注册数量已经达到36个,覆盖多个产品和使用场景,为开发者提供“开箱即用”使用体验。

除此之外,Hashicorp中的其他成员 Packer 和 Vault 也实现了与阿里云的集成,与Terraform一起从镜像制作,到权限控制,到资源编排满足用户和开发者更多的使用场景。
alicloud_hashicorp

3 阿里云Terraform初探

接下来,本文将通过一些简单的操作和介绍,引导大家在阿里云上快速入门Terraform,后续也会有一系列文章介绍更高级的功能。

3.1 安装Terraform

正如前面提到的,Terraform是一个面向客户端的工具,在使用Terraform之前,需要在本地安装Terraform,可参考官方的安装文档:https://learn.hashicorp.com/terraform/getting-started/install
如果不想安装,可以使用阿里云提供的在线服务Cloud Shell:https://shell.aliyun.com,内置了Terraform的运行环境。
_2019_10_10_4_59_17

3.2 Provider:基础设施管理驱动

Provider 是Terraform中一个非常重要的组件,是一个用来管理基础设施的后端驱动,可以理解为Terraform的插件。每个云服务厂商实现面向各家云服务的Provider,其中包含资源元数据的定义,上层请求的处理和后端OpenAPI的调用和响应处理。Terraform调用不同的Provider完成不同类型资源的统一管理。目前大多数云平台均实现了各自的Provider,阿里云提供的Provider为 alicloud 。

Provider无需手动安装,Terraform会在 init 阶段根据模板中的定义自动加载。Provider通过关键 provider 声明,语法如下:

provider "alicloud" {
  profile = "terraform"
  region  = "cn-hangzhou" 
}

以上代码显示声明了需要加载的Provider插件为 alicloud ,大括号中指定了该Provider的配置,其中 profile 表示阿里云的认证信息可以从Credential文件 ~/.aliyun/config.json 中名为 terraform  的配置信息中读取; region 指明了当前模板中定义的资源会被创建在杭州区域。
如果不想使用 profile ,可以直接在如上配置中硬编码 access_key 和 secret_key ,但是硬编码的方式存在密钥泄漏的风险,不推荐。

运行 terraform init 自动加载Provider:
_2019_10_10_6_56_06

Provider 也可以省略,即隐式定义。通过环境变量 ALICLOUD_ACCESS_KEY 、 ALICLOUD_SECRET_KEY 和 ALICLOUD_REGION 来设置Provider所需的必填参数。 init 时,Terraform将通过下文即将讲到的Resource和Data Source来识别相应的Provider,进而完成加载。

3.3 Resource:资源的定义和管理

Resource是Terraform中的一个重要概念,是Provider的重要组成部分。每个Resource定义了特定基础设施资源的属性,通过对Create、Update、Read和Delete方法的实现来管理特定资源的生命周期。

3.3.1 Resource 的声明和定义

Resource通过关键字 resource 来声明,对一个特定资源的定义如下:

# 定义一个ECS实例
resource "alicloud_instance" "default" {
  image_id        = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
  instance_type   = "ecs.sn1ne.large"
  instance_name   = "my-first-vm"
  ...
}

对资源的定义包含如下几个部分:

  • alicloud_instance 为资源类型,定义当前资源的类型,告诉Terraform这个Resource是阿里云的虚拟机还是其他资源,如VPC、SLB等。
  • default 为资源名称,资源名称用来标识所定义的资源,在同一个模板(即当前运行目录下所有以 .tf 结尾的文件)中对同一资源类型的标识必须唯一。
  • 大括号里面的内容为参数配置,用来定义资源属性,比如实例的镜像、规格、名称,VPC的网段等。

上述代码定义了一个阿里云的ECS实例,镜像ID为 ubuntu_18_04_64_20G_alibase_20190624.vhd,规格为 ecs.sn1ne.large,实例名称为 my-first-vm ,更多参数定义可参考官方文档:https://www.terraform.io/docs/providers/alicloud/r/instance.html

3.3.2 Resource 的创建

完成对资源的定义,可以先通过 terraform plan 预览模板中所定义的资源:

shell@Alicloud:~$ terraform  plan
...
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # alicloud_instance.default will be created
  + resource "alicloud_instance" "default" {
      + availability_zone          = (known after apply)
      + host_name                  = (known after apply)
      + image_id                   = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
      + instance_charge_type       = "PostPaid"
      + instance_name              = "my-first-vm"
      + instance_type              = "ecs.sn1ne.large"
      ...
    }

Plan: 1 to add, 0 to change, 0 to destroy.

如上输出可知,Terraform将创建一个资源 alicloud_instance.default,其中某些属性如 host_name 为 known after apply,这个意思是说该参数的值需要在执行 terraform apply 之后才能知道,通常这种字段值如果没有显示设置,后端系统将自动生成或者通过其他Resource和Data Source来设置。

确认无误后,执行 terraform apply 开始创建资源:

shell@Alicloud:~$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # alicloud_instance.default will be created
  + resource "alicloud_instance" "default" {
      + availability_zone          = (known after apply)
      ...
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

alicloud_instance.default: Creating...
alicloud_instance.default: Still creating... [10s elapsed]
alicloud_instance.default: Still creating... [20s elapsed]
alicloud_instance.default: Creation complete after 23s [id=i-bp18hno0jw73fcbrykt7]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

为了安全起见, apply 之后需要输入 yes 确认,执行完毕后输出创建后的ECS实例 ID为 i-bp18hno0jw73fcbrykt7 。 登录ECS控制台验证如下:

_2019_10_10_7_53_45

3.3.3 Resource 的变更

对于IaC的工具,资源的变更非常简单,只需要修改模板中定义的属性值即可。Terraform对资源的变更有两种情况:

  • 原地变更(update in-place)
    即在不改变资源生命周期的情况下,实现对资源自身属性的修改,如变更资源的名称,描述,标签等。
  • 重建变更(destroy and then create replacement)
    某些资源属性不支持变更,这种情况下,如果修改资源的属性,Terraform将会先删除原有的资源,然后按照最新的模板定义创建新的Resource,间接实现资源的变更操作。
    对于不支持变更的属性,阿里云Provider的文档中,会对该属性字段显示声明为 ForceNew 。

接下来,分别通过修改实例的两个属性来演示如上的两种变更情况。
首先,修改实例的名称为“update-my-first-vm”,并为其增加一个标签 Newtag: "update name" 。跳过 plan 过程直接执行 terraform apply  结果如下:

shell@Alicloud:~$ terraform apply
alicloud_instance.default: Refreshing state... [id=i-bp18hno0jw73fcbrykt7]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # alicloud_instance.default will be updated in-place
  ~ resource "alicloud_instance" "default" {
        ...
      ~ instance_name              = "my-first-vm" -> "update-my-first-vm"
        instance_type              = "ecs.sn1ne.large"
        ...
      + tags                       = {
          + "Newtag" = "update name"
        }
        ...
    }

Plan: 0 to add, 1 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

alicloud_instance.default: Modifying... [id=i-bp18hno0jw73fcbrykt7]
alicloud_instance.default: Modifications complete after 1s [id=i-bp18hno0jw73fcbrykt7]

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

如上所示, update in-place 只改变了实例的名称和新增了一个tag,不需要重新创建实例。
Terraform的展示中, + 表示新增, ~ 表示更新的内容,左边的是旧值,右边的是新值, - 表示即将删除。

在此基础上,如果修改实例所属的资源组 resource_group_id ,则在执行 terraform apply 之后将会导致实例的重建:

shell@Alicloud:~$ terraform apply
alicloud_instance.default: Refreshing state... [id=i-bp18hno0jw73fcbrykt7]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # alicloud_instance.default must be replaced
-/+ resource "alicloud_instance" "default" {
      ~ availability_zone          = "cn-hangzhou-g" -> (known after apply)
        deletion_protection        = false
      ~ host_name                  = "iZbp18hno0jw73fcbrykt7Z" -> (known after apply)
      ~ id                         = "i-bp18hno0jw73fcbrykt7" -> (known after apply)
        ...
        instance_name              = "update-my-first-vm"
      - internet_charge_type       = "PayByTraffic" -> null
      ~ internet_max_bandwidth_in  = -1 -> (known after apply)
      + public_ip                  = (known after apply)
      + resource_group_id          = "rg-aekzryaevt26ofq" # forces replacement
        ...
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

alicloud_instance.default: Destroying... [id=i-bp18hno0jw73fcbrykt7]
alicloud_instance.default: Still destroying... [id=i-bp18hno0jw73fcbrykt7, 10s elapsed]
alicloud_instance.default: Destruction complete after 10s
alicloud_instance.default: Creating...
alicloud_instance.default: Still creating... [10s elapsed]
alicloud_instance.default: Still creating... [20s elapsed]
alicloud_instance.default: Creation complete after 23s [id=i-bp16oytazedmtelzdgo2]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

如上所示, resource_group_id 的变更是一个 forces replacement 行为,导致原机器的释放和新机器的创建。
值得注意的是,删除的资源无法实现回滚,数据无法恢复,因此在 apply 前一定要通过 plan  命令仔细查看哪些资源是原地变更,哪些是重建变更,以免造成不可恢复的错误。

3.3.4 Resource 的查看

想要查看创建完的资源,最简单的方式是执行命令 terraform show ,此时终端将会快速展示出所有当前模板中定义的资源及其属性:

shell@Alicloud:~$ terraform show
# alicloud_instance.default:
resource "alicloud_instance" "default" {
    availability_zone          = "cn-hangzhou-g"
    deletion_protection        = false
    id                         = "i-bp16oytazedmtelzdgo2"
    image_id                   = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
    instance_charge_type       = "PostPaid"
    instance_name              = "update-my-first-vm"
    instance_type              = "ecs.sn1ne.large"
    ...
    tags                       = {
        "Newtag" = "update name"
    }
    ...
}

这种方法固然简单,但是如果当资源非常多的时候,在所有资源中寻找目标资源就比较吃力了。此时,可以通过 terraform state 模式来实现对目标资源的查看。
首先,执行 terraform state list 罗列出当前的所有资源,每个资源显示格式为 <资源类型>.<资源名称> :

shell@Alicloud:~$ terraform state list
alicloud_instance.default

接着,找到对应的资源,执行 terraform state show <资源类型>.<资源名称> 即可实现对目标资源的查看:

shell@Alicloud:~$ terraform state show alicloud_instance.default
# alicloud_instance.default:
resource "alicloud_instance" "default" {
    availability_zone          = "cn-hangzhou-g"
    deletion_protection        = false
    id                         = "i-bp16oytazedmtelzdgo2"
    image_id                   = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
    instance_charge_type       = "PostPaid"
    instance_name              = "update-my-first-vm"
    instance_type              = "ecs.sn1ne.large"
    ...
    tags                       = {
        "Newtag" = "update name"
    }
    ...
}

可以看到,其结果与只有一个资源时 terraform show 的结果是一致的。

3.3.5 Resource 的释放

通常情况下,资源的释放是通过命令 terraform destroy 来执行,但是这个命令会将模板中所有定义的资源都删除,如下:

shell@Alicloud:~$ terraform destroy 
alicloud_instance.default: Refreshing state... [id=i-bp16oytazedmtelzdgo2]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # alicloud_instance.default will be destroyed
  - resource "alicloud_instance" "default" {
      ...
      - id                         = "i-bp16oytazedmtelzdgo2" -> null
      ...
      - instance_name              = "update-my-first-vm" -> null
      ...
    }

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

alicloud_instance.default: Destroying... [id=i-bp16oytazedmtelzdgo2]
alicloud_instance.default: Still destroying... [id=i-bp16oytazedmtelzdgo2, 10s elapsed]
alicloud_instance.default: Destruction complete after 11s

Destroy complete! Resources: 1 destroyed.

如果想要删除其中的某个资源,可以通过 -target=<资源类型>.<资源名称> 来指定要删除的资源,如 terraform destroy -target=alicloud_instance.default ,其结果跟只有一个资源的删除是一致的。
除此之外,归功于Terraform状态的一致性(后面会讲到)的特点,还有一种间接删除资源的方式。上文中提到,当模板发生变更的时候, apply 命令会判断资源不一致而导致触发资源的变更,因此,我们可以在模板中把想要删除的资源定义移除,然后运行 apply 命令来完成资源的移除。

3.4 State:资源的状态存储

细心的读者可能会发现,在执行 show 和 state list 命令时,执行速度非常快,随着命令的结束,资源的属性就被快速展示,而其他命令的执行都需要等几秒钟甚至几分钟,这个跟Terraform的实现机制有关。Terraform在完成资源的创建和修改之后,会将资源的最新的状态和属性存储在一个称之为 state 的文件中,文件名默认为 terraform.tfstate ,文件的默认存储位置是资源模板所在的目录。这个 state 文件可以看作是Terraform存储资源属性的“数据库”,当执行 show 和 state list 命令时,Terraform直接读取的是 state 文件,无需调用云平台的API,而其他的命令需要与API交互后返回。

state 文件非常重要, 它只从属于一个特定的模板,模板变, state 变。因此,如果 state 文件被损坏或者被删除,Terraform会认为其管理的资源发生了变更和移除(虽然实际的资源可能依然存在于云平台),此时再执行 apply 命令将会按照模板的定义变跟或者重建资源,直到模板对资源的定义与 state 中保存的保持一致。

state 与模板的依附关系在团队协作管理的时候尤为重要,在拷贝模板代码的同时,如果想维护同一套资源, state 也需要一起拷贝,这在无形中增加了代码维护的成本。为了解决这个问题,Terraform提供了远端存储 state 的能力 remote state ,正如前文提到的,可以将 state 文件存放在阿里云的OSS上,以实现模板与 state 的管理分离。

模板与 state 的高度一致性也是Terraform的一个亮点,可以说虽然Terraform是面向客户端的,但它也是有状态,这也意味着Terraform所管理的资源,不能通过其他工具和服务(如控制台,阿里云CLI,API等)来变更资源,否则,Terraform会在下次执行 apply 时因为状态的不一致而触发变更。

3.5 Data Source:基础设施的动态查询

对资源的查询是运维人员或者系统最常使用的操作,比如,查看某个Region下有哪些可用区,某个可用区下有哪些实例规格,每个Region下有哪些镜像,当前账号下有多少机器等。通过对资源及其属性的查询可以帮助和引导开发者进行下一步的操作。

除此之外,在编写Terraform模板时,Resource使用的参数有些是固定的静态变量,但有些情况下参数变量不确定或者可选值不清楚或者参数可能随时变化。比如我们创建ECS 实例时,通常需要指定我们自己的镜像ID和实例规格,首先要知道某个镜像ID对应的字符串,特定CPU核数和内存对应的实例规格;创建VSwitch的时候,需要知道某个Region下有哪些可用区等,当然,我们可以通过控制台或者帮助文档手动查询到这些信息,但是一方面查找不方便,另一方面,我们的模板可能随时会更新。如果在代码中硬编码ImageID,InstanceType和可用区等信息,一旦我们更新这些信息,模板就需要重新修改代码,非常不灵活。

在Terraform 中,Data Source 提供的就是一个查询资源的功能,每个Data Source实现对一个特定资源的动态查询:在模板中定义过滤条件,执行 plan 或者 apply 即可动态返回符合条件的资源。在编写Resource代码时非常方便,通过引用的方式可将Data Source的结果动态呈现给Resource。

Data Source通过 data 关键字声明,如下:

// Images data source for image_id
data "alicloud_images" "default" {
  most_recent = true
  owners      = "system"
  name_regex  = "^ubuntu_18.*_64"
}
data "alicloud_zones" "default" {
  available_resource_creation = "VSwitch"
  enable_details              = true
}
// Instance_types data source for instance_type
data "alicloud_instance_types" "default" {
  availability_zone = data.alicloud_zones.default.zones.0.id
  cpu_core_count    = 2
  memory_size       = 4
}
resource "alicloud_instance" "web" {
  image_id        = data.alicloud_images.default.images[0].id
  instance_type   = data.alicloud_instance_types.default.instance_types[0].id
  instance_name   = "my-first-vm"
  system_disk_category = "cloud_ssd"
  ...
}

如上例子中的ECS Instance没有指定镜像ImageID和实例规格,而是通过 data 引用:Terraform运行时将首先根据镜像名称前缀选择系统镜像,如果同时有多个镜像满足条件,则选择最新的镜像。实例规格也是类似,在符合创建VSwitch的某个可用区下选择2核4G的实例规格进行返回,并将其中的第一个值赋值给Resource Instance。

4 一分钟部署ECS集群

读到此处,我们再回头考虑文章开始提到的:在阿里云控制台上需要20分钟甚至更久的时间来初始化一个经典的VPC网络架构。如果要在这个架构中搭建一个ECS集群,那么花费的时间将会更长。
                                           
如图展示了在一个VPC网络环境下,搭建一个单可用区的ECS集群,并通过Nat网关和EIP实现与公网环境的互通。
对于这样的一个网络架构,如果通过控制台来一步步搭建,至少需要十几步的操作和若干页面间的来回切换,费时又费力。但如果交给Terraform来做,借助已经实现的Module terraform-alicloud-ecs-cluster,只需一键就可在1分钟内搞定16个资源。

// 在杭州部署含6个节点的集群
module "cluster" {
  source        = "terraform-aicloud-modules/ecs-cluster/alicloud"
  region_id     = "cn-hangzhou"
  cluster_size  = 6
  instance_name = "one-min-deploy-ecs-cluster"
}

【此处有视频,可点击链接 听说“一分钟就能部署阿里云ECS集群”?

如果想实现网络架构的跨Region复制或者同时部署,只需修改或者增加Region,执行 apply 命令即可。

// 在杭州部署含6个节点的集群
module "cluster-cn" {
  source        = "terraform-aicloud-modules/ecs-cluster/alicloud"
  region        = "cn-hangzhou"
  cluster_size  = 6
  instance_name = "one-min-deploy-ecs-cluster"
}
// 在德国部署含8个节点的集群
module "cluster-eu" {
  source        = "terraform-aicloud-modules/ecs-cluster/alicloud"
  region        = "eu-central-1"
  cluster_size  = 8
  instance_name = "one-min-deploy-ecs-cluster"
}
...

5 写在最后

Terraform 是一个功能强大、使用简单的资源编排工具,秉承IaC的理念,将资源管理转换为代码模板管理,消除了大量重复的劳动,在大大降低资源管理复杂度的同时,提升了资源管理的灵活性;简单明了的编写语法,无需很深的编程功底,降低了开发者的学习门槛;资源状态的高度一致性,在保证资源有效管理的同时,简化了多人协作的流程和成本。

“提效、降成本”在Terraform帮助企业上云,迁云和管理云中得到了很好的体现。正如上文演示的,一分钟内快速初始化一个含6个节点的ECS集群和多Region的快速复制是对部署效率的极大提升。

阿里云对Terraform的支持力度只会越来越大,保持与阿里云控制台资源管理功能的一致性是阿里云Provider追求的目标,更多的产品和功能将持续不断的体现在Terraform中,基于Terraform Module的解决方案也将陆续推出,真正做到一个工具实现对阿里云所有资源的统一管理。

Terraform的用法非常多样灵活,本文只是带领大家了解Terraform,指导如何在阿里云上使用Terraform,后续将持续推出一系列文章来介绍更多高级的功能,并在“Aliyun开放平台”公众号中同步,尽情期待。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
23天前
|
编解码 对象存储
阿里云视频转码转码模板-配置工作流
阿里云视频转码转码模板-配置工作流
14 0
|
2天前
|
弹性计算 JavaScript Java
阿里云服务器搭建部署宝塔详细流程
以下是内容的摘要: 本文主要介绍了在阿里云上创建和配置服务器环境的步骤,包括注册阿里云账号、实名认证、购买和设置服务器、域名的获取与备案、以及使用宝塔面板安装和配置环境。首先,用户需要注册阿里云账号并进行实名认证,选择合适的服务器配置。接着,购买服务器后,要准备并备案域名,以便通过友好的网址访问网站。在服务器上安装宝塔面板,可以方便地管理和配置LAMP/LNMP/Tomcat/Node.js等应用环境。完成这些步骤后,用户还需要在宝塔面板中安装MySQL、Redis等数据库,部署Java或Vue项目,并配置相关端口。最后,将前端项目打包上传至服务器,并设置站点,即可实现网站的上线。
|
2天前
|
应用服务中间件 Linux 开发工具
如何在阿里云服务器快速搭建部署Nginx环境
以下是内容的摘要: 本文档主要介绍了在阿里云上购买和配置服务器的步骤,包括注册阿里云账号、实名认证、选择和购买云服务器、配置安全组、使用Xshell和Xftp进行远程连接和文件传输,以及安装和配置Nginx服务器的过程。在完成这些步骤后,你将能够在服务器上部署和运行自己的网站或应用。
|
4天前
|
NoSQL 关系型数据库 MySQL
阿里云服务器部署项目流程
本文主要讲解阿里云服务器的部署,如何选择配置等
|
7天前
|
Java 应用服务中间件 Linux
阿里云服务器部署多个tomcat
阿里云服务器部署多个tomcat
|
18天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0
|
1月前
|
域名解析 弹性计算 数据可视化
如何使用云服务器ECS搭建网站?阿里云云服务器ECS部署网站新手教程
本文介绍了在阿里云ECS上自助建站的流程。建站方式包括自助建站、模板建站和定制建站,适合个人或小企业用户。建站步骤涉及准备服务器、配置安全组规则、部署网站、购买和备案域名以及解析域名。此外,文章还提及了产品计费和常见问题,提供相关服务如架构设计、迁云服务和基础设置服务等。
381 0
|
1月前
|
弹性计算 运维 安全
手把手教你入门部署幻兽帕鲁服务器:2024年阿里云搭建幻兽帕鲁Palworld联机服务器新手教程
手把手教你入门部署幻兽帕鲁服务器:2024年阿里云搭建幻兽帕鲁Palworld联机服务器新手教程。对于热衷《幻兽帕鲁》这款开放世界生存制作游戏的粉丝而言,拥有个人游戏服务器无疑是令人心动的。这款由Pocketpair开发的游戏,在2024年1月18日推出了其抢先体验版,它凭借广阔的游戏世界和丰富的玩法——如收集神奇的生物“帕鲁”,让它们参与战斗、建造、农耕和工业生产等——赢得了大量玩家的喜爱。现在,我将为大家详细指导如何在阿里云服务器上轻松一键部署《幻兽帕鲁》的联机服务器。
1083 2
|
25天前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
|
29天前
|
存储 分布式计算 网络协议
阿里云服务器内存型r7、r8a、r8y实例区别参考
在阿里云目前的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y这几个实例规格,相比于活动内的经济型e、通用算力型u1实例来说,这些实例规格等性能更强,与计算型和通用型相比,它的内存更大,因此这些内存型实例规格主要适用于数据库、中间件和数据分析与挖掘,Hadoop、Spark集群等场景,本文为大家介绍内存型r7、r8a、r8y实例区别及最新活动价格,以供参考。
阿里云服务器内存型r7、r8a、r8y实例区别参考