複数のTerraform環境を管理する
Stephane Jourdan
2020年6月30日
0 分で読めます編集者注: この記事はもともと CloudSkiff.comに掲載されたものです。 CloudSkiffはSnykに加わりました (2021年10月)。
複数のTerraform環境を管理する複雑さに、どう対処すればよいでしょうか?複数の環境があり、複数のチームが関わる可能性もあるため、管理は難しくなりがちです。この記事では、プロのように複数のTerraform環境を管理するための始め方をご紹介します。
TFファイルから始める
複数のTerraform環境を管理する必要がある場合、取り組み方を発展させ、始める方法はいくつもあります。
単一の.tfファイルから段階的に始める場合、最初からすべてのベストプラクティスを把握するのは大変です。せいぜい気が散ってしまい、最悪の場合は意欲を失うかもしれません。そこで、まずは単一のTFStateを使う、ごくシンプルな方法から始めてみましょう。Terraformファイルを作成し、production.tfという名前を付け、VPCやVMなどを記述します。ほどなくして、別の環境も作れるようになります。たとえばstaging.tfとしましょう。引き続きTFStateファイルは1つだけなので、それ自体は問題ありませんが、規模の拡大には対応できません。それでも、段階的に取り組む方法の1つです。
Terraformワークスペースを使う
HashiCorpは、現在ワークスペースと呼ばれている機能の使用を推奨しています。workspacesはTerraformのサブコマンドです。以前はenvironmentsという名前でした。
ワークスペースの目的は、環境ごとにTFStateファイルを分けることです。たとえば、QA環境やステージング環境、本番環境があるとします。Terraformのworkspaceサブコマンドを使うと、TFStateを切り替えられます。これはHashiCorpが推奨する方法ですが、必ずしもそのとおりにする必要はありません。
Gitリポジトリ内のフォルダで整理する
別の方法として、ワークスペースを使わずにフォルダで分け、stateファイルを分割することもできます。Gitリポジトリにフォルダを作成し、stagingやproductionのように名前を付け、それぞれのフォルダから異なるTFStateファイルを生成するだけです。とても簡単で、環境を「TFState単位」で分割できます。
モジュール:Terraform環境を管理する一般的な方法
モジュールの使用は、今や標準的な方法になりつつあります。少し高度な方法ですが、モジュールは基本的に、文字列などの変数を渡して動作します。Terraformの非常に便利な機能です。
モジュールには汎用的なコードが含まれます。標準的なVPCを例に考えてみましょう。このVPCには、サブネットワークや名前など、複数の値を指定できます。環境ごとにフォルダを1つずつ作成する方法があります。最初のTerraformファイルではステージングVPCのアドレス空間を指定し、もう一方のファイルでは別のアドレス空間を指定します。つまり、モジュールに異なる値を渡すだけで、この問題を解決できます。
環境を使う方法として、私がおすすめするのは以上です。
まずは単一のTFStateでシンプルに始め、フォルダを作成してフォルダごとにstateを分割し、モジュールに異なる種類の値を渡すか、ワークスペースを使うなどHashiCorpの推奨する方法に従いましょう。
リソースを整理し、ディレクトリ構成を決める
最後に検討すべきなのは、リソースの整理方法とディレクトリ構成です。リポジトリは1つにしますか?それとも複数に分けますか?
答えは1つではありませんが、よくある構成として、モジュールを別に管理し、単一のリポジトリから呼び出す方法があります。例を見てみましょう。2つの変数からVPCを適切に設定するモジュールがあるとします。これは適切なTerraformコードです。このコードを独立したTerraform用のGitリポジトリに保存し、他のプロジェクトと同じように管理、バージョン管理、リリースできます。ただし、そのままでは使えません。エンジニアリングで標準ライブラリを使うのと同じように、このモジュールを呼び出すインフラ用リポジトリが必要です。
フォルダ階層も重要だと考える人もいます。テスト用、モジュール用、環境用にそれぞれフォルダを分ける構成はよく見られます。
もう1つよくあるパターンは、さまざまな値をまとめた変数ファイルを使い、環境変数を通じて実行時に各環境へ値を渡す方法です。
Terraformコードを保護する
Snyk IaCは、Terraformの設定(Kubernetes、CloudFormation、ARMテンプレートも対象)をコーディング中に保護し、ガイド付きの修正を提案するので、安心してマージし、次の作業に進めます。コードを書きながらテストできるほか、Gitリポジトリの変更を監視し、デプロイ前にビルドパイプラインでテストを自動化できます。無料プランなら数分で利用を開始できます。一方、IaCの設定ミスによる侵害は、長期にわたる深刻な被害を招くおそれがあります。以下から登録して、設定の保護を始めましょう。
ソースコードの段階からインフラを保護
Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。



