2016-07-20 44 views
25

.tfstateのファイルをGitにコミットするかどうかという疑問に少し困惑しています。 Terraform documentationの状態:.tfstateファイルをGitにコミットする必要がありますか?

テラフォームはデフォルトでterraform.tfstateファイルに状態を入れます。この状態ファイルは非常に重要です。 Terraformが管理しているものを知るために、さまざまなリソースメタデータを実際のリソースIDにマップします。このファイルは、Terraformを実行する可能性のある人に保存して配布する必要があります。一般的には大きすぎないので、単にバージョンコントロールに入れることをお勧めします。

Best practices when using Terraform状態の一方で、受け入れられ、upvoted答え:

テラフォームの設定が異なる状態を持つことができ、それぞれが異なるインフラの提供、多くのボックスに使用することができます。複数の人が同時に実行できるので、この状態はS3のような中央の場所にあるはずですが、ではなく gitです。

権利である(元の著者によってではなく、私が強調)

、もしそうなら、なぜですか?

答えて

12

Yevgeniyの回答が良いです。問題は、テラフォームが状態に自分のドキュメントを更新してきたように、今いくぶん物議です:

テラフォームも デフォルトでterraform.tfstateファイルにいくつかの状態を置きます。この状態ファイルは非常に重要です。さまざまな リソースメタデータを実際のリソースIDにマップして、Terraformが管理しているものが何であるかを知るようにします。 このファイルは、 がTerraformを実行する可能性のある人に保存して配布する必要があります。 Terraformを使用する場合は、リモート状態 を設定することが一般的に推奨されます。これは、状態ファイルに格納されている任意の潜在的な秘密 は、バージョン管理

にチェックインされないように確立されたベストプラクティスと公式の勧告の間に意見の相違がもはや存在であることを意味しません。

5

これはおそらく好みになると思いますが、git(または他のソースコントロール)は状態ファイルを保存するのに特に適していませんコンパイルされたバイナリ、あるいは最小化されたJSまたはLESSをCSSにコンパイルします。

これに加えて、事態をコード内で実際に変更されているのではなく、実行されているものへの出力として、状態ファイル内でかなり急速に変化する可能性があります。

ただし、別のラップトップ/マシンで開発している場合、これらの状態ファイルをリモートのチームメンバーや他のデバイスと共有する方法が必要です。 Terraformが状態ファイルを使用して状態ファイルを失った場合、あなたが本当に苦痛を感じるので、これらのファイルを保存してバックアップする方法も必要です。他のツーリング。

私は、S3はおそらく今すぐあなたが置くことができる最高の場所だと思います。それはかなり無料で、耐久性は可用性の点で優れています。リソースを使用してTerraformでのネイティブサポートが非常に優れています。そして、おそらく最も重要なのは、S3バケットを作成して起動するだけです。 ConsulまたはetcdをTerraformなしで最初に構築しなければならない(そうでなければ、それらを作成するためにどこに状態を保存するかのチキンと卵の問題があります)か、どちらかの製品を使用するつもりでも苦労します。

明らかにOpenStackを使用している場合は、Swiftが良い選択肢になるはずです(私は使っていませんが)。私もHashicorpのAtlasを使用していませんが、あなたがそのサービスを支払うことを喜んですれば、同様に有用かもしれません。

28

Gitリポジトリであなたの.tfstateファイルを保存しないように、いくつかの理由があります。

  1. あなたのチームメイトは、外の日付を持っていますので、あなたは、terraform applyを実行した後、あなたの変更をコミットしてプッシュすることを忘れそうな.tfstateファイル。また、これらの状態ファイルをロックすることなく、2人のチームメンバーが同一の.tfstateファイルでTerraformを同時に実行すると、お互いの変更を上書きすることができます。両方の問題を解決するには、Terraform remote stateを使用してSファイルをS3バケットに保存します。ファイルを自動的にプッシュ/プルし、などのツールを使用して.tfstateファイルのロックを提供します。
  2. .tfstateファイルには秘密が含まれている場合があります。たとえば、aws_db_instanceリソースを使用する場合は、データベースパスワードを指定する必要があり、Terraformは平文で.tfstateファイルにそのパスワードを保存します。これはTerraformに代わってバージョンコントロールに暗号化されていない秘密を保存することを悪化させる悪い習慣です。少なくとも.tfstate個のファイルをS3に保存する場合は、安心して暗号化を有効にし(SSLは動作中に暗号化を行います)、IAMポリシーを設定してアクセス権を制限します。それは理想から非常に遠いので、それについてのopen issue discussing this problemが修正されるかどうかを見なければなりません。詳細情報については

How to manage Terraform stateTerraform: Up & Runningをチェックしてください。

+2

これを見るもう一つの理由があります:バージョンコントロールを使ったソフトウェア開発としてTF + Gitを考えてみましょう。 その場合、ビルド成果物(状態ファイルなど)をVCリポジトリに保存するのではなく、中央のアーティファクトリポジトリ(S3バケットなど)に保存します。 – KJH

+0

ロックを提供するためにTerragruntは必要ありません。これはTerraformに組み込まれています:https://www.terraform.io/docs/state/locking.html –

関連する問題