Upgrade to Pro — share decks privately, control downloads, hide ads and more …

時間軸から考えるTerraformを使う理由と留意点

 時間軸から考えるTerraformを使う理由と留意点

Terraformではじめる実践IaC - Forkwell Library #105 https://forkwell.connpass.com/event/365048/
の登壇資料です。

Avatar for Ryoma Fujiwara

Ryoma Fujiwara

September 04, 2025
Tweet

More Decks by Ryoma Fujiwara

Other Decks in Programming

Transcript

  1. ©MNTSQ, Ltd. 2 自己紹介(概要版) 藤原 涼馬 (@RyoMa_0923) MNTSQ株式会社 SREチームマネージャー 兼

    セキュリティ推進室マネージャー 職歴 2011/4 2016/1 2021/5 2023/11 SIer 研究員 インフラSE インフラSE SRE 新卒エンジニア教育 SRE SRE 対外公開物 (寄稿・執筆など) 先行事例に学ぶKubernetes企業活用の現実(ITmedia) コンテナベースのCI/CD本番事例大解剖(ITmedia) マルチクラウド時代の最強コンビ RancherによるKubernetes活用 ガイド(ThinkIT) RancherによるKubernetes活用完全ガイド(共著, インプレス) Cloud Native Days Tokyo実行委員 Rancher JPコアメンバー SRENext 2022登壇 実践WAF (WEB+DB PRESS vol.123 特集3) STORES Tech Talk AWS Organization活用のリアル 主業 個人検証のアカウント、どんな感じでやってますか? (JAWS UG東京 ランチ共有会) Harvesterという選択肢(Rancher JP Online meetup #5) 現場で活きる! Datadog によるオブザーバビリティ  実践のリアル (Datadog Live Tokyo 2025) Terraformではじめる実践IaC(オライリー) 複業 インフラSE 技術リードそ のほか ほか色々
  2. ©MNTSQ, Ltd. 11 アプリケーション実装の管理 パブリッククラウド以前 コーディング ソースコード管理 CI/CD アプリケーションはソース コードを記述して実装する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする
  3. ©MNTSQ, Ltd. 12 アプリケーション実装の管理 パブリッククラウド以前 コーディング ソースコード管理 CI/CD アプリケーションはソース コードを記述して実装する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず...
  4. ©MNTSQ, Ltd. 13 アプリケーション実装の管理 パブリッククラウド以前 コーディング ソースコード管理 CI/CD アプリケーションはソース コードを記述して実装する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず... パブリッククラウド以前からアプリケーションの世界では、 かなりの範囲をソースコードベースで管理することが可能だった
  5. ©MNTSQ, Ltd. 14 アプリケーション実装の管理 パブリッククラウド以前 コーディング ソースコード管理 CI/CD アプリケーションはソース コードを記述して実装する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず... パブリッククラウド以前からアプリケーションの世界では、 かなりの範囲をソースコードベースで管理することが可能だった ITインフラストラクチャの管理は?
  6. ©MNTSQ, Ltd. 18 ITインフラストラクチャの管理 パブリッククラウド以前 構成管理 パラメータ管理 作業手順書 システムを構成するインフラス トラクチャの要素、用途を管理

    する 個別要素の設定内容を管理 構成要素の作業内容別に 作業手順書を作成 これを完全に否定するものではないが、課題は存在する
  7. ©MNTSQ, Ltd. 25 システム規模 vs ITインフラストラクチャの準備・管理コスト 旧来の方法論の課題(特に手順書) システム規模 準備・管理コスト システム規模

    準備・管理コスト システム規模 準備・管理コスト 約束された破滅 手順書ベース延長線の理想 本当の理想
  8. ©MNTSQ, Ltd. 26 システム規模 vs ITインフラストラクチャの準備・管理コスト 旧来の方法論の課題(特に手順書) システム規模 準備・管理コスト システム規模

    準備・管理コスト システム規模 準備・管理コスト 約束された破滅 手順書ベース延長線の理想 本当の理想 単純に古い方法をそのまま続けた場合はこちら
  9. ©MNTSQ, Ltd. 27 システム規模 vs ITインフラストラクチャの準備・管理コスト 旧来の方法論の課題(特に手順書) システム規模 準備・管理コスト システム規模

    準備・管理コスト システム規模 準備・管理コスト 約束された破滅 手順書ベース延長線の理想 本当の理想 できれば右側に寄せていきたい
  10. ©MNTSQ, Ltd. 28 システム規模 vs ITインフラストラクチャの準備・管理コスト 旧来の方法論の課題(特に手順書) システム規模 準備・管理コスト システム規模

    準備・管理コスト システム規模 準備・管理コスト 約束された破滅 手順書ベース延長線の理想 本当の理想 できれば右側に寄せていきたい なぜそれでもパブリッククラウド以前では成立したのか?
  11. ©MNTSQ, Ltd. 36 パブリッククラウド以後 Amazon Web Services Google Cloud Microsoft

    Azure Webブラウザから操作できるマネジメントコンソールを使った構築
  12. ©MNTSQ, Ltd. 37 パブリッククラウド以後 Amazon Web Services Google Cloud Microsoft

    Azure Webブラウザから操作できるマネジメントコンソールを使った構築 CSP提供のCLIツールを使った各種リソースの構築
  13. ©MNTSQ, Ltd. 38 パブリッククラウド以後 Amazon Web Services Google Cloud Microsoft

    Azure Webブラウザから操作できるマネジメントコンソールを使った構築 CSP提供のCLIツールを使った各種リソースの構築 マネージドサービスなどもフル活用すればあっという間に 大規模な構成を持ったシステムを構築できてしまう
  14. ©MNTSQ, Ltd. 47 アプリケーション実装の管理 パブリッククラウド以前 コーディング ソースコード管理 CI/CD アプリケーションはソース コードを記述して実装する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず...
  15. ©MNTSQ, Ltd. 48 アプリケーション実装の管理 パブリッククラウド以前 コーディング ソースコード管理 CI/CD アプリケーションはソース コードを記述して実装する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず... これをインフラストラクチャ管理に持っていこう
  16. ©MNTSQ, Ltd. 49 ITインフラストラクチャ管理の管理 パブリッククラウド以後 コーディング ソースコード管理 CI/CD アプリケーションはソース コードを記述して実装する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず...
  17. ©MNTSQ, Ltd. 50 ITインフラストラクチャ管理の管理 パブリッククラウド以後 コーディング ソースコード管理 CI/CD インフラストラクチャ定義 はコードで管理する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず... json YAML
  18. ©MNTSQ, Ltd. 51 ITインフラストラクチャ管理の管理 パブリッククラウド以後 コーディング ソースコード管理 CI/CD インフラストラクチャ定義 はコードで管理する

    ソースコードはソースコード リポジトリで管理する 継続的インテグレーション/ 継続的デプロイ・デリバリの パイプラインをコード定義 し、アプリケーションをリ リースする パブリッククラ ウド以前でも、 他に色々あった はず... json YAML
  19. ©MNTSQ, Ltd. 52 ITインフラストラクチャ管理の管理 パブリッククラウド以後 コーディング ソースコード管理 CI/CD インフラストラクチャ定義 はコードで管理する

    ソースコードはソースコード リポジトリで管理する インフラストラクチャの構成 変更も選択肢が増えた json YAML
  20. ©MNTSQ, Ltd. 53 ITインフラストラクチャ管理の管理 パブリッククラウド以後 コーディング ソースコード管理 CI/CD インフラストラクチャ定義 はコードで管理する

    ソースコードはソースコード リポジトリで管理する インフラストラクチャの構成 変更も選択肢が増えた json YAML Infrastructure as Codeとそれを中心とした管理・運用プロセス
  21. ©MNTSQ, Ltd. 54 • パブリッククラウドプロバイダーからIaCサービスが出てきた ◦ AWS CloudFormation ◦ Google

    Cloud Deployment Manager (→ Infrastructure Manager) ◦ Azure Bicep インフラストラクチャをコードで管理(IaC; Infrastructure as Code)すればいいじゃない? パブリッククラウド以後
  22. ©MNTSQ, Ltd. 55 • パブリッククラウドプロバイダーからIaCサービスが出てきた ◦ AWS CloudFormation ◦ Google

    Cloud Deployment Manager (→ Infrastructure Manager) ◦ Azure Bicep インフラストラクチャをコードで管理(IaC; Infrastructure as Code)すればいいじゃない? パブリッククラウド以後 インフラストラクチャを コードで管理する & 構成変更の手順を統一することで 管理・運用コストの削減を狙った
  23. ©MNTSQ, Ltd. 57 そこまでCFnは使い込んでないのであくまでも例ですが CloudFormationの場合 パブリッククラウド以後 コーディング デプロイ aws cloudformation

    \ deploy 結果の確認 複雑な作業手順書が、aws cloudformation deployコマンドに集約された = 作業手順を一定程度揃えることができた
  24. ©MNTSQ, Ltd. 58 ここまでのまとめ パブリッククラウド以後 Infrastructure as Code(IaC) 旧来型の管理 IaCにより

    作業手順管理コストの低減、(部分的な)構成管理が実現 することで管理コストの爆発は一定程度抑えることができた
  25. ©MNTSQ, Ltd. 61 • パブリッククラウドプロバイダーからIaCサービスが出てきた ◦ AWS CloudFormation ◦ Google

    Cloud Deployment Manager (→ Infrastructure Manager) ◦ Azure Bicep インフラストラクチャをコードで管理(IaC; Infrastructure as Code)すればいいじゃない? マルチクラウド
  26. ©MNTSQ, Ltd. 62 • パブリッククラウドプロバイダーからIaCサービスが出てきた ◦ AWS CloudFormation ◦ Google

    Cloud Deployment Manager (→ Infrastructure Manager) ◦ Azure Bicep インフラストラクチャをコードで管理(IaC; Infrastructure as Code)すればいいじゃない? マルチクラウド すべてを個別のパブリッククラウドプロバイダー提供のサービスを学習して記述するか?
  27. ©MNTSQ, Ltd. 63 • パブリッククラウドプロバイダーからIaCサービスが出てきた ◦ AWS CloudFormation ◦ Google

    Cloud Deployment Manager (→ Infrastructure Manager) ◦ Azure Bicep インフラストラクチャをコードで管理(IaC; Infrastructure as Code)すればいいじゃない? すべてを個別のパブリッククラウドプロバイダー提供のサービスを学習して記述するか? 学習コストの問題
  28. ©MNTSQ, Ltd. 66 • 特定のパブリッククラウドに閉じたものではない ◦ いわゆるメガクラウドには対応 ◦ メガクラウド以外のSaaSなども対応している(Datadog, PegerDuty,

    NewRelicなど) • メガクラウドでも実質的に1stチョイスとして公式に提示されているものがある 複数のクラウドプロバイダーに対応したIaCツールとしてのTerraform マルチクラウド Google Cloud Infrastructure Manager https://cloud.google.com/infrastructure-manager/docs/overview?hl=ja Deployment Manager(YAMLベースの独自 DSLによるIaCサービス)は 2025/12/31で終了、公式な乗り換え先として Terraformを使ってインフラストラ クチャを管理する Infrastructure Managerを提示 Oracle Cloud Infrastructure Resource Manager https://www.oracle.com/jp/cloud/cloud-native/resource-manager/ Terraformを使ってインフラストラクチャを管理する Resource Managerを提供 (一般的に使用されている オープンソースの業界標準である Terraformに基づいており ...との記 述まである)
  29. ©MNTSQ, Ltd. 67 • Hashicorp Configuration Language(HCL; HCL is the

    HashiCorp configuration language. )のできが良い ◦ HCL2 (Terraformだと0.12以降)に移行してから、かなり使い勝手が改善されている ▪ 逆にいうとそれ以前はそれなりに癖が強かった ◦ 宣言型と手続き型のミックスを絶妙なバランスで実現している点 ▪ 原則として宣言型 ▪ 手続き型的な側面はあるが、”手続きの類はあまり書いてくれるな”というメッセージは感じる • マルチクラウドでのインフラの構築・管理手順を定型化できる ◦ terraform init/plan/apply、どのクラウドでも基本は同じ 個人的なTerraformの良いポイント これをどのクラウドプロバイダでも 同じ作業手順、プロセスで実現できる
  30. ©MNTSQ, Ltd. 69 • 個別クラウドの知識からは逃げられない • そもそものインフラ設計の悪さは覆せない • 影響範囲の重要性(state分割の考慮) •

    なんでもできるは何にもできない(module設計の注意点) • 命名の重要性 • state間の依存関係は一方向にする • コード管理しない勇気(importしなくてもよくない?) Terraformを利用する上での注意
  31. ©MNTSQ, Ltd. 73 Terraformでの変更をする際にも個別のterraform plan/apply時の差分はなるべく小さくした方がいいでしょう 影響範囲の重要性(state分割の考慮) Terraformを利用する上での注意 terraform planしたら隣の部署のリソース変更が大量に出るんだけど? IAMポリシーの変更なのに、VPCのサブネットのrecreateが走るんだけど...

    terraformのstateは適切に分割することで、意識しなければいけない変更の範囲を小さく止めましょう 関連性の薄いリソースは別stateに分ける (別stateで作成したリソースの情報が必要な場合はdataソースか、リモートステートを使う*。) 管理している組織が異なる場合はstateは分ける (コンウェイの法則的な形) *個人的には命名規則やリソースタグなどを駆使してdataソースで参照することを推奨
  32. ©MNTSQ, Ltd. 75 Terraformのモジュール設計時はなんでもできるものはモジュールとしての意味をなしません。 モジュールの目的 1. 関連性の深いひとまとまりのリソース群をまとめて作成する 2. あまり詳しくない人でも安全にリソースのセットを作成できるようにする (いわゆるガードレール的な観点)

    なんでもできるは何にもできない(module設計の注意点) Terraformを利用する上での注意 特に後者の場合は、 なんでもできてしまうとガードレールが意味をなしません moduleを作成する時は何をできないようにするか、引き算の思考で考えた方が良いです 後から変更可能にすることも現在のTerraformでは比較的容易です (object typeのoptionや変数のdefaultなどの活用)
  33. ©MNTSQ, Ltd. 78 stateの依存関係は一方通行として循環などが発生しないようにする state間の依存関係は一方向にする Terraformを利用する上での注意 state A state B

    state C state D state E state A state B state C state D state E state B, C, Dはstate Aに依存 state Eはstate B, C, Dに依存 state B, C, Dはstate Aに依存 state Eはstate B, C, Dに依存 state Aはstate Eに依存 (循環的な依存関係の発生)
  34. ©MNTSQ, Ltd. 79 stateの依存関係は一方通行として循環などが発生しないようにする state間の依存関係は一方向にする Terraformを利用する上での注意 state A state B

    state C state D state E state A state B state C state D state E state B, C, Dはstate Aに依存 state Eはstate B, C, Dに依存 state B, C, Dはstate Aに依存 state Eはstate B, C, Dに依存 state Aはstate Eに依存 (循環的な依存関係の発生) インフラの構築・管理を開始した初期には発生しづらいが、 一定期間以上経過してシステム規模が大規模化した際に発生しがち (-targetオプションの使用など)一旦の対応手段がないわけでもないが、確実に面倒を産むので コードレビューの際に特に見るべきポイントの一つはここだと思われる plan/apply時の影響範囲を気にしない覚悟を決めるか、 規模が大きくならない自信があるなら単独stateですべて管理する判断もアリ