はじめに
エモーションテックでSREチームに所属しているsugawaraです。弊社ではインフラ管理にTerraformを利用しており、複数のプロダクトや社内インフラを含めて約90の環境を管理しています。優先度の兼ね合いもあり長い間Terraformのバージョンアップができていなかったのですが、最近v1.3.5からv1.9.5にアップデートしました。この記事では、バージョンアップ作業において苦労した点と、バージョンアップして良かった点について詳しく解説します。
アップデート前の環境
- Terraform: v1.3.5
- Terragrunt: v0.50.6
- stateファイルの保存先: AWS S3
事前に確認したこと
- Terraform各バージョンのChange Logを確認し、BREAKING CHANGESがないことを確認
- GitHub Actionsで実装しているterraform plan実行ワークフローにより、バージョンアップに伴い差分が発生するかどうかを確認
- 商用環境以外の環境で先行してバージョンアップし、特に問題なくplanとapplyが実行できることを確認
苦労した点
Terraformのバージョンを上げたところ、一部ディレクトリにおいて既存のstateファイルが参照できなくなってしまいました。原因の特定に時間がかかりましたが、最終的にはTerragruntのpath_relative_to_include
を利用していた箇所が原因であることがわかりました。
どのような事象が発生していたのかを以下で説明していきます。
前提
ディレクトリ構成は以下の通りです。Gruntwork社が公開しているTerraformのラッパーツールであるTerragruntを利用していて、terragrunt.hcl
にリモートステートの設定を記述しています。
. ├── project-a │ ├── production │ │ ├── main.tf │ │ ├── provider.tf │ │ ├── terragrunt.hcl │ │ └── version.tf │ └── terragrunt.hcl └── project-b ├── main.tf ├── provider.tf ├── terragrunt.hcl └── version.tf
project-a
ディレクトリ内のterragrunt.hcl
は以下のように設定していました。
remote_state { backend = "s3" config = { bucket = "xxxx-${get_aws_account_id()}" region = "ap-northeast-1" key = "projects/project-a/${path_relative_to_include()}/terraform.tfstate" encrypt = true } }
また、project-a/prodution
ディレクトリ内のterragrunt.hcl
は以下のように設定していました。
include { path = find_in_parent_folders() }
project-b
ディレクトリ内のterragrunt.hcl
についても同じように設定していました。
remote_state { backend = "s3" config = { bucket = "xxxx-${get_aws_account_id()}" region = "ap-northeast-1" key = "projects/project-b/${path_relative_to_include()}/terraform.tfstate" encrypt = true } }
上記の設定により、各ディレクトリのstateファイルはS3バケットの以下のパスに保存されていました。
- project-a/production:
projects/project-a/production/terraform.tfstate
- project-b:
projects/project-b/terraform.tfstate
事象
project-a/production
ディレクトリにおいて、Terraformのバージョンをv1.9.5に上げたところ、特に問題なくアップデートできました。
ただ、project-b
ディレクトリでも同様にTerraformのバージョンをv1.9.5に上げたところ、既存のstateファイルが参照できなくなってしまいました。
TF_LOG=DEBUG
にして確認したところ、stateファイルのパスが以下のようになっていました。
- バージョンアップ前:
projects/project-b/terraform.tfstate
- バージョンアップ後:
projects/project-b/./terraform.tfstate
解決策
以下のIssueを参考に、今まで特に問題がなかったため意味もなくpath_relative_to_include
を設定していた箇所が原因であることがわかりました。
project-b/terragrunt.hcl
のpath_relative_to_include
を削除したところ、問題が解消しました。
良かった点
Terraformのバージョンアップをして良かった点を以下にまとめます。
- importブロックが使えるようになったこと
terraform test
コマンドが使えるようになったこと
importブロックが使えるようになったこと
v1.5.0以降、importブロックが利用できるようになっていました。 今まではimportコマンド、Terraformerを使って既存のリソースをTerraform管理に移行していましたが、importブロックにより今までよりも簡単にリソースをTerraform管理に移行できるようになりました。既存プロダクトに関してTerraform管理できていないリソースがまだあるので、これを利用してTerraform管理にするのを楽にできそうです。
terraform test
コマンドが使えるようになったこと
v1.6.0以降、terraform testコマンドが使えるようになっていました。 これまでTerraformコードのテストは実施できていなかったため、v1.5.0以降で利用できるようになったcheckブロック含めて検討し、コードの品質を向上させていきたいと考えています。
まとめ
Terraformのバージョンをv1.3.5からv1.9.5に上げたところ、一部ディレクトリにおいて既存のstateファイルが参照できなくなってしまいましたが、Issueを参考にして解決することができました。また、バージョンアップによりimportブロックが使えるようになったため、今後のインフラ管理がより効率的になりそうです。
おわりに
エモーションテックでは顧客体験、従業員体験の改善をサポートし、世の中の体験を変えるプロダクトを開発しています。この記事や他の記事を見て少しでも弊社に興味をもっていただけましたら、ぜひ採用ページからご応募をお願いいたします。