Slide 1

Slide 1 text

Terragruntで快適なIaCを! 
 kohekohe 2025年1月26日 ENGINEER LIGHTNING TALK @Kohei-Sato-1221 @kohekohe1221

Slide 2

Slide 2 text

佐藤幸平(こへこへ) @Kohei-Sato-1221 @kohekohe1221 所属:e-dash株式会社 役割:SRE‧EM 出⾝:埼⽟県 趣味:旅⾏‧お酒 ⾃⼰紹介 ABOUT ME 2

Slide 3

Slide 3 text

会社について ABOUT e-dash 3 ● 企業のCO2排出量可視化‧削減のSaaSを開発 ● 三井物産出資のスタートアップ ● 2022年設⽴‧本社は⾚坂⾒附付近 ● ソフトウェアエンジニア絶賛募集中です

Slide 4

Slide 4 text

● TerragruntというTerraformをラッパーしたツールを導⼊した感想を話 します。 ● Terraformをある程度理解している前提で話します。 ● AWSで環境を構築する想定で話します。 ● ソースコードは弊社独⾃の運⽤で⽣まれたものなので、ベストプラク ティスかどうかは不明です。 LTの概要‧注意点 4

Slide 5

Slide 5 text

● Gruntwork社がメンテしているTerraformをラッパーしたツール。 ● より簡単‧簡素にTerraformを使ったIaCを運⽤することができる。 ● 基本的には.tfファイルを使ってインフラを記述することはTerraformと 同じ。 ● Terraform運⽤時の難点を解消することができるかも。 Terragruntって何? 5

Slide 6

Slide 6 text

Terraformは強⼒なIaCツールですが、不便だと感じる点がいくつ か、、、 1. 複数環境の設定ファイルの管理が煩雑 2. Stateファイルの分割が⾯倒 3. Stateを格納するS3バケットを⼿動で作成しないといけない 4. terraform initを適宜実⾏しないといけない Terragruntを使えば、これらの難点が解消するかも?! Terraformの難点 6

Slide 7

Slide 7 text

弊社ではWorkspaceは使わずに 環境ごとにディレクトリを切っ てTerraformを運⽤。 ⇩ 各環境ごとにmain.tfを⽤意しな いといけない。 Terraformの難点:複数環境の設定ファイルの管理が煩雑 7 ※Terraformでの構築例

Slide 8

Slide 8 text

モジュール毎にhclと呼ばれる設定ファ イルを⽤意 ⇩ 設定ファイル数は増えているが、「ほぼ コピペで済む&変更の頻度は少ない」 のでメンテナンスコストは下がる ※⼦hclは親hclを継承できる Terraformの難点:複数環境の設定ファイルの管理が煩雑 8 ※Terragruntでの構築例

Slide 9

Slide 9 text

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}" key = "${path_relative_to_include()}/terraform.tfstate" encrypt = true } } (右に続く...) Terraformの難点:複数環境の設定ファイルの管理が煩雑 9 (....左の続き) generate "provider" { path = "provider.tf" if_exists = "overwrite_terragrunt" contents = <

Slide 10

Slide 10 text

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}" key = "${path_relative_to_include()}/terraform.tfstate" encrypt = true } } (右に続く...) Terraformの難点:複数環境の設定ファイルの管理が煩雑 10 (....左の続き) generate "provider" { path = "provider.tf" if_exists = "overwrite_terragrunt" contents = <

Slide 11

Slide 11 text

include { path = find_in_parent_folders() } terraform { source = "../../../modules/${path_relative_to_include()}" } Terraformの難点:複数環境の設定ファイルの管理が煩雑 11 S3⽤の⼦hclファイルの例 ● inputsが親から引き継がれるので、⼦hcl⽤にわざわざ記述 しなくてよい ● これを各モジュールの配下にコピペしていく

Slide 12

Slide 12 text

Terraformの難点:Stateファイルの分割が⾯倒 12 ● プロジェクトが⼤きくなってくるとterraform plan(apply)の実⾏時間 は⻑くなるため、適宜Stateの分割を検討するとよい。 ● しかし、terraformではStateの分割は結構めんどくさい。 ● Terragruntでは、既述のディレクトリ構成を採⽤するだけで モジュー ル毎にStateファイルを勝⼿に分割してくれる。

Slide 13

Slide 13 text

● TerraformではStateを格納するS3バケットは⼿動で作成することが推 奨されている。 ● Terragruntではterragrunt apply(terraform apply的なコマンド)を実 ⾏する際に⾃動でS3バケットを作成してくれる。 Terraformの難点:Stateを格納するS3バケットを⼿動で作成しないといけない 13

Slide 14

Slide 14 text

Terraformの難点:terraform initを適宜実⾏しないといけない 14 ● Terraformではモジュールの新規追加を⾏なった場合は、terraform initを都度実⾏しないといけない。 ● Terragruntでは、applyやplanを実⾏する際に裏側でプラグインのダ ウンロードやバックエンドの初期化が⾃動で⾏われる。

Slide 15

Slide 15 text

Zennで記事を書いたのでより詳しく知りたい⽅はよければアクセスください。 ⼿を動かしてメリットを実感するTerragrunt⼊⾨1~3 https://zenn.dev/edash_tech_blog/articles/2e2482fd27647c https://zenn.dev/edash_tech_blog/articles/ebc1db4195a31d https://zenn.dev/edash_tech_blog/articles/085fe5381b99e2 「e-dash Terragrunt」でググればヒットすると思います。」 最後に 15 e-dash Terragrunt 検索

Slide 16

Slide 16 text

THANK YOU! ENGINEER LIGHTNING TALK kohekohe @Kohei-Sato-1221 @kohekohe1221