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
98
Top Engineersの選出理由となっていそうな事例のお話
tatsuya4150
0
230
SI視点でのStripe使いこなし術
tatsuya4150
0
240
Other Decks in Programming
See All in Programming
スマート反転とウェブアクセシビリティ
camiha
0
180
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
650
What We Talk About When We Talk About XP
m_seki
2
490
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
120
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
600
Heart of Swift Concurrency
koher
0
230
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
120
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
470
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
310
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
Docker and Python
trallard
47
4.2k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Visualization
eitanlees
152
17k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
Technical Leadership for Architectural Decision Making
baasie
3
560
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
520
The World Runs on Bad Software
bkeepers
PRO
72
12k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
How to Ace a Technical Interview
jacobian
281
24k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
690
ラッコキーワード サービス紹介資料
rakko
1
4.8M
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/