🎆

手を動かしてメリットを実感するTerragrunt入門2 〜Terragruntを使ってみよう! その1 〜

2024/12/03に公開

はじめに

こんにちは!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
environments/develop/terragrunt.hcl
// 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
}
environments/develop/s3/terragrunt.hcl
// s3モジュール用の設定ファイル
include {
  path = find_in_parent_folders()
}

terraform {
  source = "../../../modules/${path_relative_to_include()}"
}
envs/env_develop.hcl
//開発環境で利用する変数を管理するファイル
locals {
  app_name    = "sugar-terragrunt-app"
  environment = "develop"
}
modules/s3/s3.tf
resource "aws_s3_bucket" "sample_bucket" {
  bucket = "${local.app_name}-sample-${local.environment}" //Terragruntで作成するバケット[^2]
}
modules/s3/variables.tf
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