You need to enable JavaScript to run this app.
导航
Backend
最近更新时间:2024.05.13 17:58:47首次发布时间:2022.05.17 12:06:31

通过Terraform完成资源的创建和修改后,默认会将资源的状态和属性信息保存在当前目录下的terraform.tfstate文件中,此文件可以看作为Terraform存储资源属性的映射,执行terraform show命令即可读取此文件查看资源状态和属性信息。

执行terraform plan/apply操作后,会检查待执行的变更和terraform.tfstate文件是否一致,如果tfstate文件被损坏或被删除,Terraform会认为其管理的资源发生了变更和移除,将会按照待执行的变更重建资源。如果此时实际的资源依然存在,将会导致资源的重复创建或者创建失败。

当多个团队维护同一套资源时,需要拷贝多份资源配置文件和tfstate文件,增加了代码维护成本。

Backend是Terraform中用于实现远端存储的元素,可以将tfstate文件存放在远端服务中,例如AWS S3、HashiCorp Consul、etcd等,实现代码与文件的管理分离,提高了管理的灵活性。Backend通过声明backend嵌套块,并指定不同的Backend 类型标签实现。

使用S3 Backend

火山引擎的TOS(即对象存储) 提供兼容AWS S3的接口,且S3 Backend支持自定义endpoint,您可以利用S3 Backend将tfstate文件存储在火山引擎TOS桶中。
操作步骤如下:

说明

  • 使用这种模式,需要使用TOS的S3域名,格式为:https://tos-s3-${region}.volces.com,例如https://tos-s3-cn-beijing.volces.com
  • Terraform 从 1.6.x 版本开始对 backend 的相关参数做了修改,下面的示例将分别给出新版本和 1.5.x 前旧版本的参数配置。
  1. 在terraform块中声明backend嵌入块。

    terraform {
    	required_version = "< 1.6.0"
    	
      backend "s3" {
        bucket   = "backend-test" #存储桶名称
        key      = "backend-test/terraform.tfstate" #对象名称
        region   = "cn-beijing" #存储桶所在地域
        endpoint = "https://tos-s3-cn-beijing.volces.com" #TOS的S3域名
    
        skip_region_validation      = true
        skip_metadata_api_check     = true
        skip_credentials_validation = true
      }
    }
    
    terraform {
      required_version = ">= 1.6.0"
    
      backend "s3" {
        bucket   = "backend-test" #存储桶名称
        key      = "backend-test/terraform.tfstate" #对象名称
        region   = "cn-beijing" #存储桶所在地域
        endpoints = {
          s3 = "https://tos-s3-cn-beijing.volces.com" #TOS的S3域名
        }
    
        skip_region_validation      = true
        skip_metadata_api_check     = true
        skip_credentials_validation = true
        skip_requesting_account_id  = true
        skip_s3_checksum            = true
      }
    }
    
  2. 定义AK/SK环境变量。

    $ export AWS_ACCESS_KEY_ID="******"
    $ export AWS_SECRET_ACCESS_KEY="******"
    
  3. 执行terraform init命令。

    terraform init
    2022/04/13 12:18:02 [WARN] Log levels other than TRACE are currently unreliable, and are supported only for backward compatibility.
     Use TF_LOG=TRACE to see Terraform's internal logs.
     ----
    
    Initializing the backend...
    
    Initializing provider plugins...
    
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
    

    说明

    当工作目录已经初始化后,更改了 backend 相关配置,需要重新执行 init 命令,并加上相关参数:

    • terraform init -reconfigure 重新配置 backend,忽略任何已存在的 state 文件。
    • terraform init -migrate-state 重新配置 backend,并尝试自动迁移已存在的 state 文件。