複数のTerraformバージョンを管理する4つのヒント
Stephane Jourdan
2020年5月27日
0 分で読めます編集者注: この記事は当初、 CloudSkiff.comに掲載されました。 CloudSkiffはSnykに加わりました (2021年10月)。
ローカル環境で複数のTerraformバージョンを使う必要がある理由はさまざまです。たとえば、バージョンを分けた複数の環境(構成済みのデプロイ)を使う場合、複数の顧客向けのプロジェクトを並行して進める場合、複数のバージョンでコードを実行して後方互換性を確保する場合などです。複数のTerraformバージョンをすっきり整理して管理するための、基本的なヒントをご紹介します。
まずはローカル環境で環境/Terraformバージョン管理ツールを使う
バージョン管理ツールを使えば、ローカル環境で複数のTerraformバージョンを扱う手間を大幅に減らせます。また、次のことも実現できます。
プロジェクト間をすばやく切り替えられる
開発環境を本番環境にできるだけ近づけられる
tfenvは、rbenvに着想を得た優れたツールです。基本的に、tfenvを使うと、特定のTerraformバージョンをインストールして、デフォルトでそのバージョンに切り替えられます。ノートパソコンにインストール済みのTerraformバージョンを一覧表示して、管理することもできます。さらに、tfenv install min-requiredなどの便利なコマンドもあります。このコマンドはTerraformファイルを再帰的に調べ、必要な最小バージョンを特定します。
Terraformのバージョンを明示的に指定する
Terraformのアップグレードが問題を引き起こすことはよくあります。原因のわからない例外が発生し、特定のマシンで間違ったTerraformバージョンを実行していたためだと判明した場合は、なおさら厄介です。
必要なTerraformバージョンを明示的に指定しておけば、間違った環境でapplyを実行しようとしたときに、明確なエラーが表示されます。

モジュールのバージョンも設定する
変化する要素はプログラマーにとって厄介なものですが、Infrastructure as Codeも例外ではありません。Terraformモジュールを使えば再利用性と構成の柔軟性が高まりますが、管理が複雑になることもあります。
モジュールのバージョンを設定すると、モジュールをアップグレードした際にインフラのどの部分がいつ変更されるかを、より簡単に管理できます。コードベースの特定のコミットに対して、常に同じものをデプロイできることも保証されます。
また、モジュールのアップグレードを段階的に展開できます。旧バージョンを本番環境で使い続けながら、モジュールをアップグレードした開発ブランチを作成し、開発環境でテストします。テストに合格したら、masterにマージできます。
使うモジュールが増えるほど、いずれかのモジュールが問題を引き起こす可能性も高まります。そのため、コードベースの拡大に伴って、モジュールのバージョン管理はますます重要になります。
ローカルでのapplyを防ぎ、masterへのコミットを抑止する
ワークフローも忘れずに確認しましょう。2人のユーザーが同じTerraformファイルで作業している場合、ローカルでapplyを実行すると危険です。短時間のうちに2つの更新が行われると、先に行われた更新が後の更新で上書きされる可能性があります。また、ノートパソコンで何が起きるかはわかりません。Wi-Fiの接続が切れて、大きなstateファイルが破損したという話も聞いています。
そのため、本番環境に適したワークフローでは、CI/CDなどの一元管理されたバージョン管理システムからのみapplyを実行することを推奨します。
次のステップは、その動作をプロセスに組み込むことです。たとえば、ユーザーのアクセス権では本番環境を直接変更できないようにします。変更できる権限を持つのは、CI/CDのキーだけです。
同様に、ベストプラクティスではないとわかっていても、masterにマージしたくなることがあります。masterをロックすれば、プルリクエストを作成してレビューを受ける、より安全なプロセスを徹底できます。Terraformのplanを必ず確認し、決してミスをしない超人的な人でない限りは、そうするのがおすすめです。
チームによっては、コードを長期にわたってきれいに保つための小さな投資として、lintやドキュメント更新の確認などの手順を追加しています。
Terraformコードを保護する
Snyk IaCは、Terraformの設定ファイル(Kubernetes、CloudFormation、ARMテンプレートも対象)をコーディング中に保護し、ガイド付きの修正を提示します。修正をマージしたら、すぐ次の作業に進めます。コーディングしながらテストし、Gitリポジトリの変更を監視し、デプロイ前にビルドパイプラインでのテストを自動化できます。無料プランなら数分で使い始められます。一方、IaCの設定ミスによる侵害は、取り返しのつかない被害につながることがあります。以下から登録して、設定ファイルの保護を始めましょう。
ソースコードの段階からインフラを保護
Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。
