在Terrform中配置远程状态似乎重复了吗?

时间:2019-01-22 10:31:57

标签: terraform

我正在以terraform形式配置远程状态:

provider "aws" {
  region = "ap-southeast-1"
}

terraform {
  backend "s3" {
    bucket = "xxx-artifacts"
    key = "terraform_state.tfstate"
    region = "ap-southeast-1"
  }
}

data "terraform_remote_state" "s3_state" {
  backend = "s3"
  config {
    bucket = "xxx-artifacts"
    key = "terraform_state.tfstate"
    region = "ap-southeast-1"
  }
}

似乎很重复,为什么会这样?我在terraform块和terraform_remote_state数据源块中有相同的变量。这真的需要吗?

1 个答案:

答案 0 :(得分:1)

terraform.backend配置用于配置运行Terraform的Terraform上下文/目录的远程状态存储位置。

这允许您在不同机器之间共享状态,备份状态以及通过状态锁定在Terraform上下文的使用之间进行协调。

terraform_remote_state data source与其他数据源一样,用于从外部源(在这种情况下为Terraform状态文件)中检索数据。

这使您可以从另一个Terraform上下文中检索存储在状态文件中的信息,并在其他地方使用。

例如,您可以在一个位置创建一个aws_elasticsearch_domain,但是随后需要在另一个上下文中查找域的端点(例如,用于配置将日志发送到的位置)。当前没有用于ES域的数据源,因此您将需要在其他地方对端点进行硬编码,或者可以使用terraform_remote_state数据源来查找它,如下所示:

elasticsearch / main.tf

resource "aws_elasticsearch_domain" "example" {
  domain_name           = "example"
  elasticsearch_version = "1.5"

  cluster_config {
    instance_type = "r4.large.elasticsearch"
  }

  snapshot_options {
    automated_snapshot_start_hour = 23
  }

  tags = {
    Domain = "TestDomain"
  }
}

output "es_endpoint" {
  value = "$aws_elasticsearch_domain.example.endpoint}"
}

logstash / userdata.sh.tpl

#!/bin/bash
sed -i 's/|ES_DOMAIN|/${es_domain}/' >> /etc/logstash.conf

logstash / main.tf

data "terraform_remote_state" "elasticsearch" {
  backend = "s3"
  config {
    bucket = "xxx-artifacts"
    key = "elasticsearch.tfstate"
    region = "ap-southeast-1"
  }
}

data "template_file" "logstash_config" {
  template = "${file("${path.module}/userdata.sh.tpl")}"

  vars {
    es_domain = "${data.terraform_remote_state.elasticsearch.es_endpoint}"
  }
}

resource "aws_instance" "foo" {
  # ...
  user_data = "${data.template_file.logstash_config.rendered}"
}