本文へスキップ

コマンド: state mv

OpenTofu stateの主な機能は、設定内のリソースインスタンスアドレスと、それらが表すリモートオブジェクト間のバインディングを追跡することです。通常、OpenTofuは、削除されたリモートオブジェクトのバインディングを削除するなど、プランの適用時に実行されるアクションに応じて、状態を自動的に更新します。

既存のリモートオブジェクトを保持しながら、OpenTofuで異なるリソースインスタンスアドレスとして追跡したい場合(リソースブロックの名前を変更した場合や、設定内の異なるモジュールに移動した場合など)は、あまり一般的ではありませんが、tofu state mvを使用できます。

使用方法

使用方法: tofu state mv [options] SOURCE DESTINATION

OpenTofuは、現在の状態内で指定されたアドレスと一致するリソースインスタンス、リソース、またはモジュールを検索し、成功した場合、ソースに関連付けられているリモートオブジェクトを、代わりに宛先に追跡するように移動します。

ソースアドレスと宛先アドレスの両方にリソースアドレス構文を使用する必要があり、どちらも同じ種類のオブジェクトを参照する必要があります。リソースインスタンスを別のリソースインスタンスに移動したり、モジュールインスタンス全体を別のモジュールインスタンス全体に移動したりすることはできますが、それ以外の組み合わせはできません。さらに、リソースまたはリソースインスタンスを移動する場合は、同じリソースタイプを持つ新しいアドレスにのみ移動できます。

tofu state mvの最も一般的な用途は、設定でリソースブロックの名前を変更した場合、またはリソースブロックを子モジュールに移動した場合で、いずれの場合も既存のオブジェクトを保持して新しい名前で追跡することを意図しています。OpenTofuはデフォルトで、リソース設定の移動または名前変更を、古いオブジェクトを削除して新しいアドレスに新しいオブジェクトを作成する要求として解釈するため、tofu state mvを使用すると、OpenTofuで既存のオブジェクトを新しいアドレスに事前にアタッチすることで、その解釈を上書きできます。

このコマンドは、以下のオプションも受け付けます。

  • -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リソースと似ており、前述のセクションで説明されているように、インデックス付きコンポーネントの有無にかかわらずアドレスの組み合わせが有効です。