Terraformテスト入門
by
msato
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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