- コマンドライン
- 基本的なCLI機能
- コマンド: state
- コマンド: state mv
コマンド: state mv
OpenTofu stateの主な機能は、設定内のリソースインスタンスアドレスと、それらが表すリモートオブジェクト間のバインディングを追跡することです。通常、OpenTofuは、削除されたリモートオブジェクトのバインディングを削除するなど、プランの適用時に実行されるアクションに応じて、状態を自動的に更新します。
既存のリモートオブジェクトを保持しながら、OpenTofuで異なるリソースインスタンスアドレスとして追跡したい場合(リソースブロックの名前を変更した場合や、設定内の異なるモジュールに移動した場合など)は、あまり一般的ではありませんが、tofu state mv
を使用できます。
使用方法
使用方法: tofu state mv [options] SOURCE DESTINATION
OpenTofuは、現在の状態内で指定されたアドレスと一致するリソースインスタンス、リソース、またはモジュールを検索し、成功した場合、ソースに関連付けられているリモートオブジェクトを、代わりに宛先に追跡するように移動します。
ソースアドレスと宛先アドレスの両方にリソースアドレス構文を使用する必要があり、どちらも同じ種類のオブジェクトを参照する必要があります。リソースインスタンスを別のリソースインスタンスに移動したり、モジュールインスタンス全体を別のモジュールインスタンス全体に移動したりすることはできますが、それ以外の組み合わせはできません。さらに、リソースまたはリソースインスタンスを移動する場合は、同じリソースタイプを持つ新しいアドレスにのみ移動できます。
tofu state mv
の最も一般的な用途は、設定でリソースブロックの名前を変更した場合、またはリソースブロックを子モジュールに移動した場合で、いずれの場合も既存のオブジェクトを保持して新しい名前で追跡することを意図しています。OpenTofuはデフォルトで、リソース設定の移動または名前変更を、古いオブジェクトを削除して新しいアドレスに新しいオブジェクトを作成する要求として解釈するため、tofu state mv
を使用すると、OpenTofuで既存のオブジェクトを新しいアドレスに事前にアタッチすることで、その解釈を上書きできます。
共同作業環境でOpenTofuを使用している場合は、コードのリファクタリングのためにtofu state mv
を使用する際に、同僚と綿密に連絡を取り、設定の変更とtofu state mv
コマンドの間で他の誰も変更を加えないようにする必要があります。そうしないと、古いオブジェクトを破壊して新しいアドレスに新しいオブジェクトを作成するプランを誤って作成してしまう可能性があります。
モジュールソース、バックエンド設定、または暗号化ブロックで変数を使用するには、tofu state mv
を実行するときにルートモジュールの変数に値を割り当てる必要があります。
このコマンドは、以下のオプションも受け付けます。
-
-dry-run
- 実際にリソースインスタンスを「忘れる」ことなく、指定されたアドレスと一致するすべてのリソースインスタンスを報告します。 -
-lock=false
- 操作中に状態ロックを保持しません。他のユーザーが同じワークスペースに対して同時にコマンドを実行する可能性がある場合、これは危険です。 -
-lock-timeout=DURATION
--lock=false
でロックが無効になっていない限り、エラーを返す前に、OpenTofuが一定時間ロックの取得を試行するように指示します。期間の構文は、数値に時間単位の文字を続けるもので、3秒の場合は「3s」などです。
-
-var 'NAME=VALUE'
- 設定のルートモジュールで宣言されている単一の入力変数の値を設定します。複数の変数を設定するには、このオプションを複数回使用します。詳細については、コマンドラインでの入力変数を参照してください。 -
-var-file=FILENAME
- "tfvars"ファイルの定義を使用して、設定のルートモジュールで宣言されている多くの入力変数の値を設定します。複数のファイルの値を含めるには、このオプションを複数回使用します。
-var
オプションと-var-file
オプション以外にも、ルートモジュールの入力変数の値を設定する方法はいくつかあります。詳細については、ルートモジュールの変数への値の割り当てを参照してください。
cloud
バックエンドまたはremote
バックエンドを使用する設定の場合のみ、tofu state mv
はオプション-ignore-remote-version
も受け付けます。
レガシーオプション-backup
と-backup-out
は、ローカル状態ファイルのみを操作します。remote
バックエンドを使用する設定では、-state
オプションを使用してローカル状態ファイルを指定する必要があります。-backup
と-backup-out
オプションを使用するには。
local
状態mvを使用する設定の場合のみ、tofu state mv
はレガシーオプション-state
、-state-out
、-backup
、および-backup-out
も受け付けます。
例:リソースの名前変更
リソースの名前変更とは、次のような設定変更を行うことを意味します。
-resource "packet_device" "worker" {
+resource "packet_device" "helper" {
# ...
}
新しい "helper" リソースを古い "worker" リソースの名前変更として扱うように OpenTofu に指示するには、上記の設定変更と次のコマンドを組み合わせます。
tofu state mv packet_device.worker packet_device.helper
例:リソースをモジュールに移動
もともとルートモジュールにリソースを作成しましたが、それを子モジュールにリファクタリングしたい場合は、resource
ブロックを子モジュールの設定に移動し、ルートモジュールにある元のブロックを削除してから、次のコマンドを実行して OpenTofu に移動として扱うように指示します。
tofu state mv packet_device.worker module.worker.packet_device.worker
上記の例では、新しいリソースは名前が同じですが、モジュールアドレスが異なります。新しいモジュールの構成が異なる命名スキームを提案している場合は、同時にリソースの名前を変更することもできます。
tofu state mv packet_device.worker module.worker.packet_device.main
例:モジュールをモジュールに移動
モジュール全体を子モジュールにリファクタリングすることもできます。設定では、モジュールを表すmodule
ブロックを別のモジュールに移動し、その変更を次のコマンドと組み合わせます。
tofu state mv module.app module.parent.module.app
例:count
を使用してリソースの特定のインスタンスを移動
count
メタ引数で定義されたリソースには、それぞれ整数が識別子となる複数のインスタンスがあります。指定されたアドレスに明示的なインデックスを含めることで、特定のインスタンスを選択できます。
$ tofu state mv 'packet_device.worker[0]' 'packet_device.helper[0]'
count
またはfor_each
を使用しないリソースには、リソース自体と同じアドレスを持つ単一のインスタンスのみがあり、そのため、各リソースの設定方法に応じてアドレスの種類が一致する限り、インデックスを含まないアドレスからインデックスを含むアドレスに、またはその逆に移動できます。
$ tofu state mv 'packet_device.main' 'packet_device.all[0]'
角括弧([
、]
)は、一部のシェルで特別な意味を持つため、OpenTofu に文字通り渡すには、アドレスを引用符で囲むか、エスケープする必要がある場合があります。上記の例は、Unix スタイルのシェルの一般的な引用構文を示しています。
例:for_each
で構成されたリソースの移動
for_each
メタ引数で定義されたリソースには、それぞれ文字列で識別される複数のインスタンスがあります。指定されたアドレスに明示的なキーを含めることで、特定のインスタンスを選択できます。
ただし、文字列の構文には引用符が含まれており、引用符記号はコマンドシェルで特別な意味を持つことが多いため、使用しているシェルに適切な引用符と/またはエスケープの構文を使用する必要があります。例:
Linux または macOS のような Unix スタイルのシェル
tofu state mv 'packet_device.worker["example123"]' 'packet_device.helper["example456"]'
Windows コマンドプロンプト(cmd.exe
)
tofu state mv packet_device.worker[\"example123\"] packet_device.helper[\"example456\"]
PowerShell
tofu state mv 'packet_device.worker[\"example123\"]' 'packet_device.helper[\"example456\"]'
インスタンスキーに整数ではなく文字列を使用すること以外、for_each
リソースの処理はcount
リソースと似ており、前述のセクションで説明されているように、インデックス付きコンポーネントの有無にかかわらずアドレスの組み合わせが有効です。