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
4.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
540
未経験エンジニアがアウトプット駆動で自らのキャリアと生きる道を切り開くまで
harukasakihara
9
3.7k
AWS CDKで作るCloudWatch Dashboard
harukasakihara
3
1.8k
セキュアなTerraformの使い方 ~ 機密情報をコードに含めず環境構築するにはどうしたらいいの?
harukasakihara
19
5.9k
AssumePolicyの意外なハマりどころ
harukasakihara
1
1.5k
Other Decks in Technology
See All in Technology
Postman v10リリース後を振り返る / Looking back at Postman v10 after release
yokawasa
1
160
サーバー間 GraphQL と webmock-graphql の話 / server-to-server graphql and webmock-graphql
qsona
2
190
LLM開発・活用の舞台裏@2024.04.25
yushin_n
1
340
KubeCon EU 2024 Recap “Kubernetes Policy Time Machine: Where to Next?”
ryysud
0
220
生産性向上チームの紹介
cybozuinsideout
PRO
1
870
Azureの基本的な権限管理の勉強会
yhana
0
590
エンジニアのキャリアをちょっと楽しくする3本の軸/Three Pillars to Make an Engineer's Career More Enjoyable
kwappa
0
2.7k
MLOpsの「壁」を乗り越える、LINEヤフーの Data Quality as Code
lycorptech_jp
PRO
5
530
いつか使うかも貯金してたらめちゃめちゃ機能が増えてた話
riyaamemiya
0
290
Compose Compiler Metricsを使った実践的なコードレビュー
tomorrowkey
1
220
AOAI をきっかけに 社内の Azure 管理を見直した話
recruitengineers
PRO
1
300
Além do else! Categorizando Pokemóns com Pattern Matching no JavaScript
wmsbill
0
640
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
456
32k
The Cult of Friendly URLs
andyhume
74
5.7k
In The Pink: A Labor of Love
frogandcode
138
21k
How to train your dragon (web standard)
notwaldorf
73
5.2k
The World Runs on Bad Software
bkeepers
PRO
61
6.7k
How GitHub (no longer) Works
holman
304
140k
Raft: Consensus for Rubyists
vanstee
132
6.3k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
104
6.6k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
78
43k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
125
32k
Music & Morning Musume
bryan
41
5.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
274
13k
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(崎原 晴香)