本文へスキップ

terraform_remote_state データソース

terraform_remote_state データソースは、指定されたステートバックエンドからの最新のステートスナップショットを使用して、別のOpenTofu構成のルートモジュールの出力値を取得します。

terraform_remote_state データソースは、プロバイダーを必要とせず、構成することもなく使用できます。ソースアドレスterraform.io/builtin/terraformを持つビルトインプロバイダーを介して常に利用可能です。そのプロバイダーには、他のリソースやデータソースは含まれていません。

構成間でデータを共有する代替方法

ルートモジュールの出力値を使用してデータを共有することは便利ですが、欠点もあります。terraform_remote_stateは出力値のみを公開しますが、ユーザーは機密情報を含む多くの場合、ステートスナップショット全体にアクセスする必要があります。

可能な限り、リモートステートを介してアクセスする代わりに、外部から利用可能なデータとして別々の場所に明示的にデータを公開することをお勧めします。これにより、共有情報とステートスナップショットに対して異なるアクセス制御を適用できます。

構成間でデータを明示的に共有するには、さまざまなプロバイダー(以下に限定されません)で管理対象リソースタイプとデータソースのペアを使用できます。

システム公開方法…読み込み方法…
Alibaba Cloud DNS
(IPアドレスとホスト名用)
alicloud_alidns_record リソースタイプ通常のDNSルックアップ、またはdnsプロバイダー
Amazon Route53
(IPアドレスとホスト名用)
aws_route53_record リソースタイプ通常のDNSルックアップ、またはdnsプロバイダー
Amazon S3aws_s3_object リソースタイプaws_s3_object データソース
Amazon SSM Parameter Storeaws_ssm_parameter リソースタイプaws_ssm_parameter データソース
Azure Automationazurerm_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 Object Storageoci_objectstorage_bucket リソースタイプoci_objectstorage_bucket データソース

terraform_remote_stateの代わりに個別の明示的な構成ストアを使用する主な利点は、データがOpenTofu以外のシステム(コンピューティングインスタンス内の構成管理システムやスケジューラーシステムなど)でも読み取れる可能性があることです。そのため、他のインフラストラクチャが利用できる可能性のある構成ストアを選択することをお勧めします。例えば

  • IPアドレスとホスト名を共有する場合は、それらをプライベートDNSゾーンの通常のDNS `A`、`AAAA`、`CNAME`、`SRV`レコードとして公開し、システムのビルトインDNSリゾルバーを介してインフラストラクチャオブジェクトを見つけることができるように、他のインフラストラクチャがそのゾーンを参照するように構成します。
  • HashiCorp Consulを使用する場合は、データをConsulキー/値ストアまたはConsulサービスカタログに公開することにより、Consul TemplateまたはHashiCorp Nomadtemplateスタンザからもそのデータにアクセスできます。
  • Kubernetesを使用する場合は、Config Mapを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経由でアクセスできません。