Terraform Backend 介绍

举报
Dance-Monkey 发表于 2020/01/19 16:26:55 2020/01/19
【摘要】 默认情况下,通过Terraform完成资源的创建和修改后,会将资源的状态和属性信息会保存在当前目录下的 terraform.tfstate 文件中。通过Terraform的Backend组件可以将 state 文件存储在不同的远端服务中,实现模板与 state 的管理分离。由于华为云的OBS 兼容AWS S3接口,我们可以利用S3 Backend将 state 文件存储在华为云的OBS桶中。

1 Terraform state 和Backend简介

        默认情况下,通过Terraform完成资源的创建和修改后,会将资源的状态和属性信息会保存在当前目录下的 terraform.tfstate 文件中。这个 state 文件可以看作是Terraform存储资源属性的映射,当执行 'terraform show'  命令时,Terraform直接读取这个 state 文件,无需再去调用云平台的API查询。

        Terraform后续的 'plan' 和 'apply' 操作,都是基于当前的模板配置和 state 文件进行比较。如果 state 文件被损坏或者被删除,Terraform会认为其管理的资源也发生了变更和移除。此时再执行 'apply' 命令将会按照模板的定义变更或者重建资源,直到模板对资源的定义与 state 中的映射保持一致。如果实际的资源依然存在于云平台中,这将会导致资源的重复创建或者创建失败。

        在团队协作中,如果想维护同一套资源,需要将模板配置的代码和 state 文件一起拷贝,这无形中增加了代码维护的成本。为了解决这个问题,Terraform提供了远端存储的能力 ,即将 state 文件存放在远端的一个服务中,实现模板与 state 的管理分离,提升了管理的灵活性。

        Backend 是实现远端存储的机制,通过不同类型的 Backend,可以将 state 文件存储在不同的远端服务中,如AWS S3,HashiCorp Consul,etcd等。Backend 按照支持的功能特性,可以分为标准型增强型两种:

  • 标准型:实现 state 文件的远端存储和状态锁定(可选) 功能,目前这种类型的 Backend 总共有13种 ;

  • 增强型:在实现标准型的基础上支持远程操作,即可以将 Backend 的操作和API调用在远端执行,这样可以保证环境一致性。目前只有 'remote' 类型的Backend 支持远程操作,且远程执行环境为 Terraform Cloud;

2 在华为云中使用S3 Backend

        由于华为云的OBS (对象存储服务) 兼容AWS S3接口,且S3 Backend支持自定义endpoint,我们可以利用S3 Backend将 state 文件存储在OBS中。操作步骤如下:

2.1 增加Backend声明

terraform {
  backend "s3" {
    bucket   = "terraformbucket"
    key      = "myproject/terraform.tfstate"
    region   = "cn-north-1"
    endpoint = "obs.cn-north-1.myhuaweicloud.com"

    skip_region_validation      = true
    skip_metadata_api_check     = true
    skip_credentials_validation = true
  }
}

参数说明

  • bucket, key: 华为云中的OBS桶和对象;

  • region: OBS桶所属的区域;

  • endpoint: OBS为每个区域提供的终端节点 ,各区域的终端节点详情参见地区和终端节点

  • skip_*: 调用AWS S3 API时跳过部分参数的校验和检查;

2.2 定义AK/SK环境变量

        OBS服务通过AK/SK对请求进行认证,用户可以在IAM服务中获取AK和SK,获取的方法请参见获取访问密钥 。然后将AK/SK导出为如下环境变量

export AWS_ACCESS_KEY_ID="myaccesskey"
export AWS_SECRET_ACCESS_KEY="mysecretkey"

2.3 terraform init

        配置完Backend后,需要执行terraform init命令对Backend进行初始化,首次执行时会有如下提示:

$ terraform init

Initializing the backend...
Backend configuration changed!

Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
...
Terraform has been successfully initialized!

        如果初始化失败,则会有如下提示:

Error: No valid credential sources found for AWS Provider.
Please see https://terraform.io/docs/providers/aws/index.html for more information on
providing credentials for the AWS Provider

        此时,应检查Backend的配置参数和环境变量是否正确。如果当前目录下已经存在`terraform.tfstate`文件,则会提示是否将这个`state`文件同步至远端。

$ terraform init

Initializing the backend...
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "s3" backend to the
  newly configured "s3" backend. No existing state was found in the newly
  configured "s3" backend. Do you want to copy this state to the new "s3"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value:

        输入"yes"后继续执行。

3 总结

        Terraform Backend组件实现了将 state 文件在远端存储和管理的能力,可以降低资源管理成本,同时又为团队协作提供更多的便利。通过S3 Backend 可以将 state 文件存储在华为云的OBS桶中。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。