Slide 1

Slide 1 text

Terraform テスト⼊⾨ 2024.7.24 AWS事業本部 佐藤雅樹

Slide 2

Slide 2 text

Xへの投稿の際は、 ハッシュタグ #cm_odyssey でお願いいたします。 2 お願い

Slide 3

Slide 3 text

⾃⼰紹介 3 resource “my_profile” “this” { name = “佐藤雅樹” x = “@chari7311” company = “クラスメソッド株式会社” department = “ソリューションアーキテクト” }

Slide 4

Slide 4 text

本セッションについて 4 ● 対象者 ○ Terraformを利⽤してIaCを実践している ⽅ ○ Terraformの各種テスト機能‧ツールに ついて興味がある⽅ ● ゴール ○ Terraformのテストの必要性と各種テス ト⼿法がわかる

Slide 5

Slide 5 text

なぜTerraformコードを テストするのか 5

Slide 6

Slide 6 text

リソースの変更に ⾃信を持つため 6

Slide 7

Slide 7 text

変更による影響を完全に把握するのは難しい ● 管理するリソースの数や機能は多岐にわたる ● ベストプラクティスや必要なセキュリティも⽇々 アップデートされている ● 共通モジュールやツールが意図しない使われ⽅を されていることもある 7

Slide 8

Slide 8 text

分からないものは怖い 意図せずに発⽣するかも ● ダウンタイム ● データ損失 ● セキュリティ‧コンプライアンス違反 8

Slide 9

Slide 9 text

テストを導⼊する効果 ● 変更の影響範囲が把握しやすくなる ● コードのバグに早く気付ける ● ⾃動テストによって確認作業が省⼒化される 9

Slide 10

Slide 10 text

Terraformコードのテストで リソース変更に⾃信を 10

Slide 11

Slide 11 text

Terraformにはどういった テストがあるのか 11

Slide 12

Slide 12 text

Terraformのテスト 12 - 静的解析 - ポリシーテスト - ユニットテスト - コントラクトテスト - インテグレーションテスト - E2Eテスト

Slide 13

Slide 13 text

課題 1. コード品質を上げたい 2. 共通モジュールの変更が怖い 3. 全体的な機能をテストしたい 13

Slide 14

Slide 14 text

課題1 14

Slide 15

Slide 15 text

課題1 コード品質を上げたい 状況 ● ⼈によってセキュリティやコンプライアンスへの対応状況にばらつきがある 問題 ● ⼿動確認やPRレビューの負荷が⾼い ● デプロイ後Security HubやCNAPP等で検知されてから、修正しており⼿間がか かっている 対策 ● 静的解析 ● ポリシーテスト 15

Slide 16

Slide 16 text

16 静的解析 概要 ● コードを実⾏せずに、構⽂エラーやベストプラクティス違反を検出する テストの例 ● EBSボリュームが暗号化されているか ● 使⽤されていない変数がないか ツール ● Checkov,Snyk,tfsec,tflint等

Slide 17

Slide 17 text

Checkov 17 tfファイル checkov検出結果 ingressが全て許可さ れていることを検知

Slide 18

Slide 18 text

18 ポリシーテスト 概要 ● 設定が組織のポリシーに準拠していることをテストする テストの例 ● 「ManagedBy = terraform」タグが付いていないリソースがないか ● デプロイが⾦曜⽇に⾏われていないか ツール ● OPA,Sentinel

Slide 19

Slide 19 text

19 Sentinel https://developer.hashicorp.com/terraform/tutorials/policy/sentinel-policy Nameタグの強制 インスタンスタイプの制限

Slide 20

Slide 20 text

課題2 20

Slide 21

Slide 21 text

課題2 共通モジュールの変更が怖い 状況 ● よく使う構成を共通モジュール化して、各システムで利⽤している 問題 ● 共通モジュール変更時の影響範囲がわからず、更新するのが怖い 対策 ● ユニットテスト ● コントラクトテスト ● インテーグレーションテスト 21

Slide 22

Slide 22 text

ユニット = 再利⽤可能なモジュール Terraformのテスト単位(ユニット) 22

Slide 23

Slide 23 text

23 ユニットテスト 概要 ● 個々のTerraformモジュールの機能を検証する テスト例 ● 正しいCIDRブロックを持つサブネットを作成するか ● 作成されるS3バケットの命名規則が正しいか ツール‧機能 ● Terratest ● terraform test(terraformネイティブ機能)

Slide 24

Slide 24 text

24 terraform test https://developer.hashicorp.com/terraform/tutorials/configuration-language/test ランダム⽂字列を作成するヘルパースクリプト S3バケットの命名規則が正しいか ファイルに変更がないか

Slide 25

Slide 25 text

25 コントラクトテスト 概要 ● モジュール間のインターフェースや依存関係を検証する テスト例 ● EC2モジュールのVariable AMI IDが正しい形式になっているか ● EC2インスタンスのパブリックDNSが想定通りの設定になっているか ツール‧機能 ● Input variable validation(terraformネイティブ機能) ● Preconditions/postconditions(terraformネイティブ機能)

Slide 26

Slide 26 text

26 Input variable validation https://developer.hashicorp.com/terraform/language/expressions/custom-conditions?ajs_aid=9d245d2d-3c8b- 4c44-828a-9e32ec71ad57&product_intent=terraform#input-variable-validation AMI IDが正しい形式か

Slide 27

Slide 27 text

27 インテグレーションテスト 概要 ● 複数のTerraformモジュールやリソースが正しく連携して動作することを確認する テスト例 ● VPC、EC2、RDSを組み合わせたアプリケーションスタックが正しく構築されるか ツール‧機能 ● Terratest ● terraform test(terraformネイティブ機能)

Slide 28

Slide 28 text

課題3 28

Slide 29

Slide 29 text

課題3 全体的な機能をテストしたい インフラ全体が動作するのか確認したい 29

Slide 30

Slide 30 text

30 E2Eテスト 概要 ● 実際のクラウド環境にインフラストラクチャをデプロイし、全体的な機能を確認する テスト例 ● エンドポイントに対して、HTTPリクエストして正常なレスポンスが返ってくるか ツール‧機能 ● Terratest ● terraform test(terraformネイティブ機能) ● Check blocks(terraformネイティブ機能)

Slide 31

Slide 31 text

31 Check Blocks https://developer.hashicorp.com/terraform/language/checks サイトから正常なレスポンスが返ってくるか

Slide 32

Slide 32 text

terraform testでも出来そうだけど なぜCheck Blocksを使うの? 32

Slide 33

Slide 33 text

33 なぜCheck blocksを使うか テストのたびに、⼀時的に全リソー スを作成するのは現実的ではない →既存の環境に対してテストを実⾏ する   既存リソースに対してのテストは、Check blocksが適している https://dev.classmethod.jp/articles/terraform-test-check/

Slide 34

Slide 34 text

34 Check blocksの利点 ● Terraformライフサイクルの外側でのチェックが⾏いやすい - 例)AWS Budgetsの予算を超過していないか、ACMでインポートした証明書の有効期限は切れ ていないか ● 実⾏時間が短い(terraform testと違い⼀時的なリソース作成が⾏わない) ● HCP TerraformのContinuous validationを利⽤できる - 定期的にCheck blocksを実⾏する機能 https://dev.classmethod.jp/articles/terraform-test-check/

Slide 35

Slide 35 text

まとめ 35

Slide 36

Slide 36 text

36 セッションの振り返り ● Terraformのテストを導⼊することで、⾃信をもってリソース変更ができるよ うになります ● 静的解析‧ポリシーテスト → セキュリティとガバナンス向上 ● モジュール関連のテスト → 共通モジュールの管理負荷軽減 - ユニットテスト - コンストラクトテスト - インテグレーションテスト ● E2Eテスト → インフラの全体的な信頼性向上

Slide 37

Slide 37 text

37 最後に、明⽇からやれること 静的解析をCI/CDやpre-commitに導⼊してみましょう! ● 個⼈的にはCheckovおすすめ ● すでにSnykお使いならSnyk IaC ● ツールの⽐較ブログ - A Deep Dive Into Terraform Static Code Analysis Tools: Features and Comparisons

Slide 38

Slide 38 text

お知らせ 38

Slide 39

Slide 39 text

39 Terraformのことなら、ClassMethodへ! ● Terraformの豊富な導⼊実績 ● HCP Terraform等、各種SaaS製品を販売 ● HashiCorp Ambassadors在籍 ● DevelopersIOブログも!!→ - Terraformの使い⽅ - AWSマルチアカウント環境での活⽤ - TerraformのCI/CD

Slide 40

Slide 40 text

40 IaC導⼊⽀援 設計、コーディング、トレーニング等に幅広く対応 https://classmethod.jp/aws/services/iac/

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

参考 書籍: 詳解Terraform(主に9章) HashiCorp Blog: Testing HashiCorp Terraform 43