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
ベストな Terraform ディレクトリ構成を考察してみた
Search
Haruka Sakihara
August 25, 2022
Technology
16
5.8k
ベストな Terraform ディレクトリ構成を考察してみた
22/8/25 HashiTalks:Japanにて発表
Haruka Sakihara
August 25, 2022
Tweet
Share
More Decks by Haruka Sakihara
See All by Haruka Sakihara
意外と難しい?エンジンアップグレードとIaCの両立
harukasakihara
4
630
未経験エンジニアがアウトプット駆動で自らのキャリアと生きる道を切り開くまで
harukasakihara
9
4.4k
AWS CDKで作るCloudWatch Dashboard
harukasakihara
4
2.2k
セキュアなTerraformの使い方 ~ 機密情報をコードに含めず環境構築するにはどうしたらいいの?
harukasakihara
21
7.5k
AssumePolicyの意外なハマりどころ
harukasakihara
1
1.7k
Other Decks in Technology
See All in Technology
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
990
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
530
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
300k
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
250
マルチモーダル / AI Agent / LLMOps 3つの技術トレンドで理解するLLMの今後の展望
hirosatogamo
37
12k
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
スクラム成熟度セルフチェックツールを作って得た学びとその活用法
coincheck_recruit
1
140
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
1
190
OCI Security サービス 概要
oracle4engineer
PRO
0
6.5k
OCI Network Firewall 概要
oracle4engineer
PRO
0
4.1k
Making your applications cross-environment - OSCG 2024 NA
salaboy
0
190
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
470
Featured
See All Featured
Six Lessons from altMBA
skipperchong
27
3.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Docker and Python
trallard
40
3.1k
Side Projects
sachag
452
42k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Ruby is Unlike a Banana
tanoku
97
11k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Transcript
ベストなTerraformディレクトリ構成を 考察してみた Thursday, August 25, 2022 Haruka Sakihara
自己紹介 Haruka Sakihara • アクセンチュア株式会社 テクノロジーコンサルティング本部所属 • 普段はクラウドインフラ構築の支援をしております • アプリケーション……プライベートだとGo,
仕事だ と少しPython • インフラ……ほとんどAWS Twitter:@saki_engineer GitHub: @saki-engineering
Terraformのディレクトリ構成、 迷いませんか?
Terraformコードのディレクトリ構成パターン Terraformのディレクトリ構成は様々なパターンが考えられますが、ここでは以下2パターンについ て考察していきたいと思います。 パターン1のディレクトリ構成 パターン2のディレクトリ構成 stg、prdのような環境ごとに ディレクトリを分ける構成 DB, EC2インスタンスのような リソースごとにディレクトリを分ける構成
パターン1: 環境ごとにディレクトリを分ける構成 ある環境を表すIaCコードを1カ所(envs/xxx)にまとめる方式です。複数環境から利用されるコードは モジュール化してmodules配下に配置することもあります。 modules配下 複数環境から使われる 共通モジュールを配置 envs配下 各環境内で必要な リソース定義を記述
(共通モジュール呼び出しもあり) envs/stg直下 module “db” { source = “../../modules/db” } module “ec2” { source = “../../modules/ec2” } module “network” { source = “../../modules/network” }
パターン2: リソースごとにディレクトリを分ける構成 一方こちらはまずリソースごとに最上位ディレクトリを切り、その中に各環境ごとのリソース定義を 記述する方式です。 db配下 各環境ごとのDB設定を記述 ec2/stg直下 resource “aws_instance“ “my_server”
{ // stg用の設定 } network/stg直下 resource “aws_vpc“ “my_vpc” { // stg用の設定 } db/stg直下 resource “aws_db_instance“ “my_db” { // stg用の設定 } ec2配下 各環境ごとのインスタンス設定を記述 network配下 各環境ごとのネットワーク設定を記述
ディレクトリ構成の比較 本セッションでは、「環境ごとにディレクトリを切るパターン」「リソースごとにディレクトリを切 るパターン」それぞれを3つの観点から比較していきます。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの
大きさ 同時作業 可能数 環境ごとに ディレクトリを切る リソースごとに ディレクトリを切る
ディレクトリ構成の比較 本セッションでは、「環境ごとにディレクトリを切るパターン」「リソースごとにディレクトリを切 るパターン」それぞれを3つの観点から比較していきます。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの
大きさ 同時作業 可能数 環境ごとに ディレクトリを切る リソースごとに ディレクトリを切る
apply回数での比較 パターン1構成の場合、stg環境構築の際に必要なterraform applyの回数は1回で済みます。 一方パターン2構成の場合、stg環境関連リソースのコードを含んだディレクトリの数だけterraform applyが必要です。 パターン1のディレクトリ構成 パターン2のディレクトリ構成 stg環境構築のためには、 envs/stg直下での terraform
apply 1回で済む これら3つすべてで terraform applyを実行 する必要がある (ただし、スクリプトや OSS(Atlantis)を導入することで まとめてapplyも実現可能)
ディレクトリ構成の比較 パターン1の構成だとapplyは1度で済みます。パターン2では複数回のapplyが必要ですが、それをカ バーするスクリプトやOSSを活用することでデメリットをカバーすることができます。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの
大きさ 同時作業 可能数 環境ごとに ディレクトリを切る 1回で済む リソースごとに ディレクトリを切る 複数回必要 (スクリプトや Atlantis使用なら 1回で済む) 〇 △
ディレクトリ構成の比較 次に、「生成されるstateファイル」という観点で比較していきます。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの 大きさ
同時作業 可能数 環境ごとに ディレクトリを切る 1回で済む リソースごとに ディレクトリを切る 複数回必要 (スクリプトや Atlantis使用なら 1回で済む) 〇 △
tfstateファイルの比較 実際にリソース作成が行われて実環境の構成が変化した際には、Terraformはその変更内容をtfstate ファイル中に書き込み反映させる作業を行います。 AWS Cloud Availability Zone a Availability Zone
b tfstateファイル • AZ-aにEC2インスタンスが2→3個 • AZ-bにEC2インスタンスが2個 .tfファイル • AZ-aにEC2インスタンスが3個 • AZ-bにEC2インスタンスが2個 1. terraform applyの実行 3. リソース作成 2. 差分の検知 4. リソース作成 結果の反映 同内容
tfstateファイルの比較 applyコマンドを実行するディレクトリというのは、tfstateファイルが管理するコード範囲とイコー ルになります。そのため、ディレクトリを細かく区切るということはtfstateファイルを区切るとい うことと同一であり、planやapplyの速度に影響を及ぼします。 stg環境用の tfstateファイルができ る stg環境にあるDB用の tfstateファイルができ る
stg環境にあるインスタンス 用の tfstateファイルができる stg環境にあるNW用の tfstateファイルができ る パターン1のディレクトリ構成 パターン2のディレクトリ構成
tfstateファイルの比較 applyコマンドを実行するディレクトリというのは、tfstateファイルが管理するコード範囲とイコー ルになります。そのため、ディレクトリを細かく区切るということはtfstateファイルを区切るとい うことと同一であり、planやapplyの速度に影響を及ぼします。 stg環境用の tfstateファイルができ る stg環境にあるDB用の tfstateファイルができ る
stg環境にあるインスタンス 用の tfstateファイルができる stg環境にあるNW用の tfstateファイルができ る DBのみの変更の場合でも、 他リソース情報を含んだ このtfstateファイルを扱う必要がある DBのみの変更の場合は、 このtfstateのみ扱えばよい パターン1のディレクトリ構成 パターン2のディレクトリ構成
ディレクトリ構成の比較 パターン1の構成よりもパターン2の構成のほうが、tfstateファイルを細かく区切ることができるた め、plan/applyの高速化が見込めます。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの
大きさ 同時作業 可能数 環境ごとに ディレクトリを切る 1回で済む 大きくなるため plan/apply速度が 落ちる リソースごとに ディレクトリを切る 複数回必要 (スクリプトや Atlantis使用なら 1回で済む) 小さく済むため plan/apply速度も速い 〇 × △ 〇
ディレクトリ構成の比較まとめ 最後に、「複数人の開発者がいるチームでTerraformのコードを扱う際に、同時作業がどれだけ可能 になるか」という観点で比較していきます。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの
大きさ 同時作業 可能数 環境ごとに ディレクトリを切る 1回で済む 大きくなるため plan/apply速度が 落ちる リソースごとに ディレクトリを切る 複数回必要 (スクリプトや Atlantis使用なら 1回で済む) 小さく済むため plan/apply速度も速い 〇 × △ 〇
同時作業数の比較 – パターン1構成の場合 最上位ディレクトリを環境ごとに切る場合には、envs/stg直下とenvs/prd直下にそれぞれstateファ イルが生成されることになります。そのため、ある環境内にあるリソースの変更はすべて同時に plan/applyされることになります。 …stg用のstate …prd用のstate stateファイル構成 リソース変更の際に参照されるstateファイル
2つのリソース変更を吸収する 1つのstateが
同時作業数の比較 – パターン1構成の場合 リソースごとにディレクトリを切る場合には、各環境・各リソースごとにstateが生成されます。そ のため、異なるリソースの変更は異なるstateを用いてplan/applyが実行されます。 …db/stg用のstate …db/prd用のstate …ec2/prd用のstate …ec2/stg用のstate …network/prd用のstate
…network/stg用のstate dbの変更はこのstateが吸収 インスタンスの変更は このstateが吸収 stateファイル構成 リソース変更の際に参照されるstateファイル
同時作業数の比較 Terraformにおいて、あるコードが同じstateファイルに属しているというのは「plan/applyが同時 に行われる」というだけでなく、Lock機能によって並列作業可能なapply数が制限されるということ も意味します。 envs stg ……ステージング環境用の コードを格納 prd ……本番環境用の
コードを格納 stg環境用のstateファイルができる prd環境用のstateファイルができる 1つの同じstateファイルに属しているコードは…… • まとめてplan/applyが行われる • このコードに対して複数個同時に applyができないように、Lockがかかる
(余談)planの並行作業 Terraformで複数個のplanを同時並行して行うと、どれか一つのapplyが行われるとその他のplan結 果が正しくないものになるという問題があります。 AWS Cloud Terraformコード インスタンス1個 PR1 PR2 実環境
Terraformコード インスタンス3個 plan結果 インスタンス+1個 plan結果 インスタンス-1個 plan実行 plan実行 AWS Cloud apply実行 plan結果 インスタンス+1個 OutDated!
ディレクトリ構成の比較まとめ Tfstateファイルを細かく区切ることで、apply時にかかるロックの範囲をも細かく区切ることができ ます。結果、同時作業可能数がパターン2のほうが多くなることとなります。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの
大きさ 同時作業 可能数 環境ごとに ディレクトリを切る 1回で済む 大きくなるため plan/apply速度が 落ちる 同環境内では 別作業を同時に できない リソースごとに ディレクトリを切る 複数回必要 (スクリプトや Atlantis使用なら 1回で済む) 小さく済むため plan/apply速度も速い 同環境内でも リソースが別なら 同時に作業可能 〇 × × △ 〇 〇
ディレクトリ構成の比較まとめ 従来なら考えずらかったパターン2のディレクトリ構成も、複数人で使用するワークフロー構築・ Atlantisの使用前提で考えると十分メリットがある構成と言えると思います。 パターン2のディレクトリ構成 パターン1のディレクトリ構成 コンセプト apply 回数 tfstate ファイルの
大きさ 同時作業 可能数 環境ごとに ディレクトリを切る 1回で済む 大きくなるため plan/apply速度が 落ちる 同環境内では 別作業を同時に できない リソースごとに ディレクトリを切る 複数回必要 (スクリプトや Atlantis使用なら 1回で済む) 小さく済むため plan/apply速度も速い 同環境内でも リソースが別なら 同時に作業可能 〇 × × △ 〇 〇
Thank You ご意見、ご質問ありましたらお気軽にご連絡下さい
[email protected]
Haruka Sakihara(崎原 晴香)