Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Terragruntで快適なIaCを!
Search
KOHEKOHE
January 19, 2025
Programming
0
38
Terragruntで快適なIaCを!
SRE Kaigi 2025のLTのために作成した資料
KOHEKOHE
January 19, 2025
Tweet
Share
More Decks by KOHEKOHE
See All by KOHEKOHE
LT_TerragruntでAWS環境を構築してみた_20250220
kohekohe
1
40
Replaced the app with Next.js, Golang and Auth0 20240619
kohekohe
0
92
LT_Amazon_ECSで複数環境のDockerイメージを頑張って共通化した話.pdf
kohekohe
0
16
Terraform user getting started with AWS CDK
kohekohe
0
160
Other Decks in Programming
See All in Programming
Honoのおもしろいミドルウェアをみてみよう
yusukebe
1
210
color-scheme: light dark; を完全に理解する
uhyo
5
380
ARA Ansible for the teams
kksat
0
150
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.3k
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
37
14k
仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don't repeat yourself" for resilience to specification changes
mkmk884
0
260
sappoRo.R #12 初心者セッション
kosugitti
0
250
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
560
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
840
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
910
Unity Android XR入門
sakutama_11
0
160
責務と認知負荷を整える! 抽象レベルを意識した関心の分離
yahiru
4
570
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
328
21k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
How STYLIGHT went responsive
nonsquared
98
5.4k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Fireside Chat
paigeccino
34
3.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Building an army of robots
kneath
303
45k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
Transcript
Terragruntで快適なIaCを! kohekohe 2025年1月26日 ENGINEER LIGHTNING TALK @Kohei-Sato-1221 @kohekohe1221
佐藤幸平(こへこへ) @Kohei-Sato-1221 @kohekohe1221 所属:e-dash株式会社 役割:SRE‧EM 出⾝:埼⽟県 趣味:旅⾏‧お酒 ⾃⼰紹介 ABOUT ME 2
会社について ABOUT e-dash 3 • 企業のCO2排出量可視化‧削減のSaaSを開発 • 三井物産出資のスタートアップ • 2022年設⽴‧本社は⾚坂⾒附付近 •
ソフトウェアエンジニア絶賛募集中です
• TerragruntというTerraformをラッパーしたツールを導⼊した感想を話 します。 • Terraformをある程度理解している前提で話します。 • AWSで環境を構築する想定で話します。 • ソースコードは弊社独⾃の運⽤で⽣まれたものなので、ベストプラク ティスかどうかは不明です。
LTの概要‧注意点 4
• Gruntwork社がメンテしているTerraformをラッパーしたツール。 • より簡単‧簡素にTerraformを使ったIaCを運⽤することができる。 • 基本的には.tfファイルを使ってインフラを記述することはTerraformと 同じ。 • Terraform運⽤時の難点を解消することができるかも。 Terragruntって何?
5
Terraformは強⼒なIaCツールですが、不便だと感じる点がいくつ か、、、 1. 複数環境の設定ファイルの管理が煩雑 2. Stateファイルの分割が⾯倒 3. Stateを格納するS3バケットを⼿動で作成しないといけない 4. terraform
initを適宜実⾏しないといけない Terragruntを使えば、これらの難点が解消するかも?! Terraformの難点 6
弊社ではWorkspaceは使わずに 環境ごとにディレクトリを切っ てTerraformを運⽤。 ⇩ 各環境ごとにmain.tfを⽤意しな いといけない。 Terraformの難点:複数環境の設定ファイルの管理が煩雑 7 ※Terraformでの構築例
モジュール毎にhclと呼ばれる設定ファ イルを⽤意 ⇩ 設定ファイル数は増えているが、「ほぼ コピペで済む&変更の頻度は少ない」 のでメンテナンスコストは下がる ※⼦hclは親hclを継承できる Terraformの難点:複数環境の設定ファイルの管理が煩雑 8 ※Terragruntでの構築例
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 = <<EOF terraform { required_version = "= 1.9.8" required_providers { aws = { source = "hashicorp/aws" version = "5.59.0" } } } EOF } inputs = { variables = local.variables.locals } develop環境⽤の親hclファイルの例
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 = <<EOF terraform { required_version = "= 1.9.8" required_providers { aws = { source = "hashicorp/aws" version = "5.59.0" } } } EOF } inputs = { variables = local.variables.locals } develop環境⽤の親hclファイルの例 環境名をディレクトリから引っ張ってくる パスからモジュール名を取得 環境変数を格納している hclファイルを指定 inputsが子に引き継がれる tfファイルを生成する
include { path = find_in_parent_folders() } terraform { source =
"../../../modules/${path_relative_to_include()}" } Terraformの難点:複数環境の設定ファイルの管理が煩雑 11 S3⽤の⼦hclファイルの例 • inputsが親から引き継がれるので、⼦hcl⽤にわざわざ記述 しなくてよい • これを各モジュールの配下にコピペしていく
Terraformの難点:Stateファイルの分割が⾯倒 12 • プロジェクトが⼤きくなってくるとterraform plan(apply)の実⾏時間 は⻑くなるため、適宜Stateの分割を検討するとよい。 • しかし、terraformではStateの分割は結構めんどくさい。 • Terragruntでは、既述のディレクトリ構成を採⽤するだけで
モジュー ル毎にStateファイルを勝⼿に分割してくれる。
• TerraformではStateを格納するS3バケットは⼿動で作成することが推 奨されている。 • Terragruntではterragrunt apply(terraform apply的なコマンド)を実 ⾏する際に⾃動でS3バケットを作成してくれる。 Terraformの難点:Stateを格納するS3バケットを⼿動で作成しないといけない 13
Terraformの難点:terraform initを適宜実⾏しないといけない 14 • Terraformではモジュールの新規追加を⾏なった場合は、terraform initを都度実⾏しないといけない。 • Terragruntでは、applyやplanを実⾏する際に裏側でプラグインのダ ウンロードやバックエンドの初期化が⾃動で⾏われる。
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 検索
THANK YOU! ENGINEER LIGHTNING TALK kohekohe @Kohei-Sato-1221 @kohekohe1221