Skip to main content

複数のTerraformバージョンを管理する4つのヒント

著者
Headshot of Stephane Jourdan

Stephane Jourdan

feature synk iac terraform green

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を実行しようとしたときに、明確なエラーが表示されます。

terraform {
required_version = "0.12.10"
}
main.tfでTerraform Coreのバージョンがサポートされていないことと、必須バージョン制約が0.12.10であることを示すターミナルエラー

モジュールのバージョンも設定する

変化する要素はプログラマーにとって厄介なものですが、Infrastructure as Codeも例外ではありません。Terraformモジュールを使えば再利用性と構成の柔軟性が高まりますが、管理が複雑になることもあります。

モジュールのバージョンを設定すると、モジュールをアップグレードした際にインフラのどの部分がいつ変更されるかを、より簡単に管理できます。コードベースの特定のコミットに対して、常に同じものをデプロイできることも保証されます。

module “blabla” {
source = “module_name”
version = “1.2.3”
}

また、モジュールのアップグレードを段階的に展開できます。旧バージョンを本番環境で使い続けながら、モジュールをアップグレードした開発ブランチを作成し、開発環境でテストします。テストに合格したら、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セキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。