terraform refresh
状態ファイルに保持されているリソースを見つけようとし、最後に実行されてからTerraform以外のプロバイダで発生したドリフトを更新しようとします。
たとえば、状態ファイルにi-abc123
,i-abc124
,i-abc125
のIDを持つ3つのEC2インスタンスが含まれていて、次にTerraform以外でi-abc124
を削除するとします。 terraform refresh
の実行後には、は、2番目のインスタンスを作成する必要があることを示していますが、破壊計画では1番目と3番目のインスタンスを破棄する必要があるだけであることが分かります。
Terraformは、Terraformによって管理されていないものに干渉しないように非常に具体的な決定を下します。つまり、リソースが状態ファイルに存在しない場合、絶対にそれに触れることはありません。これにより、他のツールと並行してTerraformを実行できるほか、AWSコンソールで手動で変更することもできます。また、使用する別の状態ファイルを提供するだけで、さまざまなコンテキストでTerraformを実行でき、インフラストラクチャを複数の状態ファイルに分割し、壊滅的な状態ファイルの破損から身を守ることができます。
あなたの現在の穴から自分を取り除くには、terraform import
を自由に使って状態ファイルに戻すか、可能であれば手動でTerraform以外のものをすべて破棄して最初から開始することをお勧めします。
今後は、より詳細なコンテキストに適用するために状態ファイルを分割することと、バージョン管理が有効なS3バケットにリモート状態を保存することをお勧めします。 Terragruntのようなツールを使って状態ファイルをロックして破損を避けることができます。また、今後のTerraform 0.9リリースでのネイティブ状態のファイルロックを待つこともできます。
あなたの明確で詳細な回答をありがとう。実際に私たちはS3バケツで私たちのtfstateを持っていました。あなたが提案したように、すべてを手作業で破壊し、s3のバージョン管理を有効にして、数日前に 'terraform apply 'をもう一度実行してください。私はこの質問をして、かなり重大な状況の根底にある原因をよりよく理解するように頼んだ。 – Bruno9779