跳至主要内容

terraform_remote_state 数据源

terraform_remote_state 数据源使用来自指定状态后端的最新状态快照来检索其他 OpenTofu 配置的根模块输出值。

您可以使用 terraform_remote_state 数据源,而无需要求或配置提供者。它始终通过具有 源地址 terraform.io/builtin/terraform 的内置提供者提供。该提供者不包含任何其他资源或数据源。

在配置之间共享数据的替代方法

使用根模块输出共享数据很方便,但它有缺点。虽然 terraform_remote_state 只暴露输出值,但其用户必须访问整个状态快照,其中通常包含一些敏感信息。

只要可能,我们建议将数据明确发布到单独的位置以供外部使用,而不是通过远程状态访问它。这样您就可以对共享信息和状态快照应用不同的访问控制。

要在配置之间明确共享数据,可以使用各种提供者中的受管资源类型和数据源对,包括(但不限于)以下内容

系统使用... 发布使用... 读取
阿里云 DNS
(用于 IP 地址和主机名)
alicloud_alidns_record 资源类型正常 DNS 查找,或 dns 提供者
亚马逊 Route 53
(用于 IP 地址和主机名)
aws_route53_record 资源类型正常 DNS 查找,或 dns 提供者
亚马逊 S3aws_s3_object 资源类型aws_s3_object 数据源
亚马逊 SSM 参数存储aws_ssm_parameter 资源类型aws_ssm_parameter 数据源
Azure 自动化azurerm_automation_variable_string 资源类型azurerm_automation_variable_string 数据源
Azure DNS
(用于 IP 地址和主机名)
azurerm_dns_a_record 资源类型正常 DNS 查找,或 dns 提供者
Google Cloud DNS
(用于 IP 地址和主机名)
google_dns_record_set 资源类型正常 DNS 查找,或 dns 提供者
Google Cloud Storagegoogle_storage_bucket_object 资源类型google_storage_bucket_object 数据源http 数据源
HashiCorp Consulconsul_key_prefix 资源类型consul_key_prefix 数据源
HashiCorp Terraform Cloud正常 outputs terraform 块tfe_outputs 数据源
Kuberneteskubernetes_config_map 资源类型kubernetes_config_map 数据源
OCI 对象存储oci_objectstorage_bucket 资源类型oci_objectstorage_bucket 数据源

与使用 terraform_remote_state 相比,使用单独的显式配置存储的一个主要优点是,数据可能还可以被除 OpenTofu 之外的其他系统读取,例如您计算实例中的配置管理或调度系统。因此,我们建议选择您的其他基础设施可能利用的配置存储。例如

  • 如果您希望共享 IP 地址和主机名,您可以将它们发布为私有 DNS 区域中的正常 DNS AAAAACNAMESRV 记录,然后配置您的其他基础设施以引用该区域,以便您可以通过系统的内置 DNS 解析器找到基础设施对象。
  • 如果您使用 HashiCorp Consul,那么将数据发布到 Consul 键值存储或 Consul 服务目录可以使该数据也可以通过 Consul TemplateHashiCorp Nomad template 节访问。
  • 如果您使用 Kubernetes,那么您可以 使 Config Maps 可用于您的 Pod

上面列出的一些数据存储专门用于存储小的配置值,而另一些则是通用的 Blob 存储系统。对于那些通用系统,您可以分别使用 jsonencode 函数jsondecode 函数 来存储和检索结构化数据。

您可以通过编写一个包含必要数据源配置和任何必要的后处理(例如 JSON 解码)的 仅数据模块 来封装检索已发布配置数据的实现细节。如果切换到不同的策略来在多个 OpenTofu 配置之间共享数据,您可以在以后更改该模块。

示例用法(remote 后端)

代码块
data "terraform_remote_state" "vpc" {
backend = "remote"

config = {
organization = "hashicorp"
workspaces = {
name = "vpc-prod"
}
}
}

resource "aws_instance" "foo" {
# ...
subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}

示例用法(local 后端)

代码块
data "terraform_remote_state" "vpc" {
backend = "local"

config = {
path = "..."
}
}

resource "aws_instance" "foo" {
# ...
subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}

参数参考

支持以下参数

  • backend - (必需) 要使用的远程后端。

  • workspace - (可选) 要使用的 OpenTofu 工作区,如果后端支持工作区。

  • config - (可选; 对象) 远程后端的配置。尽管此参数被列为可选,但大多数后端都需要一些配置。

    config 对象可以使用在等效的 terraform { backend "<TYPE>" { ... } } 块中有效的任何参数。有关详细信息,请参阅 您选择的后端的文档

  • defaults - (可选; 对象) 输出的默认值,以防状态文件为空或缺少必需的输出。

属性参考

除了以上内容外,还导出了以下属性

  • outputs - 一个对象,其中包含远程状态中每个根级 输出

仅根输出

仅公开来自远程状态快照的根级输出值,以便在您的模块中的其他地方使用。资源数据和来自嵌套模块的输出值不可访问。

如果您希望将嵌套模块输出值作为根模块输出值访问,则必须在根模块中显式配置一个传递。例如

例如

代码块
module "app" {
source = "..."
}

output "app_value" {
value = module.app.example
}

在此示例中,来自“app”模块的名为 example 的输出值可作为 app_value 根模块输出值访问。如果此配置不包含 output "app_value" 块,则该数据将无法通过 terraform_remote_state 访问。