五分钟入门阿里云Terraform OSS Backend

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 生态工具Terraform的资源编排能力在持续提升企业上云效率,降低运维成本方面越来越专业和完善。对于一个企业和团队来讲,如何保证State的安全性和如何实现对同一份资源的协同管理也是必须要关心的问题。本文将详细介绍如何在阿里云上解耦对资源模板与State管理,消除团队协作的障碍。

1.png
作者 | 何贵民 阿里云开放平台高级开发工程师 主要负责开源生态工具(Terraform,Ansible,Spinnaker)与阿里云的集成,专注于借助主流开源工具帮助企业上阿里云和云上运维提效

1 Terraform State简介

Terraform State 是用来存放基础设施资源及其属性和状态的机制。上篇文章《一分钟部署阿里云ECS集群》对State做了详细的阐述,本文将在此基础上做一点补充。

Terraform State 从存储形态上分为两种:

  1. local:本地存储
    即资源状态存放在本地的一个state文件中,默认为执行目录下的名为 terraform.tfstate 文件。此方式也是Terraform默认的存储形式。
  2. remote:远端存储
    即资源状态存放在远端的一个服务中,如阿里云的OSS,Terraform Cloud,HashiCorp Consul等。远端存储带来的好处是实现了与资源定义模板管理的解耦,可以让State脱离本地磁盘而存储,在提升State安全性的同时,团队协作可以不再受制于Terraform的执行环境,执行目录和多人执行时间的限制,提升了管理的灵活性。

Terraform State的存储是由一个称之为 Backend 的组件决定的,local state使用的是local backend。除了local backend,其他所有的backend在使用之前都需要在模板中显示定义并通过 terraform init 来实现加载和配置。

2 Terraform Backend简介

Backend 是存储State的机制,它决定了State数据的加载逻辑和Terraform命令执行之后State的数据的更新过程。如下是Terraform生命周期中与Backend的交互过程。

开发者2.png

Terraform 通过 init 命令完成Backend的加载和配置。执行 planapply 的命令,在加载资源模板的同时,通过Backend加载State中的存量数据(如果有);命令结束后,将Provider/Provisioner响应中的数据通过Backend更新到State中,最终达到State数据与模板定义的一致。

从功能实现级别的角度,Backend可以分为两种:

  1. Standard
    即State管理的标准化实现,覆盖标准的功能点“State存储”和“State加锁”。这种Backend目前只适用于在本地系统上运行所有操作的场景,尽管也实现了对State的远程存储,但Backend的执行逻辑仍发生在本地并通过直接调用API请求来完成。

目前这种Backend总共有13种,阿里云的OSS Backend也属于此类。

  1. Enhanced
    可以看作是 Standard 的加强版,即Backend的执行逻辑不仅可以发生在本地,还可以通过API或者CLI的方式发生在远端。目前这种Backend的种类有两种,一是 local ,另一个是只支持Terraform Cloud的 remote

阿里云也提供了一个标准的Backend - oss ,在Terraform 0.12.2中予以支持,并在Terraform 0.12.6 和 0.12.8 版本中对 oss 进行了升级,支持 profile 设置, ecs_role_nameassume_role 等鉴权方式。

3 阿里云 OSS Backend详解

OSS Backend 是基于阿里云的表格存储服务(OTS)和对象存储服务(OSS)实现的Standard Backend,其中OTS用来存储运行过程中产生的“Locking”,保证State的正确性和完整性;OSS用来存储最终的State文件。接下来将详细介绍OSS Backend。

3.1 工作原理

OSS Backend的工作流程可以分为加锁,存储State,释放锁三步,下图是一个简单的工作流程图:

开发者1.png

主要包含以下几个部分:

  • 运行Terraform命令后,Backend首先会从OTS中获取LockID,如果已经存在,表明State被损坏或者有人正在操作,返回报错;否则,自动生成一个LockID并存储在OTS中;
  • 如果是 init 命令,初次会生成一个新的state文件并存储在OSS的指定目录下,并释放LockID;
  • 如果是 planapplydestroy 等涉及到修改State的命令,会在命令结束后将最新的数据同步更新到State文件中,并释放LockID;
  • 如果是 state ,`` show 等不涉及修改的操作,会直接读取State内容并返回。

3.2 模板定义

和Provider一样,Backend在使用时同样需要在模板中定义。Backend 通过关键字 backend 来声明:


terraform {
  backend "oss" {
    profile             = "terraform"
    bucket              = "terraform-oss-backend-1024"
    key                 = "prod/terraform.tfstate"
    tablestore_endpoint = "https://tf-oss-backend.cn-hangzhou.ots.aliyuncs.com"
    tablestore_table    = "terraform-oss-backend-1024"
    acl                 = "private"
    encrypt             = true
    ...
  }
}

backend 的定义包含如下几个部分:

  • terraform 运行主体,定义了Backend的操作主体。Backend 的逻辑实现是存放在 Terraform 仓库中的,服务于所有Provider和Provisioner,因此它的运行主体是 terraform ,而不是具体某个Provider;
  • oss Backend类型,用来标识一个特定的Backend;
  • 大括号里面的内容为参数配置,用来定义Backend属性,比如鉴权信息,OSS Bucket的名称,存放路径,OTS配置信息等。更多参数和含义可参考官方文档:
    https://www.terraform.io/docs/backends/types/oss.html

如上代码声明了一个 oss backend,其中state存储在名为“terraform-oss-backend-1024”的bucket中,对应的文件为“prod/terraform.tfstate”,并声明state文件为只读和加密;锁信息存储在一个名为“terraform-oss-backend-1024”的表格中,这个表格位于杭州的OTS实例“tf-oss-backend”中。

3.3 一键生成OSS Backend模板

为了更快捷的编写OSS Backend模板,阿里云提供了一个Terraform Module:remote-backend,可用来自动生成OSS Backend模板:

module "oss-backend" {
  source                   = "terraform-alicloud-modules/remote-backend/alicloud"
  create_backend_bucket    = true
  create_ots_lock_instance = true
  create_ots_lock_table    = true
  region                   = "cn-hangzhou"
  state_name               = "new/terraform.tfstate"
  encrypt_state            = true
}

运行完成后,会在当前目录下生成一个名为 terraform.tf 的配置文件,文件内容即为已经配置好的OSS Backend:

terraform {
backend "oss" {
bucket              = "terraform-remote-backend-94a22ee-0714-e8ef-8573-21df8b021f86"
    prefix              = "env:"
    key                 = "new/terraform.tfstate"
    acl                 = "private"
    region              = "cn-hangzhou"
    encrypt             = "true"
    tablestore_endpoint = "https://tf-oss-backend.cn-hangzhou.ots.aliyuncs.com"
    tablestore_table    = "terraform_remote_backend_lock_table_38001042_0714_e8ef_8573_21df8b021f86"
  }
}

生成后的 terraform.tf 可以直接跟目标模板放在同一个目录下,以用于对后续State的远端存储。

如果想把生成 terraform.tf 的state也存放在上述的OSS Backend中,只需再次运行 terraform init 命令,本地目录下的local state将会自动同步到OSS Backend中,如下所示:

开发者3.png

总结

OSS Backend遵循Standard Backend的实现逻辑,覆盖“State存储”和“State加锁”两大功能点,保证了State的安全性和体验的一致性。借助OSS服务的安全,高可靠和OTS服务的实时访问等特点,为用户提供了标准的,安全可靠的远端存储State的能力。

OSS Backend对Terraform用户,尤其是阿里云Provider的用户无疑是一大利好,在降低资源管理成本的同时,为团队协作提供了更多的便利。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
4月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
5天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
13天前
|
存储 Linux 持续交付
史上最全 Terraform 入门教程,助你无坑入门!
【10月更文挑战第26天】这是一个全面的 Terraform 入门教程,涵盖了 Terraform 的基本概念、安装步骤、基础配置、变量和输出变量的使用、模块的定义与使用,以及状态管理。通过实例讲解如何创建本地文件资源和 AWS S3 桶,帮助初学者快速上手并掌握 Terraform 的核心功能。
|
29天前
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
112 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
3月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
|
4月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
存储 运维 安全
阿里云OSS的优势
【7月更文挑战第19天】阿里云OSS的优势
178 2
|
4月前
|
存储 API 开发工具
阿里云OSS
【7月更文挑战第19天】阿里云OSS
165 1
|
4月前
|
存储 弹性计算 对象存储
预留空间是什么?阿里云OSS对象存储预留空间说明
阿里云OSS预留空间是预付费存储产品,提供折扣价以锁定特定容量,适用于抵扣有地域属性的Bucket标准存储费用及ECS快照费。通过购买预留空间,如500GB通用预留+100GB标准-本地冗余存储包,用户可优化成本。
182 4
|
4月前
|
人工智能 对象存储
【阿里云AI助理】自家产品提供错误答案。阿里云OSS 资源包类型: 下行流量 地域: 中国内地通用 下行流量包规格: 300 GB 套餐: 下行流量包(中国内地) ,包1年。那么这个是每月300GB,1年是3600GB的流量;还是1年只有300GB的流量?
自家产品提供错误答案。阿里云OSS 资源包类型: 下行流量 地域: 中国内地通用 下行流量包规格: 300 GB 套餐: 下行流量包(中国内地) ,包1年。那么这个是每月300GB,1年是3600GB的流量;还是1年只有300GB的流量?
124 1

推荐镜像

更多