web-dev-qa-db-ja.com

Terraformで「デポーズされた」リソースをどのように処理する必要がありますか?

TF状態で見つかったdeposedリソースをどのように処理する必要があるかを理解するのに苦労しています。

特に、適用を実行すると、次のようなエラーが発生します。

Error applying plan:

11 error(s) occurred:

* aws_instance.mongo-replica-01 (deposed #0): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-0f0bdc2c16e922fbc' does not exist
    status code: 400, request id: 71b98708-cb06-4f11-ad14-8d3d160fbc1a
* aws_instance.mongo-replica-01 (deposed #1): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-080ef01dc84c09685' does not exist
    status code: 400, request id: 07c96f82-1e32-4944-a1d6-ab0e6306b82e
* aws_instance.mongo-replica-02 (deposed #1): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-085b997daac742c1e' does not exist
    status code: 400, request id: 20ff2b73-39c9-4d49-af41-f4ec542ec782
* aws_instance.mongo-replica-02 (deposed #0): Error terminating instance: InvalidInstanceID.NotFound: The instance ID 'i-00bc7fd15b04a3688' does not exist
    status code: 400, request id: cdea3c4f-9bec-496a-aedd-bcfbf0a706d2

問題のAWSEC2インスタンスは実際には存在しませんが、削除しようとするとTFエラーが発生し(おそらく存在しないため)、その状態を維持します。

deposedリソースを削除しようとしてterraform stateコマンドを使用しようとしましたが、deposedインスタンスだけでなく、リソース全体を削除することしかできません...

単純に、手動でterraform状態ファイルに移動し、破棄されたセクションを削除する必要がありますか?

12
gsaslis

「deposed」状態に関するドキュメントを要求するGitHubの問題

「Deposed」は、Terraformがcreate_before_destroyを処理しているときにリソースが入る状態です...特定のリソースの「プライマリ」インスタンスは1つしか存在できないため、Terraformは最初に既存のインスタンスを破棄します(したがって、状態は引き続き追跡されますが、補間に使用されなくなった)、置き換えられたインスタンスを作成してから、最終的に破棄されたインスタンスを削除します。

Terraformはインスタンスを削除する前にそれらを追跡したくないため、そのプロセス中にエラーが発生すると、デポーズされたインスタンスが状態のままになる可能性があります。ただし、この動作は以前のTerraformバージョンでは少し一貫性がなく、Terraformは、配置されたインスタンスをプラン出力に含めるのではなく、サイレントに処理しました。

つまり、これらの破棄されたインスタンスは、これらのリソースをcreate_before_destroyに置き換えている間の障害の残り物です。 Terraform状態ファイル(リモート状態が有効になっているかどうかに応じてterraform.tfstateまたは.terraform/terraform.tfstateのいずれか)を見ると、deposedというWordを検索してこれらのレコードを見つける必要があります。 Terraformがこれらのために保存したデータを使用して、Terraformをここに進める前に、それらを削除しても安全かどうかを判断できます。

したがって、これらのリソースの「デポーズ」状態は、destroyフェーズ中にエラーを引き起こした根本的な問題を示しているにすぎないと推測できます。引用で述べたように、次にterraform applyを実行するときに、より適切な用語がないため、「破棄された」リソースは「解決」される必要があります。それまでの間、tfstateファイルでterraformに保存されている特定の情報を確認して、問題がどこにあるかを診断するのに安全かどうかを判断してください。

さらに、次のことを試して、ローカル状態を更新できます

terraform refresh      Update local state file against real resources

また、

terraform debug              Debug output management
terraform state              Advanced state management
5
ILMostro_7

削除したEC2インスタンスでも同様の問題が発生しましたが、途中でプロセスを停止し、最終的にテラフォームtfstateファイルを手動で編集しました。

その中で、破棄されたアイテムを見つけ、taintedfalseに変更し、deposed配列を空にしました。

実行後terraform plan、インスタンスは出力から削除されました。

enter image description here

0
Simon Fredsted