$30 off During Our Annual Pro Sale. View Details »

Terraform v1.6.0で始めるインフラ単体テスト

hr0hr57
October 28, 2023

Terraform v1.6.0で始めるインフラ単体テスト

2023/10/30のJAWS-UG東京ランチタイムLT会#4での発表資料です。

hr0hr57

October 28, 2023
Tweet

More Decks by hr0hr57

Other Decks in Technology

Transcript

  1. 目次 • 自己紹介 • Terraformとは • Terraform v1.6.0での更新内容 • Terraformの単体テストとは

    • やってみた • さいごに ※おことわり 念のためステマ規制に関して、企業・製品情報が多めのページには以下のアイコンを提 示させていただきます。私は一切企業と関わりはございません。 2 PR
  2. 自己紹介 • ryosaan (@hr0hr57) • 某金融系SIerでインフラ設計・構築を担当 • 基本的にはAWSを利用中 • 所属コミュニティ

    ◦ AWS Community Builder(Cloud Operations) ◦ Ops-JAWS運営 ◦ CNDT2023運営 ◦ この他クラウド系コミュニティによく出没 • 2022-23 APN ALL AWS Certifications Engineers • 好きなAWSサービス ◦ CloudWatch 4
  3. Terraformとは • HashiCorp社が開発 • マルチクラウドに対応したIaC (Infrastructure as Code) ツール ◦

    AWS CDK , AWS CloudFormation , Pulumi , Bicep , Ansible , etc.. • 作成したいリソースをコードで定義し、数コマンドで環境が構築できる • 宣言型モデルで作りたい環境のあるべき姿を定義 ◦ cf. 命令実行モデル:作成する手順をコード化 • 独自のHCL言語でコードを記述する • 内部的にはGo言語で構成され、各プロバイダのSDKを呼び出すことでリソースを作 成する 6 PR
  4. Terraform v1.6.0での更新内容 • ソフトウェアライセンスを MPL2.0 から BSL 1.1 に変更 HashiCorp

    adopts Business Source License • macOS のサポートを 10.15 Catalina 以降に変更 • Windows のサポートを Windows 10 または Windows Server 2016 以降に変更 • S3 バックエンドの設定内容を大幅に変更 • import ブロックの id フィールドで変数を限定的に使用可能に • terraform test コマンドを正式実装 https://github.com/hashicorp/terraform/releases/tag/v1.6.0 8 PR
  5. Terraformの単体テストとは • 単体テストとは、 「プログラムの各部分を分離し、個々の部品が正しいことを示すこと」 cf. Wiki(単体テスト) • インフラの単体テストとは、 「インフラリソースに対して行った個々の変更が正しく設定されているかを確認するこ と」

    ◦ MWの設定ファイル ◦ AWSリソースの設定値 ◦ etc • Terraformを利用した環境における単体テストとは、 「Terraformで構築された各リソースに対して、想定通りの設定値となっているかを確 認すること」 ◦ Terratest:GoLangでテストコードを記述し、設定値を確認 ◦ Jest+SDK:JavaScriptでテストコードを記述し、設定値を確認 ◦ 目検:マネジメントコンソールで設定値を確認 10
  6. やってみた • 作る構成とテスト ◦ 構成は右図 ▪ VPC・Subnetは作成済み ▪ EC2を追加する ◦

    テストは2種類 ▪ プロビジョニングなし ▪ プロビジョニングあり • 事前準備 ◦ Terraform v1.6.0以上にバージョンアップ https://developer.hashicorp.com/terraform/downloads 12
  7. やってみた • ソースコード ◦ テストコードは*.tftest.hclまたは*.tftest.jsonに記載 ◦ command = plan を指定するとリソースをプロビジョニングせずにテストを行う

    ▪ デフォルトではapplyとなり、テスト用リソースがプロビジョニングされる (テスト完了後削除され る) 例)EC2のIP等プロビジョニング後にしか検証出来ないもの (known after applyの項目) ◦ assert句に実際にテストしたい項目を記述 13
  8. できること • テストファイルをディレクトリにまとめる ◦ -test-directory=’対象フォルダへの相対パス ’ で指定 • 変数を設定する ◦

    通常の変数と同様に、 valiables{}、TF_VAR_*、tfvarsファイルが利用可能 • Custom Conditionsとのハイブリッド ◦ v1.5.0で実装されたcheckブロック等と組み合わせて使うと尚良い(かも) ※plan/apply時に警告まで行うブロック • outputの値を検証する • モジュールを読み込む • etc 16
  9. さいごに • Terraform についにtestコマンドが実装された! • 他言語でコードを書く必要がないので学習コストは低い • プロビジョニングせずにテストできる ◦ プロビジョニングしないとテスト出来ないものを

    planで実行するとエラーになる • プロビジョニングしてテストもでき、使ったリソースは削除してくれる • 変数も使える、Custom Conditionsも使える • S3等名前が一意でないといけないものは、applyのtestで失敗する場合がある • v1.5.0もかなりアツいアップデートがあったので、ぜひ追ってみてください! 18