- OpenTofu言語
- インポート
- 設定の生成
設定の生成
設定の生成は、OpenTofu v1.6で実験的な機能として利用可能です。今後のマイナーバージョンでは、生成された設定の書式や、-generate-config-outフラグを使用したtofu planコマンドの動作が変更される可能性があります。
OpenTofuは、設定内にまだ存在しないimportブロックで定義したリソースのコードを生成できます。OpenTofuは、各リソース引数に適切な値を推測したHCLを、テンプレートとして生成します。
OpenTofuで生成されたHCLから始めて、いくつかの属性を削除したり、他の属性の値を調整したり、必要に応じてresourceブロックをファイルやモジュールに再配置することで、理想的な設定を見つけることをお勧めします。
設定を生成するには、tofu planを-generate-config-outフラグと新しいファイルパスを指定して実行します。既存のファイルへのパスを指定すると、OpenTofuはエラーを返します。
$ tofu plan -generate-config-out=generated_resources.tf
importブロックの対象となるリソースが設定内に存在しない場合、OpenTofuはこれらのリソースの設定を生成し、generated_resources.tfに書き込みます。
ワークフロー
設定を生成するためのワークフローは、importブロックのワークフローに似ていますが、計画段階で設定を生成する追加ステップがあります。その後、適用する前に、生成された設定を確認および変更できます。
1. importブロックを追加
importブロックを設定に追加します。このimportブロックは、別のファイル(例:import.tf)または既存の設定ファイルに含めることができます。
import {
to = aws_iot_thing.bar
id = "foo"
}
importブロックのto引数は、状態ファイル内でresourceが持つアドレスを指します。状態ファイル内のリソースアドレスがimportブロックのto引数と一致する場合、OpenTofuはそのリソースにインポートしようとします。今後の計画では、OpenTofuは、状態にすでに存在するリソースの設定を生成する必要がないことを認識します。
importブロックのid引数は、そのリソースのインポートIDを使用します。
選択したプロバイダーの他のリソースが設定に含まれていない場合は、OpenTofuにどのプロバイダーを使用して設定を生成するかを通知するために、providerブロックを追加する必要があります。そうしないと、OpenTofuはどのプロバイダーを使用するかを判断できない場合にエラーを表示します。設定に新しいproviderブロックを追加した場合は、再度tofu initを実行する必要があります。
2. 計画と設定の生成
定義したimportブロックの設定をOpenTofuに生成させるには、-generate-config-out=フラグと新しいファイルパスを指定してtofu planを実行します。OpenTofuは、リソースをインポートするための計画と、この計画に基づいてOpenTofuが設定を生成したファイルを表示します。
$ tofu plan -generate-config-out=generated.tf
aws_iot_thing.bar: Preparing import... [id=foo]
aws_iot_thing.bar: Refreshing state... [id=foo]
OpenTofu will perform the following actions:
# aws_iot_thing.bar will be imported
# (config will be generated)
resource "aws_iot_thing" "bar" {
arn = "arn:aws:iot:eu-west-1:1234567890:thing/foo"
attributes = {}
default_client_id = "foo"
id = "foo"
name = "foo"
version = 1
}
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
╷
│ Warning: Config generation is experimental
│
│ Generating configuration during import is currently experimental, and the generated configuration format may change in future versions.
╵
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
OpenTofu has generated configuration and written it to generated.tf. Please review the configuration and edit it as necessary before adding it to version control.
3. 生成された設定の確認
上記の例では、OpenTofuにgenerated.tfという名前のファイルに設定を生成するように指示しています。以下のコードは、generated.tfファイルの例です。
resource aws_iot_thing "bar" {
name = "foo"
}
生成された設定を確認し、必要に応じて更新します。生成された設定を別のファイルに移動したり、リソース引数を追加または削除したり、設定内の入力変数や他のリソースを参照するように更新したりすることができます。
4. 適用
tofu applyを実行して、インフラストラクチャをインポートします。
$ tofu apply
aws_iot_thing.bar: Preparing import... [id=foo]
aws_iot_thing.bar: Refreshing state... [id=foo]
OpenTofu will perform the following actions:
# aws_iot_thing.bar will be imported
resource "aws_iot_thing" "bar" {
arn = "arn:aws:iot:eu-west-1:1234567890:thing/foo"
attributes = {}
default_client_id = "foo"
id = "foo"
name = "foo"
version = 1
}
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
aws_iot_thing.bar: Importing... [id=foo]
aws_iot_thing.bar: Import complete [id=foo]
Apply complete! Resources: 1 imported, 0 added, 0 changed, 0 destroyed.
新しいリソース構成をバージョン管理システムにコミットします。
制限事項
競合するリソース引数
OpenTofuは、プロバイダーからリソース属性の値を取得することにより、計画中にインポート可能なリソースの設定を生成します。複雑なスキーマを持つ特定のリソースの場合、OpenTofuはこれらの値から有効な設定を構築できない場合があります。
OpenTofuは、設定を生成中にリソース属性の値を受け取らない場合、以下のようなエラーを表示します。
$ tofu plan -generate-config-out=generated.tf
╷
│ Error: Conflicting configuration arguments
│
│ with aws_instance.ubuntu,
│ on g.tf line 20, in resource "aws_instance" "ubuntu":
│ 20: ipv6_address_count = 0
│
│ "ipv6_address_count": conflicts with ipv6_addresses
╵
上記の例では、OpenTofu は構成を生成し、それを generated.tf に書き込みます。このエラーは、ipv6_address_count 引数と ipv6_addresses 引数の間の競合に起因します。リソースはこれらの引数の両方をサポートしていますが、リソースを構成する際にはどちらか一方のみを選択する必要があります。このエラーを修正するには、これらの 2 つの引数のいずれかを削除し、tofu plan を再度実行して、他に問題がないことを確認できます。