Terraform 概览

更新时间:

介绍 Terraform 的优势、工作步骤以及阿里云 Provider 的使用方式

Terraform 是 Hashicorp 开源的一款基础设施即代码 (IaC) 的工具,可让您以代码化的方式定义和管理云基础设施。Terraform 提供了“Provider”的插件机制,每个 Provider 面向一个独立的服务提供商的插件,可让您与不同的云服务提供商通过 API 与其进行交互,进而实现对不同云基础设施资源的自动化管理。您可以使用面向阿里云的 Terraform Provider 来定义和管理阿里云的基础设施。

使用 Terraform 的优势

使用 Terraform 定义和管理阿里云基础设施具有以下优势:

  • 通用性高

    Terraform 是配置和自动化管理阿里云基础设施最常用工具。您可以使用 Terraform Alibaba Cloud Provider 以声明式的语法和工具来配置和管理阿里云的资源。目前阿里云 Provider 已支持对上百款云产品和若干种资源类型的定义。

  • 复用性高

    Terraform 可让您按照不同场景的需求定义基础设施的最终状态,并通过对同一份配置文件的多次部署实现可重现的开发、测试和生产环境。

  • 误操作频率低

    Terraform 在执行操作前会生成执行计划,以此来预览和 Review 即将要变更的基础设施配置,避免在通过 Terraform 修改基础设施时出现意外情况。

  • 架构标准化

    Terraform 可以让您以标准化模块的形式实现对可重复使用的通用代码的封装和打包,以此提供用于创建云资源架构的标准界面。模块的引用,在通过提高架构可读性简化项目的同时,帮助团队以更易读的模块形式组织基础设施。

  • 状态一致性

    Terraform 会将配置文件中定义的基础设施的实际状态记录到状态文件中,并持续地跟踪部署中的所有资源。

使用 Terraform

Terraform 是使用面向配置的声明性语法来编写要定义的基础设施。使用此语法,您可以在 Terraform 配置文件中为基础设施定义自己期望的最终状态,然后基于此配置文件,通过 Terraform CLI 来实现对所定义的基础设施的创建和持续管理。

以下是 Terraform 的工作步骤:

  1. 在 Terraform 配置文件中描述您要定义的阿里云基础设施。

  2. 运行 terraform init命令,自动下载 Terraform Alibaba Cloud Provider 以支持对基础设施定义的解析和后续阿里云 API 的调用。

  3. 运行 terraform plan命令,以检查基础设施定义的正确性并生成执行计划。您可以通过查看计划预览定义好的基础设施状态并根据需要进行修改。

  4. 运行 terraform apply命令,以执行以下操作:

    • 基于执行计划,Terraform Alibaba Cloud Provider 调用相应的阿里云 OpenAPI,以完成对基础设施的创建和管理。

    • 创建一个 Terraform 状态文件,该状态文件是配置文件中的所定义的基础设施资源与实际基础设施资源的 JSON 格式映射。Terraform 保存此文件来了解基础设施的最新状态,并确定何时创建、更新和销毁基础设施资源。

  5. 之后,当您继续运行terraform apply时,Terraform 会使用状态文件中的映射将基础设施的实际状态与配置文件内容进行比较,并根据需要进行创建、更新或者销毁:

    • 如果状态文件中不存在配置文件中所定义的资源对象,则 Terraform 会创建该资源对象。

    • 如果状态文件中存在配置文件中所定义的资源对象,但其属性值与配置文件中的不一致,则 Terraform 会以配置文件中的为主更新该资源,以使其与配置文件中的定义相匹配。

    • 如果状态文件中存在配置文件中所定义的资源对象,并且该资源对象与配置文件中的定义相一致,则 Terraform 将保持不变,不对资源做任何操作。

    • 如果状态文件中的某个资源对象在配置文件中没有找到相应的定义,则 Terraform 将销毁该资源对象,并在成功销毁后从状态文件中移除。

阿里云 Provider

阿里云提供的 Terraform Alibaba Cloud Provider(alicloud)可让您定义和管理阿里云的基础设施资源,在使用该 Provider 之前,需要了解以下基本信息:

  1. Source 来源

    因历史发展原因,目前阿里云 Provider 存在两个 source 来源,但这两个 source 来源对应同一个 Provider 代码仓库,因此功能上没有任何差异:

    1. aliyun/alicloud: 阿里云官方维护的 Terraform Alibaba Cloud Provider,推荐大家使用

    2. hashicorp/alicloud: 历史上是由 Terraform 社区维护的 Terraform Alibaba Cloud Provider,后来转移为aliyun/alicloud,但依然保留hashicorp/alicloud的声明和定义方式,因此在使用 hashicorp/alicloud时将会遇到如下的提示信息:

      ╷
      │ Warning: Additional provider information from registry
      │ 
      │ The remote registry returned warnings for registry.terraform.io/hashicorp/alicloud:
      │ - For users on Terraform 0.13 or greater, this provider has moved to aliyun/alicloud. Please update your source in required_providers.
      ╵

      也正是因为历史遗留问题,当使用 Terraform Module 的时候,terraform init 命令依然会默认下载hashicorp/alicloud,并且在执行 terraform plan 和 terraform apply 会默认加载hashicorp/alicloud的配置。因此,当使用 Terraform Module 的时候,先保持使用hashicorp/alicloud

  2. 版本

    阿里云上的 Terraform Provider 版本使用语义化版本(Semantic Versioning)的命名方式,其格式是:<major>.<minor>.<patch>,即以点号.连接的三位非负整数,如 1.220.0。每一位版本号的含义如下:

    1. <major>:主版本号,即大版本升级号。当迭代到主版本号时,意味着 Provider 中所包含的资源和功能特性发生了巨大变化,包括但不限于依赖包的升级、弃用资源及资源属性的移除、资源属性类型和默认值的变更等,通常不兼容上一个主版本号。当前阿里云的 Terraform Provider 主版本号还处于 V1(1.xx.xx),因此每一个新的版本都具备向前兼容,同时所有的版本支持 Terraform 自身的所有版本,您可以放心使用。

    2. <minor>:次版本号,即小版本升级号。当我们在 Provider 中新增资源(Resource)或者数据源( DataSource)时将改动次版本号,但每次改动都是向前兼容的,这也意味着我们不会直接删除某个资源、资源属性或者修改资源属性类型等。必要的时候,我们会将其标记为弃用(Deprecated),然后在下一个大版本号中将其彻底删除。

    3. <patch>:修订号,即功能修复号。当因为某个现有资源(Resource)或者数据源( DataSource)新增功能或者修复某个功能问题或者完善文档内容时,我们将只改动修订号。

  3. 文档

    阿里云上的 Terraform Provider 的文档可以在两个站点上进行查看:

    1. Terraform Registry:由 Terraform 社区维护,Terraform Provider 新版本发布后会自动更新,默认显示最新 Provider 版本的内容,可通过切换版本号查看历史版本的内容。

    2. 阿里云文档:由阿里云维护,Terraform Provider 新版本发布后会自动更新,只显示最新 Provider 版本的内容。

  4. 下载来源

    当运行terraform init自动下载阿里云上的 Terraform Provider 时,总共有两个下载来源:

    1. Hashicorp Releases:Hashicorp 官方统一提供的下载源,包含了所有 Hashicorp 产品及生态插件包,阿里云的 Terraform Provider 也在其中,这也是默认的下载源。

    2. 阿里云镜像站:阿里云官方提供的下载源,只包含阿里云上 Terraform Provider 的各个版本包。如果你是国内开发者,推荐配置阿里云镜像站,以提升下载速度。如需了解如何配置阿里云镜像站,请参阅 Terraform Init 加速方案配置