EmotionTechテックブログ

株式会社エモーションテックのProduct Teamのメンバーが、日々の取り組みや技術的なことを発信していくブログです。

Terraformのバージョンをv1.3.5からv1.9.5に上げた話

はじめに

エモーションテックで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を設定していた箇所が原因であることがわかりました。

Terraform 1.6.x does not find *.tfstate file in s3 which was created using older versions of terraform

project-b/terragrunt.hclpath_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ブロックが使えるようになったため、今後のインフラ管理がより効率的になりそうです。

おわりに

エモーションテックでは顧客体験、従業員体験の改善をサポートし、世の中の体験を変えるプロダクトを開発しています。この記事や他の記事を見て少しでも弊社に興味をもっていただけましたら、ぜひ採用ページからご応募をお願いいたします。

https://careers.emotion-tech.co.jp/