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/Terragruntで実現する Feature Flag
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
fernr
January 27, 2026
Technology
34
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Terraform/Terragruntで実現する Feature Flag
CloudNative Days Summer 2025 LTにて発表させて頂いた資料です。
fernr
January 27, 2026
Other Decks in Technology
See All in Technology
How to Design Configuration for Rails Applications
willnet
1
820
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
130
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
460
Optunaの最新リリースv5.0について
pfn
PRO
0
120
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
170
AI導入は済んだ。次は統制を作り替える番だ_AI×開発組織 Summit 2026
techtekt
PRO
0
290
QA4AI 2026-Oct 生成AI時代の品質保証
tokuty
1
880
サブエージェントと Claude Mods で作る独自 Advisor ツールの話
kenichiodo
2
160
hackers_champloo_2026_tidb
makocchi
0
170
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
300
re:Invent初参加で変わったこと、2回目にやってみたいこと(JAWS-UG彩の国埼玉 #12)
mhrtech
2
230
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Technical Leadership for Architectural Decision Making
baasie
3
600
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
Become a Pro
speakerdeck
PRO
31
6.3k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
520
Leo the Paperboy
mayatellez
10
2.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The Cost Of JavaScript in 2023
addyosmani
55
10k
WCS-LA-2024
lcolladotor
0
890
We Have a Design System, Now What?
morganepeng
55
8.4k
Transcript
Terraform/Terragruntで実現する Feature Flag DATUM STUDIO株式会社 志田 遼太郎 2025年5月23日 @CloudNative Days
Summer 2025
2 whoami DATUM STUDIO株式会社 データエンジニア 志田 遼太郎 普段は受託開発でデータ分析基盤を作ってます
Terraformとは
Terraformとは 様々なクラウドインフラを管理可能なIaCツール https://developer.hashicorp.com/terraform/intro
5 Terraformとは IaC(Infrastructure as Code) • インフラ構成をコードで記述し、リリースする手法 • インフラリリース作業者/確認者は手作業でのインフ ラ構築から解放され、様々なメリットを享受できる
✓ 作業上のヒューマンエラーの軽減 ✓ 作業スピードの向上 ✓ 保守性の向上 クラウド、およびオンプレミスのリソースを、人間が読める構成ファイルで定義可能なIaCツール。 EC2での例 resource "aws_instance" ”this" { ami = "ami-123456" instance_type = "t3.micro" }
6 Terraformとは IaC(Infrastructure as Code) • インフラ構成をコードで記述し、リリースする手法 • インフラリリース作業者/確認者は手作業でのインフ ラ構築から解放され、様々なメリットを享受できる
✓ 作業上のヒューマンエラーの軽減 ✓ 作業スピードの向上 ✓ 保守性の向上 クラウド、およびオンプレミスのリソースを、人間が読める構成ファイルで定義可能なIaCツール。 EC2での例 resource "aws_instance" ”this" { ami = "ami-123456" instance_type = "t3.micro" } うれしい
Terragruntとは
Terragruntとは Terraformを拡張するオーケストレーションツール https://terragrunt.gruntwork.io/
9 Terragruntとは 依存関係を考慮した複数モジュールの一括実行 terraformを記述する上での重複コードの低減、モジュール間依存関係の管理、複数モジュールの一括実行 など、Terraform(および、OpenTofu)を拡張するツール GitHub Actions network 1 database
1 server 1 storage 1 Terraform Terragrunt network 2 database 2 server 2 terraform GitHub Actions network 1 database 1 server 1 storage 1 network 2 database 2 server 2 terragrunt → CI/CDで定義 → terragruntで定義 stack 1 stack 2 stack 3
10 Terragruntとは 依存関係を考慮した複数モジュールの一括実行 terraformを記述する上での重複コードの低減、モジュール間依存関係の管理、複数モジュールの一括実行 など、Terraform(および、OpenTofu)を拡張するツール GitHub Actions network 1 database
1 server 1 storage 1 Terraform Terragrunt network 2 database 2 server 2 terraform GitHub Actions network 1 database 1 server 1 storage 1 network 2 database 2 server 2 terragrunt → CI/CDで定義 → terragruntで定義 stack 1 stack 2 stack 3 結構 うれしい
Feature Flagとは
Feature Flagとは コードの変更なしでシステムの動作を変更できる手法 https://martinfowler.com/articles/feature-toggles.html
13 Feature Flag (Feature Toggle) とは 主な用途 • カナリアリリース •
A/Bテスト • など… メリット • 実装の仕方によってはコードの変更なしで機能の切 り替えが可能 • CI/CDパイプライン側を変えなくて良い • 障害対応や切り戻しの観点で、取り扱いがしやすい コードの中で特定の機能を(動的に)有効化・無効化できる手法 var enable_new_function = false # これを動的に変更できる仕組みがあると嬉しい if( enable_new_function ){ return new_function(); } else { return old_function(); } 極限まで簡単にした例
14 Feature Flag (Feature Toggle) とは 主な用途 • カナリアリリース •
A/Bテスト • など… メリット • 実装の仕方によってはコードの変更なしで機能の切 り替えが可能 • CI/CDパイプライン側を変えなくて良い • 障害対応や切り戻しの観点で、取り扱いがしやすい コードの中で特定の機能を(動的に)有効化・無効化できる手法 var enable_new_function = false # これを動的に変更できる仕組みがあると嬉しい if( enable_new_function ){ return new_function(); } else { return old_function(); } 極限まで簡単にした例 うれしい
Feature Flagは ソフトウェア開発の文脈で提唱され発展したが・・・
Feature Flagは ソフトウェア開発の文脈で提唱され発展したが・・・ IaCの普及により、インフラにもFeature Flagの概念 が適用できるのでは?
17 モチベーション インフラ機能追加の際 に、dev→stg→prdのよ うに、段階的に適用した い 設定変更時、何かあっ たらすぐに切り戻しをした い モジュール自体を個別
にバージョン管理し、利 用時にバージョンを動的 に指定したい 環境ごとの差分設定を コピペ少なめで簡単に 管理したい 追加機能ごとにprd適 用タイミングをずらしたい
実装
19 [パラメータレベル] 変数 + 三項演算子を利用したFeature Flag terraformは宣言型の言語なため、通常のプログラミング言語のように複雑な条件分岐はできないが、三項 演算子と呼ばれる記述で特定の変数の値に応じてセットするパラメータを変えることが可能 resource "aws_instance"
”this" { ami = "ami-123456" instance_type = var.env == “prd”? "t3.2xlarge”: “t3.micro” } ✓ リリース対象環境を示す変数 (var.env)の値に応じて instance_typeを変更することができる Terraform 別のリソースの値によっ て特定のパラメータの設 定値を変えたい・・・
20 [リソースレベル] countを利用したFeature Flag 補足情報 • terraformは環境変数 (TF_VAR_flag_enable_ec2)を設定する ことで変数を与えられる terraformではcountという、設定することで同一リソースを指定数分繰り返し構築するパラメータがあり、こ
れを利用することでFeature Flagとして機能する variable “flag_enable_ec2” { type = bool } resource "aws_instance" ”this" { count = var.flag_enable_ec2 == true ? 1 : 0 ami = "ami-123456" instance_type = "t3.2xlarge” } ✓ countパラメータはリソースをいくつ作成する かを制御でき、0が指定された場合はリソース を作成しない、という挙動をとる Terraform 環境変数を管理できるCI/CDツールであれば、コードを 変更することなくリリース対象リソースの制御が可能 環境や状況に応じて特 定リソースのリリース有 無を制御したい
21 [リソースレベル] for_eachを利用したFeature Flag 補足情報 • csvやyamlからbucket_mapを生成する組み込 み関数が用意されており、人間に理解しやすい構 成を取ることが可能 terraformではfor_eachという、一部パラメータのみが異なる同一リソースを簡易に管理する機能があり、
パラメータ生成時にif文が使えるためこれを利用することでFeature Flagとして機能する resource "aws_s3_bucket" ”this" { for_each = { for item in var.bucket_map : item[“name”] => item if item[“env”] == var.env } bucket = each.value[“name”] } prd環境ではsample1, sample2というバケットが、 dev環境ではsample3というS3バケットが作られる Terraform 環境間差分を人間に理解しやすい形で管理でき、 コード本体の修正が不要 bucket_map = [ {“env” = “prd”, “name” = “sample1”}, {“env” = “prd”, “name” = “sample2”}, {“env” = “dev”, “name” = “sample3”}, ] 環境ごとのリソース差分 をコピペ少なめで簡単に 管理したい・・・
22 [オーケストレーションレベル] featureブロックを利用したFeature Flag 補足情報 • 環境変数TG_FEATUREを設定することで外部か ら変数を与えられる terragruntの設定ファイルのレベルでFeature Flagを利用できる
Terragrunt 環境変数を管理できるCI/CDツールであれば、コードを 変更することなくリリース対象リソースの制御が可能 terragruntを使ってもっ と柔軟にterraformを制 御したい・・・ featureブロック • terragruntはterraformの外での処理が可能 • 例えば、terraform実行前にシェルでコマンドを実行できる(before_hook) • これらのterragrunt独自機能に対するFeature Flagとして、featureブロックが用意されている ※コードは初見での分かりにくさと時間の都合で省略します
23 [モジュールレベル] excludeブロックを利用したFeature Flag terragruntで定義するstackから、特定モジュールを一時的に外すことが可能 Terragrunt featureブランチで開発 を進めるから、一時的に CI/CDでterraformを実 行したくない・・・
excludeブロック • terragruntが定義するstackから、特定の条件の場合に特定のモジュールを除外する • 「特定の条件」を、featureブロックで記述可能 => 環境変数でstackからの除外を制御可能 • 特にCI/CDパイプラインにおいて効果を発揮し、リリースフローを担保しつつ柔軟な制御が可能(うれしい) ※コードは初見での分かりにくさと時間の都合で省略します network database server monitoring ✓ enable_monitoringフラグがtrueであればstackの要 素であるとみなされ、plan/applyが実行される ✓ フラグがfalseであればterraform実行対象にならない
結び
25 結び • クラウドインフラはIaC + CI/CDパイプラインで管理しよう! • インフラ管理がコード化することにより、ソフトウェア開発で主に扱われてきた概念や手法を取り入れることが可能 • 扱う基盤やサービスレベルによっても状況は異なるはず
ぼくのかんがえたさいきょうのデプロイ・リリースフローを作ろう!!
Appendix
27 [パラメータレベル] 変数 + 三項演算子を利用したFeature Flag こんな時に・・ • 環境によって特定のリソースの特定のパラメータの設 定値を変えたい(※)
• リソース定義の際の例外的な処理 • optionalなパラメータを、別の特定の値に応じて設 定する/しないを分岐するなど 補足情報 • 基本的なterraformの思想として、こういった環境 間差分のあるパラメータは外部から与える形にした ほうが良い(モジュールを関数と見立てた時、関数 に対する引数のイメージ) terraformは宣言型の言語なため、通常のプログラミング言語のように複雑な条件分岐はできないが、三項 演算子と呼ばれる記述で特定の変数の値に応じてセットするパラメータを変えることが可能 resource "aws_instance" ”this" { ami = "ami-123456" instance_type = var.env == “prd” ? "t3.2xlarge” : “t3.micro” } ✓ リリース対象環境を示す変数 (var.env)の値に応じて instance_typeを変更することができる Terraform
28 [リソースレベル] countを利用したFeature Flag こんな時に・・ • 環境や状況に応じて特定リソースのリリース有無を 制御したい 補足情報 •
terraformはモジュール呼び出し時の記述で変数 を与えることができるほか、環境変数(例だと TF_VAR_flag_enable_ec2)を設定するこ とで変数をセットできる terraformではcountという、設定することで同一リソースを指定数分繰り返し構築するパラメータがあり、こ れを利用することでFeature Flagとして機能する variable “flag_enable_ec2” { type = bool } resource "aws_instance" ”this" { count = var.flag_enable_ec2 == true ? 1 : 0 ami = "ami-123456" instance_type = "t3.2xlarge” } ✓ countパラメータはリソースをいくつ作成する かを制御でき、0が指定された場合はリソース を作成しない、という挙動をとる Terraform 環境変数を管理できるCI/CDツールであれば、コードを 変更することなくリリース対象リソースの制御が可能
29 [リソースレベル] for_eachを利用したFeature Flag こんな時に・・ • 環境ごとの差分設定をコピペ少なめで簡単に管理 したい 補足情報 •
csvやyamlからbucket_mapを生成する組み込 み関数が用意されており、人間に理解しやすい構 成を取ることが可能 terraformではfor_eachという、一部パラメータのみが異なる同一リソースを簡易に管理する機能があり、 パラメータ生成時にif文が使えるためこれを利用することでFeature Flagとして機能する resource "aws_s3_bucket" ”this" { for_each = { for item in var.bucket_map : item[“name”] => item if item[“env”] == var.env } bucket = each.value[“name”] } prd環境ではsample1, sample2というバケットが、 dev環境ではsample3というS3バケットが作られる Terraform 環境間差分を人間に理解しやすい形で管理でき、 コード本体の修正が不要 bucket_map = [ {“env” = “prd”, “name” = “sample1”}, {“env” = “prd”, “name” = “sample2”}, {“env” = “dev”, “name” = “sample3”}, ]
30 [オーケストレーションレベル] featureを利用したFeature Flag 補足情報 • terragruntはtf実行前にコマンドを実行できる • 環境変数TG_FEATUREを設定することで外部 から変数を与えられる
terragruntの設定ファイルのレベルでFeature Flagを利用できる feature "run_hook" { default = false } feature ”in" { default = false } terraform { before_hook "feature_flag" { commands = ["apply", "plan", "destroy"] execute = feature.run_hook.value ? <feature.inを書き換え るculrコマンドとか・・> : [“exit 0”] } } inputs = { tf_var = feature.in.value Terragrunt 環境変数を管理できるCI/CDツールであれば、コードを 変更することなくリリース対象リソースの制御が可能 terragruntを使ってもっ と柔軟にterraformを制 御したい・・・