メインコンテンツへスキップ

設定の生成

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