Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWS CDKにテストは必要?試行錯誤したスクラム開発事例を紹介!/CdkConJp2023
Search
みずほリサーチ&テクノロジーズ株式会社 先端技術研究部
May 19, 2023
Technology
6
6.3k
AWS CDKにテストは必要?試行錯誤したスクラム開発事例を紹介!/CdkConJp2023
「AWS CDK Conference Japan 2023」での登壇資料です。
イベントURL:
https://jawsug-cdk.connpass.com/event/278205/
みずほリサーチ&テクノロジーズ株式会社 先端技術研究部
May 19, 2023
Tweet
Share
More Decks by みずほリサーチ&テクノロジーズ株式会社 先端技術研究部
See All by みずほリサーチ&テクノロジーズ株式会社 先端技術研究部
AWS CDKでデータリストアの運用、どのように設計する?~Aurora・EFSの実践事例を紹介~/aws-cdk-data-restore-aurora-efs
mhrtech
6
1.4k
Azure Verified Moduleを触って分かった注目ポイント/azure-verified-module-begin
mhrtech
1
1.1k
BLEA v3.0.0の新しいベストプラクティスを取り入れた効率的なAWS CDK開発/jawsug_cdk16
mhrtech
3
670
あなたのアプリケーションをレガシーコードにしないための実践Pytest入門/pyconjp2024_pytest
mhrtech
6
3k
静的サイトのCI/CDでも侮るなかれ!Docs as Codeに沿ったセキュアな開発プロセスの実践/secure-docsascode-cicd-for-static-sites
mhrtech
14
2.9k
Kubernetes でワークフローを組むなら cdk8s-argoworkflow がよさそう!/ cdk8s-argoworkflow is great!
mhrtech
3
1.4k
IaCでセキュリティを強化しよう!~IAMが苦手な開発者でも簡単に権限を絞れる。そう、AWS CDKならね!~/secjaws32
mhrtech
5
2.8k
AWS Control Towerを2年弱運用して得たエッセンスと展望/securityjaws31
mhrtech
1
2k
そのリファレンス誰のため?ユーザ活用に向き合う/finjaws31
mhrtech
0
650
Other Decks in Technology
See All in Technology
終了の危機にあった15年続くWebサービスを全力で存続させる - phpcon2024
yositosi
3
3k
PHP ユーザのための OpenTelemetry 入門 / phpcon2024-opentelemetry
shin1x1
1
190
私なりのAIのご紹介 [2024年版]
qt_luigi
1
120
マルチプロダクト開発の現場でAWS Security Hubを1年以上運用して得た教訓
muziyoshiz
2
2.2k
WACATE2024冬セッション資料(ユーザビリティ)
scarletplover
0
190
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
130
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
220
Storage Browser for Amazon S3
miu_crescent
1
140
How to be an AWS Community Builder | 君もAWS Community Builderになろう!〜2024 冬 CB募集直前対策編?!〜
coosuke
PRO
2
2.8k
ハイテク休憩
sat
PRO
2
140
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
530
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
33
3k
Producing Creativity
orderedlist
PRO
341
39k
Docker and Python
trallard
42
3.1k
Designing Experiences People Love
moore
138
23k
Become a Pro
speakerdeck
PRO
26
5k
Statistics for Hackers
jakevdp
796
220k
GitHub's CSS Performance
jonrohan
1030
460k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
The Invisible Side of Design
smashingmag
298
50k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Transcript
AWS CDK にテストは必要? 試行錯誤したスクラム開発事例を紹介! 2023.5.20 AWS CDK Conference Japan 2023
Copyright (c) Mizuho Research & Technologies, Ltd. All Rights Reserved. (免責事項) 当資料は情報提供のみを目的として作成されたものであり、商品の勧誘を目的としたものではありません。 本資料は、当社が信頼できると判断した各種データに基づき作成されておりますが、その正確性、確実性を 保証するものではありません。また、本資料に記載された内容は予告なしに変更されることもあります。
自己紹介 氏名: 松尾 優成(まつお ゆうせい) 所属: 先端技術研究部 兼
プロジェクト推進部 主な役割: 社内共通 AWS プラットフォームの構築・運用 休日の過ごし方: 0歳児の娘と戯れる! ビッグバンドでサックス演奏 (5/21, 池袋ジャズフェス2023に出演予定!)
これまで主にやってきたこと 2015年~ 勘定系周辺の システム開発・保守 (管理・調整が主) 2019年~ CCoE 活動 予防的統制 (サービス認定)
2020年~ 大型 AWS 案件の 設計・構築 (N/W・Security等) 2022年~現在 社内プラットフォーム 構築 (Platform as a Product) スクラム開発・ CDK(TypeScript)と 初めてのことだらけ!
本日話すこと • スクラム開発の取組概要 • AWS CDK の単体テスト • CDK におけるテスト駆動開発(TDD)
• cdk-nag 導入 ※ドメインロジックに関するアプリケーションのテストは本発表の対象外
スクラム開発の概要
社内プラットフォーム 社内プラットフォームのプロダクト概要 “安心して AWS の有用性を発揮し、 ビジネス価値の創造に素早く着手・集中できるプラットフォームを提供” ※AWS Summit Tokyo 2023
では、プラットフォームの他社事例が沢山出ていました AWS account A Control Tower ユーザー関連 セキュリティ AWS account B AWS account C 事前に整備された AWS アカウントを払い出し Azure AD
CDK で作っているものを一部紹介 Security 関連の共通リソース • CIS ルール違反検知(メトリクスフィルタ・アラーム) • 通知設定(EventBridge・SNS)
• CIS 不要ルールの無効化(Custom Resource) • 違反リソースの自動修復(SSM Automation) ※ AFT(Account Factory for Terraform)や CfCT で構築するのが主流かも? プラットフォーム利用者向け静的サイト(WAF・CloudFront・S3 etc...)
開発体制・内部事情 2021年末頃から、スクラム開発で構築 (チーム全員がスクラム初心者で、殆どのメンバーがCDK・TypeScript 初挑戦) Dev メンバーは流動的で、入替・人数の増減が激しい(2~8人) 全
Dev メンバーは他業務と兼務で、1人あたり50%以下の工数を捻出 ※アンチパターンなので非推奨 プロダクトの足元整理などで、開発停止期間が相応にある CDK に触れるのは 貴重な楽しい時間!
開発初期から CDK テスト導入までの経緯
初期は、プロダクトコードのみを書いていたが・・・ プロダクトコードの検証では、デプロイ後の手動テストが主体 スプリントが空き、久しぶりにコードをみると思い出すのに時間がかかった コーディングしたメンバーが離任し、用途不明なコード・コメントが残留
そんな中、以下イベントに出会う
吉川さんの以下発表で、危機を感じる 単体テスト・ スナップショットテスト どちらも未実施…💦 https://winteryukky.github.io/slides-look-back-3rd-year-cdk
CDK ベストプラクティスで単体テストの話を思い出す https://aws.amazon.com/jp/blogs/news/best-practices-for-developing-cloud-applications-with-aws-cdk/
CDK に単体テスト導入を決意!
CDK ワークショップで復習し、ガイドや docs を読む https://cdkworkshop.com/ja/20-typescript/70-advanced- topics/100-construct-testing.html
CDK の単体テストは、一般的に以下 3 種 No. 名称 概要 1 スナップショットテスト CDK
で生成された CFn テンプレートの断面を保持し、 前回実行時との差分を確認する。 2 アサーションテスト CDK で生成された CFn テンプレートが想定通りの値か、 確認する。 3 バリデーションテスト Construct で、無効な入力値を受け取った際の挙動を確認する。 自作のカスタム Construct をチーム外へ 配布はすることは当分なさそうだし、 バリデーションテストは一旦見送る?
スナップショットテスト・アサーションテストを取り入れることに (余談)2023年5月現在、開発者ガイドや CDK 実践勉強会には、バリデーションテストの紹介なし https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/testing.html No. 名称 概要 1 スナップショットテスト
CDK で生成された CFn テンプレートの断面を保持し、 前回実行時との差分を確認する。 2 アサーションテスト CDK で生成された CFn テンプレートが想定通りの値か、 確認する。 3 バリデーションテスト Construct で、無効な入力値を受け取った際の挙動を確認する。
スナップショットテストを導入してみる
お手軽に CFn テンプレートの断面を保持できた! https://qiita.com/y_matsuo_/items/3c12e4d745dbfe56d4ea 共通部を除くと 実質これだけ スナップショットの中身は 概ね CFn テンプレート
スナップショットテストの気づき 特に有用だと感じたのは、他のテストが全くない状態のリファクタリング (L3 → L2 Construct に移行した際など、効果を実感) CDK
バージョンアップの変更点を確認しやすい (cdk diff は別途実行推奨) 一方、実装が設計通りかは確認できない
アサーションテストを導入してみる 事例が少なく、苦戦・・・
アサーションテストのコードを書くのに、CFn の知識が必要 社内研修で CFn を学べることもあり、CFn に慣れたメンバーが多かった とはいえ、ネストの深い CFn
テンプレートは珍しくなく、序盤は苦戦した
どの粒度でアサーションテストを書くか悩む 設計通りになっているか確認する 一般論に沿って、1 つのテストケースで 1 項目を確認する https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/ testing.html#testing_tips
失敗要因が明確(テスト名から何が失敗したか分かる) リソース単位で各ケースをまとめる方がテスト工数は少ない 一方、設計は見えづらくなるので、方針次第
ワークショップ・べスプラでは Construct テストのみ紹介 CDK のデプロイ単位はスタックが該当 → 当チームでは、スタックのテストも実施 https://d1.awsstatic.com/webinars/jp/pdf/services/ 20200303_BlackBelt_CDK.pdf#page=46
カスタム Construct の確認が単体テストなら スタックの確認は結合テストと言えるかも?
(余談) カスタム Construct とスタックのテストをどう分けるか テスト観点 (試行錯誤中・・・) カスタム Construct (リソースのパターンや入出力に着目)
リソース数 Interface による分岐・メンバ変数 各リソースの設定値 リソース間連携 etc... スタック (デプロイ単位であることに着目) スタック内の全リソース数 スタック固有リソースの設定値(命名規則など) Construct 間連携 セキュリティ関連 etc... https://d1.awsstatic.com/webinars/jp/pdf/services/ 20200303_BlackBelt_CDK.pdf#page=46 ※『リソース』は AWS CDK 標準 Construct を指す(L1~L3)
アサーションテストの気づき テストコードにドキュメントとしての価値あり リソース数のチェックで、設計外のリソースを認識できた (ハイレベル Construct が裏側で Lambda 関数を使っているパターンなど)
変更容易性が高まり、MVP を拡張するスクラムとの相性がよい • リグレッションテストが容易で、追加実装が楽になった • スタックの分離や統合をする際も、テストが大きな支えとなった
アサーションテストが不要だと感じるパターン PoC などの検証 L1 Construct を宣言的に記述(繰り返し処理なし・単純な分岐のみ) Step
Functions など複雑な連携・フローを確認したいとき (後続の別テストで確認) テストコードに慣れるまでは どうしても工数が膨らむ・・・
CDK アサーションテストの書き方を以下記事にまとめました https://qiita.com/y_matsuo_/items/bc27db7942179ffb5825
アサーションテストのカイゼン
プロダクトコード作成後にテストコードを書いていたが・・・ 設計書にない項目まで実装・テストしていた 設計の実装漏れがデプロイ後に発覚する(特にセキュリティ関連) テストコードの記述で消化試合感が否めない(モチベ・・・) スプリントの進捗がカツカツの場合、テストコードが後回しにされがち ⇒
レトロスペクティブで Dev メンバー共通の課題となっていた セキュリティ機能を提供する側が セキュリティの考慮漏れ・・・
テスト駆動開発(TDD)を導入する Red テストと最低限の プロダクトコードで TEST FAIL Green 素早くコードを 修正し TEST
PASS Refactor 重複除去など リファクタリング https://www.youtube.com/ watch?v=Q-FJ3XmFlT8 とても分かりやすい!
CDK における TDD の効果① 設計書作成後、すぐにテスト項目を洗い出すので、実装漏れがない → 設計にないことを過剰に実装・テストすることがなくなった(YAGNI) 要件 すり合わせ
設計書 作成 テスト ToDo 洗い出し 実装 例) 副次効果で精度向上
CDK における TDD の効果② 重複除去により、『動作するきれいなコード』に近づいた パターン化されている箇所が、カスタム Construct になっていった
スタック SNS Topic ① Events Rule ① SNS Topic ② Events Rule ② 重複箇所を Construct 化 スタック カスタム Construct SNS Topic Events Rule カスタム Construct ① カスタム Construct ②
CDK における TDD の効果③ ハイレベル Construct の特徴である抽象化をより活用するようになった 初めて使う L2
Construct だけど 要件満たせるかな? L2 Construct 問題なさそう! テスト以外の項目は L2 Construct の デフォルト値に任せよう! 設計中 TDD 実践中
CDK における TDD の悩みどころ CFn テンプレートの出力が見えていないと厳しい (初めて触る AWS サービスなどは特に時間がかかる)
ネストの深い CFn テンプレートのテストを先に書くのは難しい CFn テンプレートのサジェストがないのもきつい → 最初から完璧なテストコードを目指さない! CFn テンプレートを生成し、先に構成をみてしまうのも手
悩みどころは多いものの、 TDD は CDK のベストプラクティス https://docs.aws.amazon.com/prescriptive-guidance/latest/best-practices- cdk-typescript-iac/development-best-practices.html CFn に慣れているなら 試しやすいのでオススメかも?
デプロイ前チェックのカイゼン
CDK のテストは定着したが・・・ 当社ガイドラインでは、共通のセキュリティ・コンプラ要件がある そもそも設計から上記要件が抜け落ちていたら、デプロイ後まで気づけない CDK の単体テストでは、スタックまでしかチェックしていない ⇒最上位の
app レイヤーで、デプロイ資産を一括チェックしたい レトロスペクティブで 新たな取り組み目標ができた!
cdk-nag を導入する cdk-nag とは、セキュリティ・コンプライアンスチェックできるツール (詳細は、過去の CDK 支部資料をご参照!) デプロイ時に違反リソースがあれば、デプロイを停止してくれる
(cdk synth でも同様に違反を教えてくれる) 設計 実装 ビルド (cdk synth) デプロイ (cdk deploy) リリース 運用 cdk-nag
cdk-nag の気づき お手軽に試せる!一方、AWS Solutions ルールパックはリッチすぎ? 基本ルールから独自ルールパックを作成し、設計漏れを抑制できた (社内ルールで、cdk-nag の基本ルールにハマらないものもでてきた)
cdk-nag のカスタムルールを書くよりは、アサーションテストの方が楽そう (全社的にCDKを使っているわけではないので、 ルール化は気が重い ) → ルール外の細かいセキュリティ設定はアサーションテストで確認することに
CDK における各テストの比較 No. 種類 主な恩恵 導入速度 難易度 1 スナップショットテスト ・手軽に差分確認
・いつでも始められる 速 低 2 cdk-nag ・違反リソース未然防止 ・設計漏れ抑制 速 中 3 アサーションテスト (実装→テスト) ・変更容易性が高い ・高信頼ドキュメント 中 中 4 アサーションテスト (TDD) ・上記恩恵 + YAGNI ・動作するきれいなコード 遅 高
テストコードで体力をかけずに 素早く構成チェックしたい場合はどうする? CDK で細かいアサーションテストを 書くのは躊躇う・・・ (余談)※スクラム開発事例ではないです
単体テストで cdk-nag を使うのがよさそう! コーディングしながら、違反リソースに都度対応できる cdk-nag のテストコードは、殆ど固定&短くて楽 https://aws.amazon.com/jp/blogs/news/manage-application-security-and-compliance-with-the-aws-cloud- development-kit-and-cdk-nag/
プロダクトコードを保存する度に cdk-nag が自動実行! npm test -- --watch で、cdk-nag を実行した例
cdk-nag の単体テスト Tips を以下記事にまとめました https://qiita.com/y_matsuo_/items/6ef17964ff3c557f6d1e 単体テスト でcdk-nagを適用すれば アサーションテストとの重複チェックも抑えられそう
デプロイ後の確認はどうする? (スクラム開発事例に戻ります)
CDK デプロイ後の確認について セキュリティ関連の構築がメインだが、デプロイ後環境をどこまで確認? Config ルール(Control Tower 管理)でも設定不備を一部検知可
CFn ドリフトがなければアサーションテストの内容が担保されているはず 凝った自動テストは不要と判断し、手動テストを継続 IP 制限をしている静的サイトについては、CDK パイプラインで デプロイ後に curl 実行し、アクセス拒否されることを確認
CDK リソースチェックをまとめてみた 設計 実装 ビルド (cdk synth) デプロイ (cdk deploy)
リリース 運用 スナップショットテスト Control Tower Proactive Controls アサーションテスト (実装→テスト) cdk-nag (UT) アサーションテスト (TDD) Config ルール デプロイ後テスト cdk-nag
当チームで現在取り入れているのは太字箇所 設計 実装 ビルド (cdk synth) デプロイ (cdk deploy) リリース
運用 スナップショットテスト Control Tower Proactive Controls アサーションテスト (実装→テスト) cdk-nag (UT) アサーションテスト (TDD) Config ルール デプロイ後テスト cdk-nag
テスト関連で今後やりたいこと・気になっていること cdk-nag ルールパックのカイゼン カイゼンした cdk-nag ルールパックを単体テストに導入 Control
Tower Proactive Controls の検討 生成系 AI の活用
まとめ スナップショットテスト・cdk-nag は手軽に始められるのでオススメ CDK でアサーションテスト・TDD の導入は、ちょっと大変かも →とはいえ、スクラム開発に取り入れたら、テストがない世界には戻れない!
Pros & Cons を踏まえて、CDK のテスト導入を検討しよう