Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Terraformディレクトリ構成のベスプラを考えてみた
Search
TatsuyaYamashita
April 12, 2022
Programming
530
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Terraformディレクトリ構成のベスプラを考えてみた
TatsuyaYamashita
April 12, 2022
More Decks by TatsuyaYamashita
See All by TatsuyaYamashita
AWS re:Invent2023 - Keynote 俺的まとめ
tatsuya4150
0
100
Top Engineersの選出理由となっていそうな事例のお話
tatsuya4150
0
240
SI視点でのStripe使いこなし術
tatsuya4150
0
240
Other Decks in Programming
See All in Programming
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
220
ChromeでローカルLLM
ryu1013
0
140
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.7k
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.3k
ActionController meets Protocol Buffers
sorah
0
560
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
440
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
170
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
sbt 2.0: takeoff
eed3si9n
0
160
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
710
Amusing Abliteration
ianozsvald
1
350
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
530
The untapped power of vector embeddings
frankvandijk
2
1.9k
Music & Morning Musume
bryan
48
7.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
870
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
430
Transcript
Terraformディレクトリ構成 のベスプラを考えてみた 2021.07.08 ⼭下 達也 1
⾃⼰紹介 ⼭下 達也 - Work at - 技術開発本部 / 技術開発第⼆部⾨
- エンジニア - Skill - AWS / Ruby(Ruby on Rails) / Terraform - SNS - Github︓https://github.com/tatsuya4150 - Qiita︓https://qiita.com/tatsuya4150 - Certificate 2
01 今回話すこと
Terraformでこんな経験ありませんか︖ - Terraformを仕事で使おうと思ったけど、 - 運⽤しやすく、引き継ぎやすいディレクトリの分割(構造化) - はどのように設計するのが良いのだろう︖︖ 4 01 今回話すこと
今回話すこと - Terraformでは、どのように構造化すれば運⽤しやすくなるのかを話します。 5 01 今回話すこと
今回話すこと - Terraformでは、どのように構造化すれば運⽤しやすくなるのかを話します。 - (注意)今回話すのはあくまで⼀例なので、インフラがデカくなれば違う管理をした ⽅が良いかもしれません。 6 01 今回話すこと
02 最初にやること
モノリスな状態からの脱却 8 02 最初にやること 作り始めは、単⼀ファイルで書いちゃうが、 どこに何が書いてあるのかわからなくなる…. ./ └── main.tf
モノリスな状態からの脱却 9 02 最初にやること 作り始めは、単⼀ファイルで書いちゃうが、 どこに何が書いてあるのかわからなくなる…. ./ └── main.tf
モノリスな状態からの脱却 10 02 最初にやること 作り始めは、単⼀ファイルで書いちゃうが、 どこに何が書いてあるのかわからなくなる…. ./ └── main.tf ./
├── main.tf ├── outputs.tf ├── providers.tf └── variables.tf
モノリスな状態からの脱却 11 さらにリソース別で分けておく ./ ├── main.tf ├── outputs.tf ├── providers.tf
└── variables.tf 02 最初にやること
モノリスな状態からの脱却 12 さらにリソース別で分けておく ./ ├── main.tf ├── outputs.tf ├── providers.tf
└── variables.tf 02 最初にやること
モノリスな状態からの脱却 13 さらにリソース別で分けておく ./ ├── main.tf ├── outputs.tf ├── providers.tf
└── variables.tf 02 最初にやること
モノリスな状態からの脱却 14 さらにリソース別で分けておく ./ ├── main.tf ├── outputs.tf ├── providers.tf
└── variables.tf ./ ├── aws_ec2.tf ├── aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf 02 最初にやること
03 構造化のポイント
構造化のポイント モジュール毎の分割 Point 3 コンポーネント毎の分割 16 Point 1 03 構造化のポイント
Point 2 環境毎の分割
04 構造化 その1 モジュール毎の分割
モジュール毎の分割 18 04 構造化その1 モジュール毎の分割 • ワンセットで複数のリソースを作成する場合はモジュール化が有効
モジュール毎の分割 19 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──
aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf
モジュール毎の分割 20 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──
aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf
モジュール毎の分割 21 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──
aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf
モジュール毎の分割 22 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──
aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf ./ ├── aws_ec2.tf ├── … ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
モジュール毎の分割 23 04 構造化その1 モジュール毎の分割 さらに残りのファイルもモジュール化 ./ ├── aws_ec2.tf ├──
… ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
モジュール毎の分割 24 04 構造化その1 モジュール毎の分割 さらに残りのファイルもモジュール化 ./ ├── aws_ec2.tf ├──
… ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
モジュール毎の分割 25 04 構造化その1 モジュール毎の分割 さらに残りのファイルもモジュール化 ./ ├── main.tf ├──
modules │ ├── ec2 │ │ └── aws_ec2.tf │ │ └── variables.tf │ ├── iam_role │ │ └── aws_iam_role.tf │ │ └── variables.tf │ ├── rds │ │ └── aws_rds.tf │ │ └── variables.tf │ ├── security_group │ │ └── aws_security_group.tf │ │ └── variables.tf │ └── vpc │ └── … │ └── variables.tf ├── outputs.tf └── providers.tf ./ ├── aws_ec2.tf ├── … ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
モジュール毎の分割 26 04 構造化その1 モジュール毎の分割 • モジュールは下記を意識して設計する
モジュール毎の分割 27 04 構造化その1 モジュール毎の分割 • モジュールは下記を意識して設計する - 疎結合︓他のモジュールに依存しないようにまとめる
モジュール毎の分割 28 04 構造化その1 モジュール毎の分割 • モジュールは下記を意識して設計する - 疎結合︓他のモジュールに依存しないようにまとめる -
⾼凝集︓同じタイミング、同じ理由で変更するリソースをまとめる
モジュール毎の分割 29 04 構造化その1 モジュール毎の分割 • モジュールは下記を意識して設計する - 疎結合︓他のモジュールに依存しないようにまとめる -
⾼凝集︓同じタイミング、同じ理由で変更するリソースをまとめる - 認知的負荷︓モジュールの⼊⼒値から必須項⽬を減らして、オプション項 ⽬を増やす
モジュール毎の分割 30 04 構造化その1 モジュール毎の分割 • とはいえ、モジュール分割は結構難しい… • Terraform Registryを参考にすると良いかも!
https://registry.terraform.io/
05 構造化 その2 環境毎の分割
環境毎の分割 32 05 構造化その2 環境毎の分割 • ⼀般的には本番環境、検証環境、開発環境など複数の環境が⽤意される
環境毎の分割 33 05 構造化その2 環境毎の分割 • ⼀般的には本番環境、検証環境、開発環境など複数の環境が⽤意される • 本番は「t3.large」、検証・開発環境は「t3.medium」で構築とかがあり得る
環境毎の分割 34 05 構造化その2 環境毎の分割 • ⼀般的には本番環境、検証環境、開発環境など複数の環境が⽤意される • 本番は「t3.large」、検証・開発環境は「t3.medium」で構築とかがあり得る •
環境毎に分けないと、⼀つの環境の変更が、他の環境に影響しちゃう…
環境毎の分割 35 05 構造化その2 環境毎の分割 • ⼀般的には本番環境、検証環境、開発環境など複数の環境が⽤意される • 本番は「t3.large」、検証・開発環境は「t3.medium」で構築とかがあり得る •
環境毎に分けないと、⼀つの環境の変更が、他の環境に影響しちゃう… • だから、環境毎の分割が必要。
環境毎の分割 36 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├──
modules │ └── … ├── outputs.tf └── providers.tf
環境毎の分割 37 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├──
modules │ └── … ├── outputs.tf └── providers.tf
環境毎の分割 38 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├──
modules │ └── … ├── outputs.tf └── providers.tf
./ ├── environments │ ├── development │ │ ├── main.tf
│ │ ├── outputs.tf │ │ └── providers.tf │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── staging │ ├── main.tf │ ├── outputs.tf │ └── providers.tf └── modules └── … 環境毎の分割 39 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├── modules │ └── … ├── outputs.tf └── providers.tf
./ ├── environments │ ├── development │ │ ├── main.tf
│ │ ├── outputs.tf │ │ └── providers.tf │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── staging │ ├── main.tf │ ├── outputs.tf │ └── providers.tf └── modules └── … 環境毎の分割 40 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├── modules │ └── … ├── outputs.tf └── providers.tf
06 構造化 その3 コンポーネント毎の分割
コンポーネント毎の分割 42 06 構造化その3 コンポーネント毎の分割 • 環境毎に分離した際に、⼀つの環境につき⼀つのtfstateファイルを⽤意することに なる
コンポーネント毎の分割 43 06 構造化その3 コンポーネント毎の分割 • 環境毎に分離した際に、⼀つの環境につき⼀つのtfstateファイルを⽤意することに なる • 何かしらミスをしたときにその環境全体に影響を与えてしまう
コンポーネント毎の分割 44 06 構造化その3 コンポーネント毎の分割 • 環境毎に分離した際に、⼀つの環境につき⼀つのtfstateファイルを⽤意することに なる • 何かしらミスをしたときにその環境全体に影響を与えてしまう
• そのため、環境をさらにコンポーネントに分割していく
コンポーネント毎の分割 45 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │
├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
コンポーネント毎の分割 46 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │
├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
コンポーネント毎の分割 47 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │
├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
./ ├── environments │ ├── production │ │ ├── vpc
│ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── app │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── mysql │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ └── providers.tf │ └── … └── modules └── … コンポーネント毎の分割 48 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
./ ├── environments │ ├── production │ │ ├── vpc
│ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── app │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── mysql │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ └── providers.tf │ └── … └── modules └── … コンポーネント毎の分割 49 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
コンポーネント毎の分割 50 06 構造化その3 コンポーネント毎の分割 • 分割するポイント
コンポーネント毎の分割 51 06 構造化その3 コンポーネント毎の分割 • 分割するポイント • 関⼼毎によって境界線を決める。
コンポーネント毎の分割 52 06 構造化その3 コンポーネント毎の分割 • 分割するポイント • 関⼼毎によって境界線を決める。 •
例えば,,, ・安定度 ・ステートフル ・影響範囲 ・組織のライフサイクル etc…
コンポーネント毎の分割 53 06 構造化その3 コンポーネント毎の分割 • 注意点
コンポーネント毎の分割 54 06 構造化その3 コンポーネント毎の分割 • 注意点 • 各コンポーネントの依存関係を⼀⽅向にしておく
コンポーネント毎の分割 55 06 構造化その3 コンポーネント毎の分割 • 注意点 • 各コンポーネントの依存関係を⼀⽅向にしておく •
そうしないと、循環参照の状態になり、環境が壊れてしまう可能性がある
コンポーネント毎の分割 56 06 構造化その3 コンポーネント毎の分割 • 注意点 • 各コンポーネントの依存関係を⼀⽅向にしておく •
そうしないと、循環参照の状態になり、環境が壊れてしまう可能性がある • 循環参照が起こっているかの確認は、依存グラフの出⼒コマンドがある ・`terraform graph -draw-cycles | dot -Tpng > graph.png`
コンポーネント毎の分割 57 06 構造化その3 コンポーネント毎の分割 • 注意点 • 各コンポーネントの依存関係を⼀⽅向にしておく •
そうしないと、循環参照の状態になり、環境が壊れてしまう可能性がある • 循環参照が起こっているかの確認は、依存グラフの出⼒コマンドがある ・`terraform graph -draw-cycles | dot -Tpng > graph.png`
コンポーネント毎の分割 58 06 構造化その3 コンポーネント毎の分割 terragruntというツールを使えば、terragrunt.hclというファイルでコンポーネントの 依存関係管理や、コンポーネント毎の共通部分を⼀つにまとめれるようになる。 https://terragrunt.gruntwork.io/
07 まとめ
まとめ 60 07 まとめ • 単⼀ファイルからリソース以外分ける
まとめ 61 07 まとめ • 単⼀ファイルからリソース以外分ける • リソース毎にファイルを分ける
まとめ 62 07 まとめ • 単⼀ファイルからリソース以外分ける • リソース毎にファイルを分ける • 構造化していく
- 1. モジュールへの分割 - 2. 環境毎への分割 - 3. コンポーネント毎への分割
まとめ 63 07 まとめ • 単⼀ファイルからリソース以外分ける • リソース毎にファイルを分ける • 構造化していく
- 1. モジュールへの分割 - 2. 環境毎への分割 - 3. コンポーネント毎への分割 • 3つのポイントがあるが、絶対ではない。
まとめ 64 07 まとめ • 単⼀ファイルからリソース以外分ける • リソース毎にファイルを分ける • 構造化していく
- 1. モジュールへの分割 - 2. 環境毎への分割 - 3. コンポーネント毎への分割 • 3つのポイントがあるが、絶対ではない。 • 結局は「関⼼毎による分離」を意識すれば問題ない︕
08 最後に
最後に 66 08 最後に 神本! 今日の内容もこちらを大いに参考にさせてもらいました! ぜひ皆さん、購入してみてください! https://www.amazon.co.jp/dp/4844378139/ref=cm_sw_em_r_mt_dp_9AV0EW402PVYZ3F4VTMY
ご清聴いただきありがとうございました Thank You We are Hiring ! https://recruit.fusic.co.jp/