手を動かしてメリットを実感するTerragrunt入門2 〜Terragruntを使ってみよう! その1 〜
はじめに
こんにちは!e-dashのSREグループ所属のkohekoheです。
今回はe-dashのインフラ管理のツールとして新規導入したTerragruntというツールに関して紹介したいと思います。
Terragrunt入門の記事として3本の記事を投稿します。次の構成で紹介したいと思います。
1.Terragruntの概要とどういったメリットがあるのかを解説します
2.Terragruntを使ったハンズオン①(導入〜単一モジュールのプロビジョニング)【★本記事】
3.Terragruntを使ったハンズオン②(複数モジュールのプロビジョニング)
こちらはe-dash advent calendar 2024の3日目の記事です。
注意点
-
Terragrunt
に関して知らない・詳しくない人が対象読者です -
Terraform
の知識は一定ある前提で話を進めます - 本記事ではAWSを用いて解説します
- 筆者はMac book(M3 Pro)にて動作確認しています
Terraform&tfenvのインストール
TerragruntはTerraformをラッパーしたツールなので、Terraformのインストールが必要です。弊社ではtfenvを使ってTerraformのバージョン管理していますので、tfenvをインストールした後、執筆時点での最新の安定版である1.9.8にTerraformのバージョンを固定しておきます。
Macであれば以下のコマンドでインストールとバージョンの固定ができます。
// terraformのインストール
% brew tap hashicorp/tap
% brew install hashicorp/tap/terraform
% brew upgrade hashicorp/tap/terraform
// tfenvのインストール
% brew install tfenv
// Terraformのバージョンを1.9.8に変更
% tfenv use 1.9.8
Switching default version to v1.9.8
Default version (when not overridden by .terraform-version or TFENV_TERRAFORM_VERSION) is now: 1.9.8
// Terrformのバージョンを確認
% terraform --version
Terraform v1.9.8
on darwin_arm64
Terragrunt&tgenvのインストール
それでは次にTerragruntのインストールをしていきたいです。Terragruntはこちらの方法でインストールすることができますが、Terraform同様にバージョン管理ツールありますので、バージョン管理ツールであるtgenvをインストールしたいと思います。
Macであれば以下のコマンドでインストールとバージョンの固定ができます。
以下の例では~/.zshrc
を編集していますが、ご自身の環境に合わせて編集するファイルを適宜変更ください。
// tgenvのインストール
% git clone https://github.com/cunymatthieu/tgenv.git ~/.tgenv
% echo 'export PATH="$HOME/.tgenv/bin:$PATH"' >> ~/.zshrc
// 特定のバージョンのTerragruntをインストール
% tgenv install 0.69.1
% tgenv use 0.69.1
// Terragruntのバージョンを確認
% terragrunt --version
[INFO] Getting version from tgenv-version-name
[INFO] TGENV_VERSION is 0.69.1
terragrunt version v0.69.1
AWSのクレデンシャルの設定
Terraformを使う時と同様にAWSのクレデンシャルの設定を行います。本記事はTerragruntの概要を説明するための記事なので詳細は省きます。~/.aws/credentials
にアクセスキーを設定していただいても問題ないですし、他のやり方でクレデンシャルを設定いただいても問題ないです。
ちなみに弊社ではIAM Identity Centerを利用しておりますので、以下のコマンドを実行することで、一時的なクレデンシャルを取得することができます。
aws configure sso
とりあえずTerragruntを試すのであれば、アクセスキーの設定で問題ないかと思いますが、複数AWS管理する場合はIAM Identity Centerが非常におすすめです。
最初のapply
まずは、特にAWSのリソースを用意せずにTerragruntのapply(≒ terraform apply)を実行してみたいと思います。以下のディレクトリ・ファイル構成を用意してください。サンプルソースコードは、こちらに格納されています。
複数環境での運用を前提とし、develop, staging, productionの3環境を用意します(本記事ではdevelopのみを利用)
environments/
develop/
s3/
terragrunt.hcl
terragrunt.hcl
staging/
(blank)
production/
(blank)
envs/
env_develop.hcl
modules/
s3/
s3.tf
variables.tf
// develop環境の親設定ファイル
locals {
environment = "${replace(replace(replace(get_path_from_repo_root(), "environments/", ""), path_relative_to_include(), ""), "/", "")}"
variables = read_terragrunt_config(find_in_parent_folders("envs/env_${local.environment}.hcl"))
module_name = basename(path_relative_to_include())
}
remote_state {
backend = "s3"
generate = {
path = "backend.tf"
if_exists = "overwrite_terragrunt"
}
config = {
region = "ap-northeast-1"
bucket = "terragrunt-state-sugar-sample-${local.environment}" //Stateを格納するバケット[^1]
key = "${path_relative_to_include()}/terraform.tfstate"
encrypt = true
}
}
generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"
contents = <<EOF
terraform {
required_version = "= 1.9.8"
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.59.0"
}
}
}
EOF
}
inputs = {
variables = local.variables.locals
}
// s3モジュール用の設定ファイル
include {
path = find_in_parent_folders()
}
terraform {
source = "../../../modules/${path_relative_to_include()}"
}
//開発環境で利用する変数を管理するファイル
locals {
app_name = "sugar-terragrunt-app"
environment = "develop"
}
resource "aws_s3_bucket" "sample_bucket" {
bucket = "${local.app_name}-sample-${local.environment}" //Terragruntで作成するバケット[^2]
}
variable "variables" {}
variable "s3_bucket_name" {
default = "not_set"
}
locals {
variables = yamldecode(var.variables)
app_name = local.variables.app_name
environment = local.variables.environment
}
[^1][^2] : S3のバケット名は全世界でユニークになる必要があるので、任意の名前に置き換えてください。
hclファイルという見慣れないファイルが登場します。これがterragruntにおける設定ファイルです。中身の詳細は後ほど説明するとして、これらを用意した状態で、cd environments/develop && terragrunt run-all apply
を実行してみてください。(初回実行時ではStateを格納するS3バケットを作成しますか?、と聞かれると思いますのでYesを選択して進めます。)
実行が正常終了したらAWSコンソール(S3)上で確認しましょう。State格納用のS3バケットと、Terragruntで作成したS3バケットが確認できるはずです。
各ファイルの解説
-
environments/develop/terragrunt.hcl
: これはdevelop環境全体の設定ファイルになっています。develop配下にモジュール毎にhclを配置していきますが、この親のhclを原則引き継ぐことなります。また、このファイルはenvs/env_develop.hcl
の環境変数を読みにいっています。読み込まれた変数はinputs
ブロックを経由して、呼び出し先のモジュールのvariable.tf
に渡されるようになっています。 -
environments/develop/s3/terragrunt.hcl
: S3モジュール設定ファイルとなっています。 -
envs/env_develop.hcl
: 環境変数のファイルです。環境毎にenv_xxxxx.hcl
が用意されることを想定しています。 -
modules/
配下のファイル : Terraformで使用されるファイルと同一です。
続きは次の記事で
3本目に続きます。本記事ではTerragruntに必要な準備と、リソースを1つだけAWS環境にプロビジョニングしました。3本目で複数モジュールのプロビジョニングを行ってみたいと思います。
Discussion