インポートの使用
既存のインフラストラクチャをOpenTofuの状態にインポートするには、`tofu import`コマンドを使用します。
`tofu import`コマンドでは、一度に1つのリソースしかインポートできません。AWS VPCなど、リソースの entire collection を同時にインポートすることはできません。
OpenTofuは、管理している各リモートオブジェクトが1つのリソースアドレスのみにバインドされていることを想定しています。これは通常、OpenTofu自身がすべてのオブジェクトを作成することによって保証されています。既存のオブジェクトをOpenTofuにインポートする場合は、各リモートオブジェクトを1つのOpenTofuリソースアドレスのみにインポートするように注意してください。同じオブジェクトを複数回インポートすると、OpenTofuは予期しない動作をする可能性があります。この前提の詳細については、状態セクションを参照してください。
リソースをインポートするには、まず設定ファイルにそのリソースの resource ブロックを作成し、OpenTofuで認識される名前を定義します。
resource "aws_instance" "example" {
# ...instance configuration...
}
ここの「example」という名前は、宣言されたモジュール内でローカルであり、設定作成者によって選択されます。これは、リモートシステムによって発行されるIDとは異なり、リソース名が一定である間も時間とともに変化する可能性があります。
必要に応じて、resourceブロックの本体を今は空のままにしておき、インスタンスがインポートされた後に記入することもできます。
これで、`tofu import`を実行して、既存のインスタンスをこのリソース設定にアタッチできます。
$ tofu import aws_instance.example i-abcd1234
このコマンドは、ID `i-abcd1234` のAWS EC2インスタンスを探します。次に、EC2 APIで記述されているインスタンスの既存の設定を、モジュールの`aws_instance.example`という名前にアタッチします。この例では、モジュールパスはルートモジュールが使用されていることを意味します。最後に、マッピングはOpenTofuの状態に保存されます。
子モジュール内のリソースへのインポート、`count`または`for_each`が設定されたリソースの単一インスタンスへのインポートも可能です。ターゲットリソースの指定方法の詳細については、リソースアドレス指定を参照してください。
指定されたIDの構文は、インポートされるリソースの種類によって異なります。たとえば、AWSインスタンスはEC2 APIによって発行された不透明なIDを使用しますが、AWS Route53ゾーンはドメイン名自体を使用します。インポート可能な各リソースのドキュメントを参照して、必要なIDの形式を確認してください。
上記のコマンドの結果として、リソースは状態ファイルに記録されます。これで、`tofu plan`を実行して、設定とインポートされたリソースを比較し、インポートされたオブジェクトの現在の(または目的の)状態に合わせて設定を調整できます。
複雑なインポート
上記のインポートは、「単純なインポート」と見なされます。1つのリソースが状態ファイルにインポートされます。インポートは、複数のリソースがインポートされる「複雑なインポート」になることもあります。たとえば、AWSネットワークACLは`aws_network_acl`をインポートしますが、各ルールに対して1つの`aws_network_acl_rule`もインポートします。
このシナリオでは、セカンダリリソースは設定ファイルにまだ存在しないため、インポート出力を参照して、各セカンダリリソースの設定ファイルに`resource`ブロックを作成する必要があります。これを行わないと、OpenTofuは次回の実行時にインポートされたオブジェクトを削除しようとします。
インポートされたリソースの名前変更や移動を行う場合は、状態管理コマンドを使用できます。