🎉

Terraformでoverride.tfを用いて環境ごとのbackendを効率的に設定する

2024/06/18に公開

概要と背景

実行環境によってTerraformのbackend設定をoverride.tfを使用して既存の設定を上書きする。
リポジトリにpushしているコードにはbackend設定がazurermになっており、ローカルで実行する際にはこの記述をlocalに変更する作業が煩わしく感じ、何かいい方法はないかと模索したところ公式ドキュメントにoverride.tfなるものを発見した。

Terraformのバックエンドとは

Terraformのバックエンドは、Terraformの状態ファイル(state file)を保存する場所を指します。バックエンドには、ローカルファイルシステム、AzureのStorage Account、Terraform Cloudなどが利用できます。適切なバックエンド設定は、チームでの共同作業や状態ファイルの管理において非常に重要です。

Terraformのバックエンドに関してはこちら

override.tfファイルとは

https://developer.hashicorp.com/terraform/language/files/override
override.tfファイルは、Terraformの設定を上書きするためのファイルです。override.tfファイル以外の.tfファイルよりも優先されるため、特定の設定を上書きしたい場合に利用できます。このファイルを使うことで、環境ごとに異なる設定を適用することが容易になります。今回はこのoverride.tfをGitHubでは管理せず、ローカルのファイルに配置することで、GitHubからリポジトリをCheckOutするCI/CDではバックエンドの設定をAzureのStorageAccountに、ローカル実行の場合はバックエンドの設定をローカルのファイルシステムに設定されるようにしていました。

ユースケース

異なる環境で異なる設定を簡易的に適応する場面が挙げられます。
例えば、本番環境と開発環境で異なるバックエンドを設定することが挙げられます。

次に、具体的なユースケースとして、本番環境ではリモートにステートを保存し、開発環境ではローカルに保存する設定を見ていきましょう。

override.tf以外で指定していたバックエンド設定の例

まずは、通常のバックエンド設定を見てみましょう。例えば、AzureのStorage Accountをバックエンドとして利用する場合、以下のような設定になるでしょう:

terraform {
  backend "azurerm" {
    resource_group_name  = "StorageAccount-ResourceGroup"  # Can be passed via `-backend-config=`"resource_group_name=<resource group name>"` in the `init` command.
    storage_account_name = "abcd1234"                      # Can be passed via `-backend-config=`"storage_account_name=<storage account name>"` in the `init` command.
    container_name       = "tfstate"                       # Can be passed via `-backend-config=`"container_name=<container name>"` in the `init` command.
    key                  = "prod.terraform.tfstate"        # Can be passed via `-backend-config=`"key=<blob key name>"` in the `init` command.
  }
}

この設定は、terraform initを実行する際に適用されます。

override.tfでバックエンド設定を上書きする手順

では、override.tfファイルを使ってバックエンドの設定を上書きする方法を見ていきましょう。
実際にローカルで実行する際に、本番環境の設定を開発環境の設定で上書きする場合は、以下のように設定します。

通常のバックエンド設定

プロダクション環境で使用するバックエンド設定をmain.tfや他の設定ファイルに記述します。

main.tf
terraform {
  backend "azurerm" {
    resource_group_name  = "StorageAccount-ResourceGroup"
    storage_account_name = "abcd1234"
    container_name       = "tfstate"
    key                  = "prod.terraform.tfstate"
  }
}

override.tfファイルの作成

環境ごとに異なる設定をoverride.tfファイルに記述します。今回はローカルの開発環境で使用します。

override.tf
terraform {
  backend "locak" {}
}

terraform initの実行

override.tfファイルを用意したら、terraform initを実行します。この時点で、override.tfの設定が適用され、バックエンドの設定が上書きされます。そのため、ローカルの開発環境で実行すると、バックエンドの設定がlocalになります。

$ terraform init

override.tfの設定を使用することが好ましくない場合は、override.tfファイルを削除するか無視することで、デフォルトのバックエンド設定が適用されます。

注意点とベストプラクティス

  • バージョン管理: override.tfファイルは環境ごとに異なるため、バージョン管理システム(例えばGit)で管理する際には注意が必要です。特定のブランチやフォルダ構造を利用して環境ごとに管理すると良いでしょう。
  • セキュリティ: バックエンド設定には機密情報が含まれることがあります。override.tfファイルを適切に管理し、必要に応じて暗号化やアクセス制限を行いましょう。
  • 一貫性の確保: 複数のoverride.tfファイルが存在する場合、どの設定が適用されるかを明確に理解しておくことが重要です。混乱を避けるために、ドキュメントを整備しましょう。

まとめ

override.tfファイルを利用することで、Terraformのバックエンド設定を柔軟に上書きすることができます。この方法を活用することで、環境ごとに異なる設定を簡単に管理することができ、より効率的なインフラ管理が可能になります。今回の記事を参考に、ぜひoverride.tfを活用してみてください。

以上、Terraformでoverride.tfを用いてバックエンドの設定を上書きする方法について解説しました。お役に立てれば幸いです。

Discussion