- OpenTofu言語
- ステート
- terraform_remote_state データソース
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 S3 | aws_s3_object リソースタイプ | aws_s3_object データソース |
Amazon SSM Parameter Store | aws_ssm_parameter リソースタイプ | aws_ssm_parameter データソース |
Azure Automation | 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 Storage | google_storage_bucket_object リソースタイプ | google_storage_bucket_object データソースとhttp データソース |
HashiCorp Consul | consul_key_prefix リソースタイプ | consul_key_prefix データソース |
HashiCorp Terraform Cloud | 通常のoutputs terraformブロック | tfe_outputs データソース |
Kubernetes | kubernetes_config_map リソースタイプ | kubernetes_config_map データソース |
OCI Object Storage | oci_objectstorage_bucket リソースタイプ | oci_objectstorage_bucket データソース |
これらは公式OpenTofuプロバイダーの一部の一般的なオプションですが、パートナーやコミュニティのプロバイダーを含む、ここでリストするには多すぎる構成ストレージオプションがあります。管理対象リソースタイプと対応するデータソースのペアは、OpenTofu構成間でデータを共有するために使用できます。他の可能性を見つけるには、個々のプロバイダーのドキュメントを参照してください。
terraform_remote_state
の代わりに個別の明示的な構成ストアを使用する主な利点は、データがOpenTofu以外のシステム(コンピューティングインスタンス内の構成管理システムやスケジューラーシステムなど)でも読み取れる可能性があることです。そのため、他のインフラストラクチャが利用できる可能性のある構成ストアを選択することをお勧めします。例えば
- IPアドレスとホスト名を共有する場合は、それらをプライベートDNSゾーンの通常のDNS `A`、`AAAA`、`CNAME`、`SRV`レコードとして公開し、システムのビルトインDNSリゾルバーを介してインフラストラクチャオブジェクトを見つけることができるように、他のインフラストラクチャがそのゾーンを参照するように構成します。
- HashiCorp Consulを使用する場合は、データをConsulキー/値ストアまたはConsulサービスカタログに公開することにより、Consul TemplateまたはHashiCorp Nomadの
template
スタンザからもそのデータにアクセスできます。 - 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>" { ... } }
ブロックで有効な引数を使用できます。詳細は、選択したバックエンドのドキュメントを参照してください。注バックエンドの設定でネストされたブロックが必要な場合は、オブジェクト値を持つ通常の属性としてここで指定します。(例:
workspaces = { ... }
をworkspaces { ... }
の代わりに使用します。) -
defaults
- (オプション; オブジェクト) ステートファイルが空であるか、必要な出力がない場合の出力のデフォルト値。
属性リファレンス
上記に加えて、以下の属性がエクスポートされます。
outputs
- リモートステートのすべてのルートレベルの出力を含むオブジェクト。
ルート出力のみ
リモートステートのスナップショットからのルートレベルの出力値のみが、モジュール内の他の場所で使用するように公開されます。ネストされたモジュールのリソースデータと出力値にはアクセスできません。
ネストされたモジュールの出力値をルートモジュールの出力値としてアクセスできるようにするには、ルートモジュールで明示的にパススルーを設定する必要があります。例:
例
module "app" {
source = "..."
}
output "app_value" {
value = module.app.example
}
この例では、「app」モジュールのexample
という名前の出力値を、app_value
ルートモジュールの出力値として使用できます。この設定にoutput "app_value"
ブロックが含まれていない場合、データにはterraform_remote_state
経由でアクセスできません。
terraform_remote_state
は構成で使用するための他のステートスナップショット情報を公開しませんが、ステートスナップショットデータは単一のオブジェクトであるため、ルートモジュールの出力値を読み取るのに十分なアクセス権を持つユーザーまたはサーバーは、常に直接ネットワークリクエストによって完全なステートスナップショットデータにアクセスできます。構成内のリソースのいずれかが機密データを使用している場合は、terraform_remote_state
を使用しないでください。