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

インポート

既存のインフラストラクチャリソースをOpenTofuにインポートするには、importブロックを使用します。これにより、OpenTofuの管理下に置かれます。tofu importコマンドとは異なり、importブロックを使用した構成駆動型のインポートは予測可能で、CICDパイプラインで動作し、状態を変更する前にインポート操作をプレビューできます。

インポートすると、OpenTofuはステートファイルでリソースを追跡します。その後、他のリソースと同じようにインポートされたリソースを管理し、属性を更新し、標準のリソースライフサイクルの一部として破棄することができます。

importブロックは、OpenTofuがリソースをインポートし、作成しなかったことを記録します。インポート後、構成からimportブロックを削除することも、リソースの起源の記録として残しておくこともできます。

構文

OpenTofu構成ファイルにimportブロックを追加できます。一般的なパターンは、imports.tfファイルを作成するか、各importブロックをインポート先のresourceブロックの横に配置することです。

コードブロック
import {
to = aws_instance.example
id = "i-abcd1234"
}

resource "aws_instance" "example" {
name = "hashi"
# (other resource arguments...)
}

上記のimportブロックは、ルートモジュールのaws_instance.exampleリソースへのID "i-abcd1234"を持つAWSインスタンスのインポートを定義しています。

importブロックには、次の引数があります。

  • to - このリソースがステートファイルに持つインスタンスアドレス。
  • id - リソースのインポートIDを含む文字列。
  • provider (オプション) - オプションのカスタムリソースプロバイダー。詳細については、リソースプロバイダーメタ引数を参照してください。
  • for_each (オプション) - マップまたはセットを反復処理することにより、複数のリソースをインポートします。以下の複数のリソースのインポートを参照してください。

provider引数を設定しない場合、OpenTofuはデフォルトのプロバイダーからインポートしようとします。

インポートID

インポートブロックでは、リソースのインポートIDのリテラル文字列を持つid引数を提供する必要があります。OpenTofuは、インポートするリソースを特定するために、このインポートIDを必要とします。

リソースのインポートIDに使用する識別子は、リソース固有です。必要なIDは、インポートするリソースのプロバイダーのドキュメントに記載されています。

インポートの計画と適用

OpenTofuは、プラン段階でimportブロックを処理します。プランが承認されると、OpenTofuは後続の適用段階で、リソースをその状態にインポートします。

importブロックを使用してリソースをインポートするには、次の手順に従う必要があります。

  1. リソースのimportブロックを定義します。
  2. 対応するresourceブロックを構成に追加するか、そのリソースの構成を生成します。
  3. tofu planを実行して、OpenTofuがリソースをどのようにインポートするかを確認します。
  4. 構成を適用して、リソースをインポートし、OpenTofuのステートを更新します。

importブロックは、冪等です。つまり、インポートアクションを適用し、別のプランを実行しても、そのリソースが状態に残っている限り、別のインポートアクションは生成されません。

OpenTofuは、特定のリソースを1回だけインポートする必要があります。同じアドレスにリソースを再度インポートしようとしても、無害な操作は行われません。インポート完了後、importブロックを削除することも、将来のモジュールメンテナーのためにリソースの起源の記録として構成内に安全に残しておくこともできます。構成の長期的なメンテナンスの詳細については、リファクタリングを参照してください。

リソース構成

インポートする前に、OpenTofuにインポートさせるすべてのリソースの構成を追加する必要があります。そうしないと、OpenTofuはプラン中にエラーをスローし、正常にインポートする前にリソース構成を追加することを要求します。リソース構成は手動で作成することも、OpenTofuを使用して生成することもできます。

リソースの引数のほとんどがわかっている場合は、resourceブロックを記述することをお勧めします。たとえば、構成には、コピーして変更できる同様のリソースがすでに含まれている場合があります。

複数のリソースまたはまだ構成がない複雑な単一のリソースをインポートする場合は、構成を生成することをお勧めします。

resourceブロックの追加

インポートするリソースに対してresourceブロックを追加します。リソースのアドレスは、インポートブロックのto引数と一致する必要があります。

コードブロック
import {
to = aws_instance.example
id = "i-abcd1234"
}

resource "aws_instance" "example" {
name = "renderer"
}

設定の生成

OpenTofu は、設定内にまだ存在しないリソースに対して HCL を生成できます。詳細については、設定の生成を参照してください。

次の例は、モジュールへのインポート方法を示しています。

コードブロック
import {
to = module.instances.aws_instance.example
id = "i-abcd1234"
}

以下の例は、count を含むリソースのインポート方法を示しています。

コードブロック
import {
to = aws_instance.example[0]
id = "i-abcd1234"
}

以下の例は、for_each を含むリソースのインポート方法を示しています。

コードブロック
import {
to = aws_instance.example["foo"]
id = "i-abcd1234"
}

最後に、以下の例は、カスタムリソースプロバイダーからのインポート方法を示しています。

コードブロック
provider "aws" {
alias = "europe"
region = "eu-west-1"
}

import {
provider = aws.europe
to = aws_instance.example["foo"]
id = "i-abcd1234"
}

複数のリソースのインポート

for_each式を使用すると、1つのインポートブロックで複数のリソースをインポートできます。この式は、セット、タプル、またはマップを受け入れ、個々の要素にアクセスするためのeach.key変数とeach.value変数を提供します。

以下の例では、インポートするサーバー ID のリストを指定できます。空のリストを指定した場合、random_idリソースはすべての ID をランダムに生成します。いくつかの ID を指定した場合、インポートブロックは指定された ID をインポートし、リソースは残りをランダムに生成します。なお、random_idリソースは、ID が base64 形式である必要があります。

コードブロック
variable "server_ids" {
type = list(string)
}

resource "random_id" "test_id" {
byte_length = 8
count = 2
}

import {
to = random_id.test_id[tonumber(each.key)]
id = each.value
for_each = {
for idx, item in var.server_ids: idx => item
}
}

output "id" {
value = random_id.test_id.*.b64_url
}