Terraform のついでに Terramate を使い始めました
はじめに
この記事は Commune Advent Calendar 2024シリーズ 2の 6日目の記事です。
IaC として Terraform を使い始めました。周辺ツールをさぐっていたところ、Terramate というツールをみつけ、使ってみたのでその話をしたいと思います。
Terramate とは
すでにわかりやすい記事がありました。
今回つかってみようとおもった点は、「コード生成」が一番大きな理由です。ちなみに、リポジトリをみるかぎり「 CNCF and Linux Foundation silver member.」らしいです。
コード生成ってなに?
Terramate の設定ファイルは、*.tm.hcl
として保存します。ここに様々な設定を書いていくわけです。コード生成をするには generate_hcl[1] ブロックを利用します。以下は公式ドキュメントのサンプルです。
generate_hcl "backend.tf" {
content {
backend "local" {}
}
}
ブロックのラベル名 backend.tf
がそのまま生成されるファイル名になります。公式サンプルをみると _terramate_generated_backend.tf
のように自動生成されたことがわかりやすい名前をつけるのもいいみたいです。
サンプルのように、globals[2]ブロックと組み合わせることで、柔軟にファイルを生成することができます。
また、import[3]ブロックを使うことで他の設定ファイルを読み込むことができます。テンプレートとなるファイルを別のフォルダへ切り出しておき必要に応じて読み込むことができるようです。サンプルでは、import_cloud_run.tm.hcl
が cloud_run.tm.hcl
を import しています。
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 名を利用しています。
次にapplication.config.tm.hcl
にて、provider を定義したファイルを生成する設定をします。先ほどの globals で定義した変数をここで使っています。これは環境ごとにつくるので、develop 以外に production, staging も同様に作成します。
さいごに、stack 配下の config.tm.hcl
で 先ほど定義した provider を生成するファイルを読み取るようにします。これは stack ごとに作成します。provider 生成ファイルを共通化することで、今後 stack を増やしたときに簡単に生成できるようになります。
いよいよ生成します
※ 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 ファイルが生成されました🎉
コメントとして、Terramate によって生成された旨の記載があります。この生成ファイルは手動でいじらないように気をつけましょう。このファイルは通常の Terraform ファイルとなんら違いはありません。そのため、仮に Terramate をやめるときがきてもスムーズに移行できそうな気がします。
Tips
- VScode Extention があるようです。入れたあとは、設定を追加しましょう
Settings -> Text Editor -> Files -> Associations
- フォーマットしたいときは、
terramate fmt
を使いましょう -
-C, --chdir=STRING
でディレクトリを指定して実行できます
おわりに
今回、あらたに Terramate を導入してコード生成について紹介しました。コード生成によって、ディレクトリが増えていってもファイルコピーをする量が激減してよさそうです💪
次回は Terramate を活用してみてや CICD を組んでみての感想などをご紹介できればと思います。Terramate でよりよい IaC を実現していきたいです。
Discussion