- OpenTofu言語
- インポート
インポート
構文に後方互換性のない変更を加えることは想定していませんが、-generate-config-out
フラグと、OpenTofuがプラン段階でインポートを処理し、構成を生成する方法は、今後のリリースで変更される可能性があります。
既存のインフラストラクチャリソースを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
ブロックを使用してリソースをインポートするには、次の手順に従う必要があります。
- リソースの
import
ブロックを定義します。 - 対応する
resource
ブロックを構成に追加するか、そのリソースの構成を生成します。 tofu plan
を実行して、OpenTofuがリソースをどのようにインポートするかを確認します。- 構成を適用して、リソースをインポートし、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
}
for_each
をインポートブロックで使用している場合、設定の生成は現在不可能です。