Open6

IaC on Azure

OpenJNYOpenJNY

https://www.slideshare.net/slideshow/aws-iac-terraform-hashitalks-japan-nttdata/253233136

OpenJNYOpenJNY

IaC の課題

https://speakerdeck.com/yuukit/cloudless-computingnolun-wen-shao-jie

  • 問題
    • IaC は難しい: 学習曲線のカーブがキツイ
    • 検証が不十分: シンタックスの検証 (lint) が通っても動く保証なし
    • デプロイが非効率: リソース依存関係の解析が不十分なのでリソース状態の再チェックが全体に対して走る
    • コラボレーションが難しい: conflict への対応とかロールバックが難しい
    • デバッグが難しい: ドリフトの検出と調整
    • ポリシーがアドホック: 非機能要件的なポリシー(スケーリング、予算、セキュリティ要件)の統一が難しい
OpenJNYOpenJNY

テスト周り

https://speakerdeck.com/linyows/tests-in-iac

  • 「Unit テストを書く時間と得られる安全は見合っていない感覚がある」とてもよく分かる
  • Online Stack Test を増やすのが良いらしい

https://kb.novaordis.com/index.php/Infrastructure_Code_Testing_Concepts

  • Offline Stack Tests
    • シンタックスチェック: bicep の linter
    • 静的コード解析
      • tflint、checkov、bicep
      • ポリシー準拠なら bicep の avm 使うと W-AF 準拠ライクなものが作れる
  • Online Stack Tests:
    • 作ったリソース同士を連携させてフィードバックを得る
  • System Tests: インテグレーションテスト
OpenJNYOpenJNY

https://www.youtube.com/watch?v=xhHOW0EF5u8

  • 静的解析
    • 少しでいいからツールを使ってチェック
  • Unit Test
    • モジュール化してモジュール単位でやる
    • ユニットテストは外部とのインタラクションはあるべきでない。その意味で pure なユニットテストは定義できない
    • なので「デプロイして、動作確認して、壊す」が IaC でやるなら相当する
    • terratest
OpenJNYOpenJNY

Azure の Online Stack Tests

terratest

https://terratest.gruntwork.io/docs/testing-best-practices/alternative-testing-tools/
https://learn.microsoft.com/ja-jp/azure/developer/terraform/best-practices-end-to-end-testing

ssh で jump-box vm にログインして、別 vm に ping 打てるかっていうテスト

Chef InSpec

https://github.com/inspec/inspec-azure/?tab=readme-ov-file#ensure-all-resources-has-a-specified-tag-defined-regardless-of-the-value

describe azure_virtual_machine(resource_group: 'RESOURCE_GROUP', name: 'NAME-WEB-01') do
  it { should exist }
  it { should have_monitoring_agent_installed }
  it { should_not have_endpoint_protection_installed([]) }
  it { should have_only_approved_extensions(['MicrosoftMonitoringAgent']) }
  its('type') { should eq 'Microsoft.Compute/virtualMachines' }
  its('installed_extensions_types') { should include('MicrosoftMonitoringAgent') }
  its('installed_extensions_names') { should include('LogAnalytics') }
end