我正在以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
数据源块中有相同的变量。这真的需要吗?
答案 0 :(得分:1)
terraform.backend
配置用于配置运行Terraform的Terraform上下文/目录的远程状态存储位置。
这允许您在不同机器之间共享状态,备份状态以及通过状态锁定在Terraform上下文的使用之间进行协调。
terraform_remote_state
data source与其他数据源一样,用于从外部源(在这种情况下为Terraform状态文件)中检索数据。
这使您可以从另一个Terraform上下文中检索存储在状态文件中的信息,并在其他地方使用。
例如,您可以在一个位置创建一个aws_elasticsearch_domain
,但是随后需要在另一个上下文中查找域的端点(例如,用于配置将日志发送到的位置)。当前没有用于ES域的数据源,因此您将需要在其他地方对端点进行硬编码,或者可以使用terraform_remote_state
数据源来查找它,如下所示:
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}"
}
#!/bin/bash
sed -i 's/|ES_DOMAIN|/${es_domain}/' >> /etc/logstash.conf
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}"
}