- OpenTofu言語
- データソース
データソース
データソースを使用すると、OpenTofuはOpenTofuの外部で定義された情報や、別のOpenTofu構成で定義された情報、または関数によって変更された情報を使用できます。
各プロバイダーは、リソースタイプのセットとともに、データソースを提供できます。
データソースの使用
データソースは、data
ブロックを使用して宣言されるデータリソースと呼ばれる特別な種類のリソースを介してアクセスされます。
data "aws_ami" "example" {
most_recent = true
owners = ["self"]
tags = {
Name = "app-server"
Tested = "true"
}
}
data
ブロックは、OpenTofuが指定されたデータソース("aws_ami")から読み取り、指定されたローカル名("example")で結果をエクスポートするように要求します。名前は、同じOpenTofuモジュール内の他の場所からこのリソースを参照するために使用されますが、モジュールのスコープ外では意味がありません。
データソースと名前は合わせて特定のリソースの識別子として機能するため、モジュール内で一意である必要があります。
ブロック本体内({
と}
の間)には、データソースによって定義されたクエリ制約があります。このセクションのほとんどの引数はデータソースに依存しており、実際、この例ではmost_recent
、owners
、tags
はすべてaws_ami
データソースに固有に定義された引数です。
データリソースと区別する場合、プライマリ種類のリソース(resource
ブロックで宣言される)は、管理対象リソースとして知られています。両方の種類のリソースは、構成で使用するための引数を受け取り、属性をエクスポートしますが、管理対象リソースはOpenTofuにインフラストラクチャオブジェクトを作成、更新、削除させるのに対し、データリソースはOpenTofuにオブジェクトを読み取るのみをさせます。簡潔にするために、管理対象リソースは、文脈から意味が明確な場合は、単に「リソース」と呼ばれることがよくあります。
データソースの引数
各データリソースは、単一のデータソースに関連付けられており、データソースは読み取るオブジェクトの種類(またはオブジェクト)と、利用可能なクエリ制約引数を決定します。
各データソースは、OpenTofuのプラグインであるプロバイダーに属しており、プロバイダーは、単一のクラウドまたはオンプレミスインフラストラクチャプラットフォームに最もよく属するリソースタイプとデータソースのコレクションを提供します。
data
ブロックの本体内のほとんどの項目は、選択されたデータソースによって定義され、データソースに固有であり、これらの引数は、式やその他の動的なOpenTofu言語機能を最大限に活用できます。
ただし、OpenTofu自体によって定義され、すべてのデータソースに適用される「メタ引数」がいくつかあります。これらの引数には、どの言語機能を使用できるかについて追加の制限があることが多く、次のセクションで詳しく説明します。
データリソースの動作
OpenTofuは、可能な場合は計画フェーズ中にデータリソースを読み取りますが、操作の順序を保持するために適用フェーズまでリソースの読み取りを延期する必要がある場合は、計画で発表します。OpenTofuは、次の状況でデータリソースの読み取りを延期します。
- 指定された引数の少なくとも1つが、適用ステップまでOpenTofuが予測できない管理対象リソース属性またはその他の値である。
- データリソースが、現在の計画で変更が計画されている管理対象リソースに直接依存している。
- データリソースにカスタム条件があり、現在の計画で変更が計画されている管理対象リソースに直接的または間接的に依存している。
データリソースが他のオブジェクトに依存することの意味の詳細については、データリソースの依存関係を参照してください。このようなデータリソースの結果として得られる属性は、計画中は不明になるため、値が完全に既知である必要がある状況では使用できません。
ローカルのみのデータソース
多くのデータソースがリモートネットワークAPIを介してアクセスされるインフラストラクチャオブジェクトタイプに対応している一方で、一部の特殊なデータソースはOpenTofu内でのみ動作し、いくつかの結果を計算して、他の場所で使用できるように公開します。
例えば、ローカルのみのデータソースは、テンプレートのレンダリング、ローカルファイルの読み込み、およびAWS IAMポリシーのレンダリングのために存在します。
ローカルのみのデータソースの動作は他のすべてのデータソースと同じですが、その結果データはOpenTofuの操作中に一時的にのみ存在し、新しいプランが作成されるたびに再計算されます。
データリソースの依存関係
データリソースは、管理対象リソースで定義されているのと同じ依存関係解決の動作を持ちます。data
ブロック内でdepends_on
メタ引数を設定すると、依存関係に対するすべての変更が適用されるまでデータソースの読み込みが延期されます。
データソースが幅広いユースケースで可能な限り最新の情報にアクセスするようにするために、管理対象リソースを直接参照する引数は、そのリソースがdepends_on
にリストされている場合と同様に扱われます。この動作は、データリソース自体にカスタム条件がない限り、local
値を介して管理対象リソース値を間接的に参照することで、必要に応じて回避できます。
カスタム条件チェック
precondition
およびpostcondition
ブロックを使用して、データソースの動作に関する前提と保証を指定できます。次の例では、AMIに正しいタグがあるかどうかをチェックするpostconditionを作成します。
data "aws_ami" "example" {
id = var.aws_ami_id
lifecycle {
# The AMI ID must refer to an existing AMI that has the tag "nomad-server".
postcondition {
condition = self.tags["Component"] == "nomad-server"
error_message = "tags[\"Component\"] must be \"nomad-server\"."
}
}
}
カスタム条件は、前提条件を把握するのに役立ち、将来のメンテナが構成の設計と意図を理解するのに役立ちます。また、エラーに関する有用な情報をより早く、コンテキスト内で返すため、利用者が構成の問題をより簡単に診断するのに役立ちます。
詳細については、カスタム条件チェックを参照してください。
複数のリソースインスタンス
データリソースは、管理対象リソースに対して定義されているように、count
およびfor_each
メタ引数を、同じ構文と動作でサポートします。
管理対象リソースと同様に、count
またはfor_each
が存在する場合、リソース自体と、それが作成する複数のリソースインスタンスを区別することが重要です。各インスタンスは、制約引数の独自のバリアントを使用してデータソースから個別に読み取り、インデックス付きの結果を生成します。
デフォルト以外のプロバイダー構成の選択
データリソースは、管理対象リソースに対して定義されているように、provider
メタ引数を、同じ構文と動作でサポートします。
ライフサイクルのカスタマイズ
データリソースには、ライフサイクルで利用可能なカスタマイズ設定はありません。ただし、lifecycle
ブロックは将来のバージョン用に予約されています。
例
データソースの構成は次のようになります。
# Find the latest available AMI that is tagged with Component = web
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}
filter {
name = "tag:Component"
values = ["web"]
}
most_recent = true
}
説明
data
ブロックは、指定されたタイプ(最初のブロックラベル)と名前(2番目のブロックラベル)のデータインスタンスを作成します。タイプと名前の組み合わせは一意である必要があります。
ブロック({ }
)内には、データインスタンスの構成があります。構成はタイプによって異なります。リソースと同様に、Public OpenTofu Registryの各プロバイダーには、提供するデータタイプの構成と使用に関する独自のドキュメントがあります。
各データインスタンスは1つ以上のアトリビュートをエクスポートし、それらはdata.<TYPE>.<NAME>.<ATTRIBUTE>
の形式の参照式として他のリソースで使用できます。例えば
resource "aws_instance" "web" {
ami = data.aws_ami.web.id
instance_type = "t1.micro"
}
メタ引数
データソースは基本的にリソースの読み取り専用のサブセットであるため、lifecycle
構成ブロックを除いて、リソースと同じメタ引数もサポートします。
デフォルト以外のプロバイダー構成
リソースと同様に、モジュールに同じプロバイダーの複数の構成がある場合は、provider
メタ引数を使用して使用する構成を指定できます。
data "aws_ami" "web" {
provider = aws.west
# ...
}
詳細については、リソースのprovider
メタ引数を参照してください。
データソースのライフサイクル
データインスタンスの引数に、まだ作成されていないリソースのアトリビュートなど、計算された値への参照が含まれていない場合、データインスタンスはOpenTofuの「リフレッシュ」フェーズで読み込まれ、その状態が更新されます。これは、デフォルトでプランを作成する前に実行されます。これにより、取得したデータがプラン中に使用できるようになり、差分には取得した実際の値が表示されるようになります。
データインスタンスの引数は計算された値を参照する場合があります。その場合、すべての引数が定義されるまでインスタンス自体のアトリビュートは解決できません。この場合、データインスタンスのリフレッシュは「apply」フェーズまで延期され、データインスタンスのアトリビュートのすべての補間は、値がまだ不明であるため、プランで「computed」と表示されます。