🤖

Terraform のついでに Terramate を使い始めました

2024/12/06に公開

はじめに

この記事は Commune Advent Calendar 2024シリーズ 2の 6日目の記事です。

IaC として Terraform を使い始めました。周辺ツールをさぐっていたところ、Terramate というツールをみつけ、使ってみたのでその話をしたいと思います。

Terramate とは

すでにわかりやすい記事がありました。
https://zenn.dev/yuta28/articles/terramate-empower-iac

今回つかってみようとおもった点は、「コード生成」が一番大きな理由です。ちなみに、リポジトリをみるかぎり「 CNCF and Linux Foundation silver member.」らしいです。

コード生成ってなに?

Terramate の設定ファイルは、*.tm.hcl として保存します。ここに様々な設定を書いていくわけです。コード生成をするには generate_hcl[1] ブロックを利用します。以下は公式ドキュメントのサンプルです。

example.tm.hcl
generate_hcl "backend.tf" {
  content {
    backend "local" {}
  }
}

ブロックのラベル名 backend.tf がそのまま生成されるファイル名になります。公式サンプルをみると _terramate_generated_backend.tf のように自動生成されたことがわかりやすい名前をつけるのもいいみたいです。

https://github.com/terramate-io/terramate-example-code-generation/blob/main/stacks/backend.tm.hcl

サンプルのように、globals[2]ブロックと組み合わせることで、柔軟にファイルを生成することができます。
https://github.com/terramate-io/terramate-example-code-generation/blob/c03e9187664e88bcef5b3e3cfe2876d64763a0fb/stacks/config.tm.hcl#L8-L41

また、import[3]ブロックを使うことで他の設定ファイルを読み込むことができます。テンプレートとなるファイルを別のフォルダへ切り出しておき必要に応じて読み込むことができるようです。サンプルでは、import_cloud_run.tm.hclcloud_run.tm.hcl を import しています。

https://github.com/terramate-io/terramate-example-code-generation/blob/c03e9187664e88bcef5b3e3cfe2876d64763a0fb/stacks/prod/cloud-runs/import_cloud_run.tm.hcl#L13-L15

https://github.com/terramate-io/terramate-example-code-generation/blob/c03e9187664e88bcef5b3e3cfe2876d64763a0fb/modules/cloud-run/cloud_run.tm.hcl#L36-L38

Google Cloud を想定して使ってみる

各種設定ファイル

Google Cloud を想定してコード生成を体験してみます。フォルダの構造は以下のような形式を想定しています。

terraform
├── application
│   ├── environments
│   │   ├── develop
│   │   │   ├── config.tm.hcl
│   │   │   ├── main.tf
│   │   │   └── stack.tm.hcl
│   │   ├── production
│   │   └── staging
│   └── modules
├── config.tm.hcl
└── providers
    ├── develop
    │   └── application.config.tml
    ├── production
    └── staging

stack の作成からやっていきます。

mkdir terraform ; cd $_
# stack の作成
APP_NAME=application
terramate create --name "${APP_NAME}-production" --description "${APP_NAME}'s develop stack" ${APP_NAME}/environments/production
terramate create --name "${APP_NAME}-develop" --description "${APP_NAME}'s develop stack" ${APP_NAME}/environments/develop
terramate create --name "${APP_NAME}-staging" --description "${APP_NAME}'s staging stack" ${APP_NAME}/environments/staging

# 確認
$ terramate list
application/environments/develop
application/environments/production
application/environments/staging

一番上に共通の config.tm.hcl を定義しています。globals をつかって、バージョン情報やGoogleCloudプロジェクト情報など設定ファイルで使う変数を定義しています。また、ここで backend や provider の定義もついでにやっています。backend の prefix に terramate の stack 名を利用しています。

https://github.com/sikeda107/tech-blog/blob/main/terraform/application/config.tm.hcl

次にapplication.config.tm.hcl にて、provider を定義したファイルを生成する設定をします。先ほどの globals で定義した変数をここで使っています。これは環境ごとにつくるので、develop 以外に production, staging も同様に作成します。

https://github.com/sikeda107/tech-blog/blob/main/terraform/providers/develop/application.config.tm.hcl

さいごに、stack 配下の config.tm.hcl で 先ほど定義した provider を生成するファイルを読み取るようにします。これは stack ごとに作成します。provider 生成ファイルを共通化することで、今後 stack を増やしたときに簡単に生成できるようになります。

https://github.com/sikeda107/tech-blog/blob/main/terraform/application/environments/develop/config.tm.hcl

いよいよ生成します

※ application-develop stack しか config.tm.hcl を定義していないので、develop だけ生成されています。

$ terramate generate

Code generation report

Successes:

- /terraform/application/environments/develop
        [+] _terramate_generated_config.tf
        [+] _terramate_generated_providers.tf

- /terraform/application/environments/production
        [+] _terramate_generated_config.tf

- /terraform/application/environments/staging
        [+] _terramate_generated_config.tf

Hint: '+', '~' and '-' mean the file was created, changed and deleted, respectively.

こんな感じの Terraform ファイルが生成されました🎉

https://github.com/sikeda107/tech-blog/blob/main/terraform/application/environments/develop/_terramate_generated_config.tf

https://github.com/sikeda107/tech-blog/blob/main/terraform/application/environments/develop/_terramate_generated_providers.tf

コメントとして、Terramate によって生成された旨の記載があります。この生成ファイルは手動でいじらないように気をつけましょう。このファイルは通常の Terraform ファイルとなんら違いはありません。そのため、仮に Terramate をやめるときがきてもスムーズに移行できそうな気がします。

Tips

  • VScode Extention があるようです。入れたあとは、設定を追加しましょう

https://marketplace.visualstudio.com/items?itemName=Mineiros.terramate


Settings -> Text Editor -> Files -> Associations

  • フォーマットしたいときは、terramate fmt を使いましょう
  • -C, --chdir=STRING でディレクトリを指定して実行できます

おわりに

今回、あらたに Terramate を導入してコード生成について紹介しました。コード生成によって、ディレクトリが増えていってもファイルコピーをする量が激減してよさそうです💪
次回は Terramate を活用してみてや CICD を組んでみての感想などをご紹介できればと思います。Terramate でよりよい IaC を実現していきたいです。

脚注
  1. generate_hcl | Block | Configuration Language | Terramate Docs ↩︎

  2. globals | Block | Configuration Language | Terramate Docs ↩︎

  3. import | Block | Configuration Language | Terramate Docs ↩︎

コミューン株式会社

Discussion