- 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
を再度実行して、他に問題がないことを確認できます。