詳解Terraform第3版 9章
https://gyazo.com/f7bec0609a1a743fbb4ca5e3e0e50472
IaCはコード管理することでリスクを低減し自信が持てるようになる 9.1 手動テスト
HTTPサーバ書いて curl で手動テストするパターン
9.1.1 手動テスト基礎
Terraform では手動テストをどうするか
ローカルでは AWS リソース作成を再現できない、テスト重要事項1, ローカルホストは使えない
ここまで apply, destroy を繰り返してきたのは手動テストといえる
つまりサンプルをapplyしcurlでテストしてdestroyする
コラム: インフラ正常性確認
HTTPリクエスト可能なリソースだからできることであってRDSである場合などは任意のDBクライアントから接続できるかになるだろうし、VPNならVPNクライアントからテストすることになる
テストはデプロイ環境とは別にサンドボックス環境を用意して確認するよう推奨
9.1.2 テスト後の片付け
テスト重要事項2, サンドボックス環境は定期的に片付けよう
ベストはツールで定期的に一掃されていることが好ましい
9.2 自動テスト
テスト種類の再確認、ユニットテスト・統合テスト・E2Eテスト
9.2.1 ユニットテスト
Ruby コードを例にHandlerへ切り出してユニットテストを書く
9.2.1.1 Terraform のユニットテスト
テスト重要事項3, Terraformで純粋なユニットテストはできない
なので実際の環境に小さなモジュールをデプロイすることが自動テストを書くことと同義
ユニットテストではなく統合テストに近い
独立したモジュール作成->サンプルコード->apply->結果をテスト->destroy
重要な点は手動テストだったものをコードとして実行することが重要
terratest を使ってテストを書いていく
code:time.sh
________________________________________________________
Executed in 219.47 secs fish external
usr time 15.21 secs 113.00 micros 15.21 secs
sys time 2.79 secs 714.00 micros 2.79 secs
9.2.1.2 依存性の注入
Ruby で外部サイトへリダイレクトするRoutingを追加する
外部サイトリダイレクトはクラスオブジェクトを使い表現し、Constructor Injection する
テストではモックの依存クラスオブジェクトを表現して実行
tkdn.icon ALB, ASG などを含んだテストがコケると5分またかかるので徒労感がある
9.2.1.3 並列実行
t.Parallel() で並列で実行だが重複リソースの作成・削除は名前が重複するので失敗する
テスト重要事項4, あらゆるリソースに名前をもたせよう
ALB, ALB Target Group, ASG などの名前が一意の名前になるようテストを書き直して実行、パス
9.2.2 統合テスト
Rury テストコードで実際のサーバを起動してリクエストからえたレスポンスで検証するテストコード
MySQL, App Webサーバクラスターの統合テストを書いていく
途中バックエンドとなるs3のtfstateが上書きしてしまうのでbackend設定を別ファイルにする
以下のような指定が可能
code:sh
terraform init -backend-config=backend.hcl
terratest では BackendConfig が渡せる
InvalidParameterCombination でリソース作成できなかった
DBInstanceClass=db.t2.micro, Engine=mysql, EngineVersion=8.0.35, LicenseModel=general-public-license. For supported combinations of instance class and database engine version, see the documentation
tkdn.icon db.t3.micro でできた。ただしいのかわからん
tkdn.icon あとtypoしただけでfailしたテストをながく待たされるのでさすがにだるい
このあとステージごとのテスト分割になるがスキップする
9.2.2.1 テストステージ
スキップ
9.2.2.2 リトライ
外部依存なので flaky test はどうしても出てくる
9.2.3 E2Eテスト
E2E…本番に似せた環境にすべてをデプロイしてテストするということになる
実際にはそんなことはやらないからの、テストピラミッド
テスト重要事項5, 小さなモジュールテストが簡単で高速
E2Eが現実的ではないのは遅すぎるし不安定すぎるというのが理由
tkdn.icon さんざんやらせておいてそんなあ…
9.2.4 他のテスト手法
tfsec, tflint の紹介
Repoという宣言型言語でポリシーを記述できる Policy as Code もあるらしい
serverspec, inspec, goss...
9.3 まとめ
IaC は動きが早いのでコードが腐りやすい、つまり自動テストがないコードは壊れている
自動テストを書くことは簡単ではない
テストにおいて重要な点
Terraformコードのテストはlocalhostが使えない
Sandbox環境を使って定期的に片付ける
Terraformコードに対する純粋なユニットテストはない
あらゆるリソースには名前空間をもたせる
小さなモジュールはテストが簡単で高速である