本文へスキップ

インポートの使用

既存のインフラストラクチャをOpenTofuの状態にインポートするには、`tofu import`コマンドを使用します。

`tofu import`コマンドでは、一度に1つのリソースしかインポートできません。AWS VPCなど、リソースの entire collection を同時にインポートすることはできません。

リソースをインポートするには、まず設定ファイルにそのリソースの 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は次回の実行時にインポートされたオブジェクトを削除しようとします。

インポートされたリソースの名前変更や移動を行う場合は、状態管理コマンドを使用できます。