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

Terraform による運用効率化の取り組みと最新のテストアプローチの紹介

Avatar for Tech Leverages Tech Leverages
March 04, 2025
2.3k

Terraform による運用効率化の取り組みと最新のテストアプローチの紹介

Avatar for Tech Leverages

Tech Leverages

March 04, 2025
Tweet

More Decks by Tech Leverages

Transcript

  1. • 名前:中野竜之介 (33歳) • 所属:テクノロジー戦略室 SRE チーム • 出身:三重県伊勢市 •

    趣味:温泉、自然散策・登山、鉄道等 • 経歴: ◦ 2017年4月 〜 2022年6月 ▪ HR ビッグデータ事業、 IT ソリューション事業の会社に新卒入社 ◦ 2022年6月 〜 2025年2月 ▪ レバレジーズに中途入社し、テク戦 SRE チームに所属して活動 プロフィール
  2. 【ミッション】 SRE 化を通して、 Developer Experience の改善、事業拡大への対応、お客様に信 頼されるサービスの提供を実現する 【ゴール】 • リソース最適配置を最大限配慮したシステム設計がされており、定期的に見直しや改善を

    行う体制になっている • 事業部毎にユーザー視点に立った SLO が設定され、SLO の達成のために合理的に動け る様な仕組みが整っている • ベストプラクティスが社内全体で水平展開出来ている • システム課題を持続的に改善する文化が根付いている テク戦 SRE のミッション・ゴール
  3. 【理想】 SLI / SLO の運用体制の構築を通して、開発生産性の向上、顧客 (社内外) に信頼さ れるサービスの提供、事業拡大への対応を実現する 【目標】 事業部の開発組織に

    Product SRE を導入し、 SRE の教育・運用の体制構築を実施 し、Embedded SRE が自然と SLI/SLO の導入・運用を実施出来る様にする テク戦 SRE の中長期の理想・ 目標
  4. 社内の今後の目指すべき SRE 体制 • Evangelist SRE Role ◦ テク戦 SRE

    メンバーのことを指す ◦ 全社を横断し、運用効率化のツール・仕組みの提供、ノウハウの提供・吸い上げ、アー キテクチャー相談等を実施する • Product SRE Role ◦ 事業部の開発組織を横断する SRE メンバーのことを指す ◦ 開発組織内の SRE 化の支援・浸透や運用効率化の推進等を実施する • Embedded SRE Role ◦ サービス開発チームに所属の SRE メンバーのことを指す ◦ SRE プラクティスを適用したり、サービスインフラの構築・運用等を実施する
  5. 本セッションでお話すること • 全社へのナレッジ・ノウハウの展開を考え、主に次をお話します ◦ テク戦 SRE による、これまでの運用効率化に関する動き ◦ 現在のインフラ設定のテストにおける考え方・実施方法等 •

    発表時間を踏まえ、基本知識・詳細・周辺事項等には触れません ◦ セッション内容について、ざっくりと理解頂ければ幸いです ◦ 参考情報を共有しておきますので、良ければご確認ください
  6. • サービス運用の効率化を進めるため、まずはインフラ・監視基盤の IaC 化による整備を推進し、管理・運用の省力化を進めていた • 実際には開発チームにより IaC ツールの選定にバラツキがあり、開発 チームとテク戦 SRE

    の双方で次の様な課題感が顕在化し始めた ◦ ツールの理解度や習熟度がバラついているため、開発チーム間でのナレッ ジやノウハウの共有が困難である ◦ 開発チームの採用技術、理解度や習熟度に合わせてインフラ・監視基盤の 整備を支援するため、負荷が高い 従来の運用における課題感・打ち手
  7. • 開発チームのインフラ・監視基盤の整備や、テク戦 SRE からの整備支 援を低工数・低負荷で進めるには、次の取り組みが必要だと考えた ◦ 社内標準となる IaC ツールの選定 ▪

    Terraform、OpenTofu、AWS CDK、CDKTF、Pulumi から検討 ◦ IaC 関連のライブラリ・テンプレートの作成 ▪ 社内のインフラ標準構成に基づく Terraform Modules の開発 ▪ Terraform CI/CD 向けの GitHub Composite Actions の開発 ▪ Terraform のコード管理用の GitHub Repository Template の開発 従来の運用における課題感・打ち手
  8. • IaC ツールの認知度・利用度の高さを考え、次を選択肢とした ◦ Terraform、OpenTofu、AWS CDK、CDKTF、Pulumi • 社内状況に適した IaC ツールを選定するために、次を優先条件とした

    ◦ なるべく幅広いサービスで同一ツールが利用可能である ◦ ライブラリ・モジュール等で同一パターンを容易に適用可能にする仕組みを持っている ◦ ツールにおける学習コストが高くない • 次の観点で比較評価を行い、 Terraform・OpenTofu が高評価だった ◦ 成熟度・カバー範囲、ツールの学習負荷、構築・変更の負荷、状態変更の容易性、 Gen AI との相性 社内標準としての IaC ツールの選定:比較評価
  9. 社内標準としての IaC ツールの選定:比較評価 比較観点 評価理由 成熟度・カバー範囲 殆どのパブリッククラウドやその他の SaaS におけるプロバイダーが利用可能 で、関連するコミュニティ、知識・知見、ツール等が充実している。

    ツールの学習負荷 HCL は JSON ライクで学習しやすく、設定が宣言的で見通しが良い。 構築・変更の負荷 設定が宣言的であるため、クラウドサービスの作成・更新・削除において、コード 変更とズレの無い状態差分で期待通りに適用することが出来る。 状態変更の容易性 専用のブロック設定 (import / moved / removed blocks) を用いて、状態のイン ポート、変更、除外の操作をコードベースで容易に実施出来る。 Gen AI との相性 宣言的でシンプルな設定が大半なため、変数設定の手直しは必要だが、簡単な プロンプトで一定以上のクオリティでサンプルコードを生成出来る。
  10. • 比較評価だけでなく、ツールの将来的なリスクも考える必要があり、主にライセ ンス変更による Terraform の利用制限について調査した • 通常の利用においては概ね従来通りで利用可能であり、利用制限に関するリス クは見られなかった ◦ 社内・個人による

    HashiCorp 製品の利用においては、利用制限は無い ◦ HashiCorp 製品を埋め込んでいる競合製品が提供されている場合、この様な競合製 品は Terraform のライセンスに抵触する (例:Terratest) • 今後の HashiCorp クラウドサービスとのシームレスな連携・統合の検討可能性 も踏まえ、 OpenTofu ではなく Terraform の方が良いと考えた 社内標準としての IaC ツールの選定:リスク調査
  11. • 比較評価やリスク調査の結果、 Terraform を社内標準なツールとして採 用し、Terraform で IaC 化を推進していくことになった • Terraform

    の導入・移行における費用対効果が必ずしも高くは無いパ ターンも考えられるため、導入・移行の例外事項を規定した ◦ Terraform へのツール移行 ◦ Terraform によるサポートが弱い部分への IaC 化 ◦ 外部サービスの仕組みにおける Terraform の導入 ◦ 一時的な利用のシステムへの Terraform の導入 社内標準としての IaC ツールの選定: 検討結果
  12. 社内標準としての IaC ツールの選定: 例外事項 例外パターン 対応方針 Terraform へのツール移行 他ツールで管理下のパブリッククラウドや SaaS

    では、移行コストと改善 効果性のバランスを考え、 Terraform への移行を検討する。 Terraform によるサポート が弱い部分への IaC 化 Terraform へのサポートが未対応、またはサポート範囲が狭い部分では 他ツールの利用を認める。 外部サービスの仕組みにお ける Terraform の導入 パブリッククラウドや SaaS で提供される仕組みにおいて、 Terraform 以 外の手段で構築されている場合は、その手段の利用を認める。 一時的な利用のシステムへ の Terraform の導入 プロトタイプや実験的な環境等の、一時的な利用が確実に見込まれる様 なシステムでは、 Terraform による IaC 化は強制しない。
  13. • 開発チームやテク戦 SRE のサポートメンバーにヒアリングすると、 IaC 化における下記の課題感が明らかになった ◦ 実装の際にクラウドサービスの仕様把握が必要で、実装負荷が高い ◦ 宣言的な設定のためシンプルで分かりやすいが、リソースが多くなると設定

    管理における認知負荷が高まる ◦ CI/CD やコード管理の標準構成が無く、設計や構築で時間がかかる • これらを解決するには、社内の標準構成に基づいたライブラリ・テンプ レートが必要だと考え、これらを開発することになった IaC 化の推進における課題感・打ち手
  14. ライブラリ・テンプレートの開発: Terraform Modules • 全社最適のパターンを考え、次のモジュール構成方針を考え出した ◦ (1) 個別最適の手段を組み合わせることで、全社最適を図る ▪ 社内のサービス・システムに合わせたモジュール

    ◦ (2) 個々に依存せず全社をカバーする形で、全社最適を図る ▪ クラウドサービスのリソースに対応するモジュール • 主に利用負荷、メンテナンス性、拡張性、汎用性から 案 (2) を採用した • 当時のモジュール構成管理の推奨事項や社内の既存ライブラリの設計思想を 参考に、負荷軽減も考慮して 2種類のモジュール を開発した
  15. ライブラリ・テンプレートの開発: Terraform Modules モジュール構成方針 方針の評価内容 社内のサービス・システムに 合わせたモジュール サービス・システム毎に特化したモジュールのため、極力少ない設定でイ ンフラの構築・運用が可能である。 しかし、各々の構成変更に追従してメンテナンスする必要があり、メンテ

    ナンス面で大きな課題が見られた。 クラウドサービスのリソース に対応するモジュール サービス・システムの個別の設定・構成に依存せずに全社に展開出来る ため、メンテナンス面の課題は小さい。 社内要件やクラウドサービスにより推奨される設定・構成をベースに作り 込めば、インフラ構築・運用の作業負荷を軽減可能だと考えた。
  16. ライブラリ・テンプレートの開発: Terraform Modules モジュールの種類 モジュールの概要 Component Modules クラウドサービスの単体リソースに対応する様なモジュール。 例えば、ELB・ECS・EC2・RDS 等のリソース毎に、対応するモジュー

    ルで管理する。 Catalog Modules クラウドサービスの複数リソースに対応する様なモジュール。 例えば、ELB・ECS、CloudFront・WAF 等のリソース群をモジュール でまとめて管理する。
  17. ライブラリ ・テンプレート の開発:GitHub Composite Actions • 下記の理由で GitHub Actions を採用しており、この処理共通化に関する開発

    を行うことになった ◦ 社内における CI/CD サービスの利用状況 ◦ CI/CD サービスの GitHub 向け連携機能の充実さ • 主に3種類の共通化の方法があり、処理共通化のパターンやコード管理の方針 をもとに、 案 (2) を採用することにした ◦ (1) GitHub Custom Actions ◦ (2) GitHub Composite Actions ◦ (3) GitHub Reusable Actions
  18. ライブラリ・テンプレートの開発: GitHub Composite Actions • 以下は、ライブラリ・テンプレートのコード管理の前提・方針である ◦ テク戦、開発チームの GitHub Organization

    は別々である ◦ ライブラリ・テンプレートの管理元の GitHub Repository は、テク戦の GitHub Organization の配下で管理されている ◦ ライブラリ・テンプレート用の、開発チーム用の GitHub Repository の可視性は Internal or Private である • テク戦推奨の Terraform CI/CD の構成をもとに GitHub Composite Actions を作り、Terraform CI/CD の処理共通化・テンプレート作成を行った
  19. ライブラリ・ テンプレートの開発: GitHub Repository Template • 社内で AWS が多く利用されているため、優先的に AWS・Terraform

    に関する GitHub Repository Template を優先して作成した • テク戦推奨の Terraform のコード管理構成をもとに、 Template のファイルや ディレクトリの構成雛形を考えた • スクリプトで Template を一気に書き換え、コード・資料の情報を利用者に合わ せた情報に変更出来る様にした • 更に、Template に AWS・Terraform に関する初期設定・構築作業等の手順・ 雛形も含めて提供している
  20. ライブラリ・テンプレートの開発: GitHub Repository Template • Terraform 向け Repository の作成だけでなく、以下の作業も簡単になる ◦

    Slack への通知に関する初期設定 ▪ 通知チャンネルの作成、 Webhook 連携の設定 ◦ Terraform 関連の初期設定・構築 ▪ Terraform Backend の構築 ▪ CI/CD 用の IAM リソースの作成 ▪ CI/CD の設定作成・有効化 ◦ AWS サービスの初期設定・構築 ▪ 月額予算アラートの作成 ▪ 監査ログやセキュリティの検知・検出リソースの作成 ▪ 監視アラートの通知基盤に関するリソースの作成
  21. 従来・現在のテストの実施方法 • 従来はテスト用のツール・機能が充実しておらず、モジュール毎にサンプルコー ドを用意し、下記を用いて構築検証を行っていた ◦ サンドボックス用の AWS アカウント ◦ LocalStack

    等の擬似的な専用の環境 • 構築後は、コマンドやプログラムでネットワーク疎通やシステム環境のコンポー ネント間連携等を検証し、リソースを破棄していた • 現在はチェック・テストに関するツール・機能が充実してきており、先述の手動で の検証プロセスが概ね自動で実施可能になっている
  22. 従来・現在のテストの実施方法 テストの種類 ツール・機能の例 静的解析 TFLint、Terraform CLI、Terraform Custom Conditions セキュリティチェック Trivy、Checkov、Synk、Terrascan

    コンプライアンスチェック terraform-compliance ポリシーチェック Open Policy Agent、Conftest、Hashicorp Sentinel 単体・結合テスト Terratest、Terraform Testing Framework サーバテスト InSpec、Serverspec、Goss
  23. 従来・現在のテストの実施方法 テストの種類 ツール・機能の例 静的解析 TFLint、Terraform CLI、Terraform Custom Conditions セキュリティチェック Trivy、Checkov、Synk、Terrascan

    コンプライアンスチェック terraform-compliance ポリシーチェック (PaC) Open Policy Agent、Conftest、Hashicorp Sentinel 単体・結合テスト Terratest、Terraform Testing Framework サーバテスト InSpec、Serverspec、Goss
  24. Terraform Custom Conditions • ここでは、 Terraform のテスト・バリデーションに焦点を当て、下記の機 能について概説したい ◦ Terraform

    Custom Conditions ▪ Input Variable Varidation ▪ Preconditions・Postconditions ◦ Terraform Testing Framework  ※ Custom Conditions の Checks with Assertion は、ここでは触れない  ※ Policy as Code の概要・主要なツール等は、次のセクションで紹介する
  25. Custom Conditions:Input Variable Validations • Terraform v0.13 から、Input Variables で

    Validation Block という変数設定 のバリデーション機能が追加された • variable block 内に validation block を宣言し、バリデーションの条件とエラー メッセージをそれぞれ condition・error_message で設定する
  26. Custom Conditions:Input Variable Validations • Input Variable Validations による設定検証は、 plan

    の処理時に実行される • condition が false となれば、 error_message が出力され、異常終了する • 複数の validation block の設定は可能で、少なくとも 1つの block で検証エ ラーが発生すれば異常終了する
  27. Custom Conditions:Input Variable Validations • 従来は、condition では validation block の設定先の

    Input Variable と、組み 込み関数の組み合わせでしか設定出来なかった • v1.9 のリリースでこの制約が解消され、他の Input Variable や Data Source 等も condition で参照可能になった • 後述の Preconditions と遜色無いレベルになったが、基本的には変数のバリ デーションに留める形で実装すると良さそう • ルートモジュールでは Local Values を用いることが多いため、基本的には再利 用可能モジュールで仕込むと良さそう
  28. Custom Conditions:Preconditions・Postconditions • lifecycle block 内で precondition block や postcondition

    block を設定する ことにより、これらの機能を利用することが出来る
  29. Terraform Testing Framework:概要・ディレクトリ構成 • Terraform v1.6 から、Testing Framework というモ ジュールテストを実施する機能が追加された

    • ルートモジュール配下に tests フォルダを作り、そこで tftest.hcl 拡張子のファイルを作成する • その後、Terraform CLI の test コマンドをルートモ ジュール直下で実行し、テストを実施出来る ◦ デフォルトでは、ルートモジュール 直 下 、またはそのサ ブディレクトリの tests でファイルが探索される ◦ ファイルの格納場所を指定する場合は、 test コマンドの test-directory オプションを実行の際に利用する
  30. Terraform Testing Framework:テスト処理の基本設定 • テスト処理の設定は、 tftest.hcl ファイルで run block を用いて宣言する

    • 主要な引数は command・assert 、これらの設定方法は下記の通りである ◦ command には、plan / apply を指定しテストの実行フェーズを設定する ◦ assert block には、Custom Conditions と同様で condition・error_message を設定する
  31. Terraform Testing Framework:テスト処理の実行順序 • test コマンドを実行すると、次の通りでテスト処理が実行される ◦ 格納場所から tftest.hcl ファイルのパス一覧を取得する

    ◦ 名前のアルファベット順に、 tftest.hcl ファイル毎にテストを実施する ▪ tftest.hcl ファイル内では、 run block をファイル上部から順番に実行する ▪ run block の実行後、この逆順でリソースのクリーンアップを実行する ▪ テスト・クリーンアップが完了すると、ファイル内の処理実行は完了する ◦ 各 tftest.hcl ファイルにおける処理が完了すると、テストは終了する
  32. Terraform Testing Framework:State の管理方法 • テスト用の State が次の様に生成され、メモリで管理・破棄される ◦ テストの設定ファイル毎に、

    State が生成される ◦ run block の設定に関する State は、次の通りで生成される ▪ モジュールを参照する run block の設定は、専用の State として生成される ▪ モジュールを参照しない run block の設定は、設定ファイルの State に統合され る ▪ 同一モジュールを参照する run block が複数存在する場合は、同一の専用の State に統合される ◦ クリーンアップでは、テストの逆順で State の破棄が実施される ▪ ある設定に対応する State が破棄済みの場合は、破棄がスキップされる
  33. Terraform Testing Framework:Mocks の概要・利用方法 • Terraform v1.7 から、Mocks というテスト関連の機能が追加された •

    この機能で、全体的または部分的にモックオブジェクトを利用出来る • モジュールの外部依存な部分を Mocks でモック化し、 API の呼び出し やプロバイダー認証を極力無くす形でテスト出来る • つまり、本来のソフトウェアの単体テストに近い形で、モジュールの機能 を高速・正確にテスト出来る様になったのである
  34. Terraform Testing Framework:全体的なモック化 • mock_provider block により、 Provider、Resource、Data Source のモック化が出来る

    • モック化された Provider とそうで ないものを使い分けたい場合は alias を利用すれば良い
  35. Terraform Testing Framework:全体的なモック化 • mock_resource、mock_data で、Resource、Data Source の モックオブジェクトの属性値を指 定出来る

    • 例えば、右の実装例の様に設定 すると、S3 のモックオブジェクトの ARN を指定出来る
  36. Terraform Testing Framework:部分的なモック化 • Mocks の Override 機能により、特定の既存の Resource、Module、Data Source

    を参照し、モックオブジェクトを作成出来る ◦ Resource の場合、override_resource でモック化出来る ◦ Module の場合、override_module でモック化出来る ◦ Data Source の場合、override_data でモック化出来る • override_resource、override_data では、values で属性値を指定出来る • override_module では、outputs で属性値を指定可能である
  37. Policy as Code とは何か? • Policy as Code (PaC) とは、組織やシステムの遵守事項をポリシーの

    コードとして宣言し、ポリシーを運用・管理する手法である • この手法を用いることで、ポリシーの変更管理や各種設定への一貫した 適用等が容易かつ効率的になる • 主に、セキュリティ、コンプライアンス、リソース設 定 等の要 件やルール の順守における検証で利用される
  38. 主要な PaC ツールの紹介: Open Policy Agent・Conftest • Open Policy Agent

    (OPA) とは、OSS のポリシーエンジンである • ポリシーエンジンとは、ポリシーに違反した情報が無いかチェックし、事 前に定義されたアクションを実行する機構である • OPA を用いる場合、 Rego という言語でポリシーを宣言し、 OPA CLI を 実行してポリシーに則った検証を行う
  39. 主要な PaC ツールの紹介: Open Policy Agent・Conftest • Conftest とは、OPA をエンジンとしたポリシーの検証ツールである

    • OPA と同様で、 Rego でポリシーを宣言して Conftest CLI を実行して ポ リシーに則った検証を行う • Dockerfile、HCL / HCL2、JSON、YAML、XML 等の様々なファイルを 検証可能であり、実際に導入する場合は Conftest の方が良い
  40. 主要な PaC ツールの紹介: Hashicorp Sentinels • Hashicorp Sentinel とは、Hashicorp により提供される

    PaC の言語や フレームワークである (Rego とは異なる言語が用いられる ) • 無料利用は可能だが、基本的に Hashicorp のクラウドサービスとの連 携を前提とした機能が多く、実際は有料機能の検討が必要になる • Hashicorp のクラウドサービスを導入予定の場合はこのツールが望ま しいが、そうでは無い場合は Conftest で運用するのが良い
  41. 今後のテク戦 SRE の動き • 今後は、特に Terraform Modules に焦点を当て、開発・展開をさらに迅速に進 めるために、体制構築・負荷軽減の取り組みにも専念する予定です ◦

    メンテナー体制の構築 ▪ メンテナー向けのガイドラインの作成 ▪ 機能開発・テスト等のフローの自動化 ◦ 利用者向けの負荷軽減 ▪ 利用者向けのガイドラインの作成 ▪ 機能・仕様情報のガイドラインに沿った修正 ◦ リリース展開・FB 吸い上げの体制の構築
  42. 参考情報のリンク一覧 • これまでの運用効率化の取り組み ◦ レバレジーズテックブログ • Terraform でのテストアプローチ ◦ Terraform

    Custom Conditions ◦ Terraform Testing Framework ◦ Terraform CLI:Testing ◦ Terraform Tutorials:Write Terraform Tests
  43. 参考情報の リンク一覧 • Policy as Code を用いた設定検証 ◦ Open Policy

    Agent ◦ Conftest ◦ Hashicorp Sentinel • その他 ◦ 詳解 Terraform 第3版 (O'Reilly) ◦ Infrastructure as Code (O'Reilly)