CDKのコードレビューを楽にするパッケージcdk-mentorを作ってみた/cdk-mentor
by
tomoki10
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
CDKのコードレビューを楽にするパッケージ cdk-mentorを作ってみた 2025/01/17 製造ビジネステクノロジー部 佐藤智樹
Slide 2
Slide 2 text
CDKのコードレビューって何やってます? 参考のため是⾮ポストしてください!! #cm_cdk_special 2
Slide 3
Slide 3 text
● 佐藤智樹 ● 製造ビジネステクノロジー部 ● アーキテクトチーム ● JAWS-UG CDK⽀部 運営 ● 好きなもの:孤独のグルメ ● 好きなAWSサービス↓ ⾃⼰紹介 3 @tmk2154 @tomoki10 @tomoki10 Lambda CDK
Slide 4
Slide 4 text
● CDKのコードレビュー ○ インフラ設定 ○ セキュリティ設定 ○ CDK/CloudFormationの構造 ● cdk-mentorの紹介 ○ 機能紹介 ○ デモ ● 実装の中⾝を紹介 ○ CDKのAspectsとは ○ cdk-mentorの機能 ⽬次 4
Slide 5
Slide 5 text
ライフサイクルの早い段階でバグなどを取り除くことで、影響を最⼩限に抑える ただレビューは結構⼤変なのでなるべく静的コード解析に任せたい コードレビューの重要性 5 https://gihyo.jp/dev/serial/01/code_dev_cycle/0001
Slide 6
Slide 6 text
● インフラ設計(機能⾯、⾮機能⾯) ○ インフラの構成が問題ないか ■ ⼈⼿でレビュー (今ならAIレビュー?) ○ パラメータの設定が社内ルールなどに準拠しているか ■ Aspectsを使ったテスト(Fine-grained Assertions Test)で対応可能 ● セキュリティ設計 ○ AWSのセキュリティ基準や社内ルールなどに準拠しているか ■ ⼈⼿でのレビュー ■ cdk-nagを使ったリソース全体の⾃動チェック(要⼿動での除外設定) ■ デプロイ後のSecurity Hubなどによる指摘修正 CDKのコードレビューの要素 6
Slide 7
Slide 7 text
● CDK/CloudFormationの構造に関わる部分のレビュー ○ クロススタック参照/ネストスタック参照などを利⽤していないか ■ ネイティブの参照機能(strong stack reference)を使っていないか ■ 注意点を理解しているか ○ Construct IDがPascalCaseになっているか ○ Construct IDにConstructやStackなどの名前が含まれないか ■ 物理リソース名が冗⻑にならないようチェック ○ カスタムリソースを使っていないか ■ 内部でカスタムリソースを使うような実装になっていないか CDKのコードレビューの要素 7
Slide 8
Slide 8 text
参考情報 8 https://dev.classmethod.jp/articles/aws-cdk-props-cross-stack-referen ce-problem-and-handle/ https://dev.classmethod.jp/articles/best-way-to-name-aws-cdk-construct -id/
Slide 9
Slide 9 text
● CDK/CloudFormationの構造に関わる部分のレビュー ○ クロススタック参照/ネストスタック参照などを利⽤していないか ■ ネイティブの参照機能(strict stack reference)を使っていないか ■ 注意点を理解しているか ○ Construct IDがPascal Caseになっているか ○ Construct IDにConstructやStackなどの名前が含まれないか ■ 物理リソース名が冗⻑にならないようチェック ○ カスタムリソースを使っていないか ■ 内部でカスタムリソースを使うような実装になっていないか CDKのコードレビューの要素 9
Slide 10
Slide 10 text
https://github.com/tomoki10/cdk-mentor cdk-mentor 10
Slide 11
Slide 11 text
デモ 11
Slide 12
Slide 12 text
デモ動画 12
Slide 13
Slide 13 text
例えばスコープを左のStackにすれば、 左のStack配下のConstructに同じ操作を ⾏うことが可能。 以下のコード場合は、Appがスコープ ● CDKのAspectsとは ○ 特定のスコープ(StackやAppなど)のConstructに対して、共通の操作を⾏える機能 中⾝の紹介の前におさらい 13 https://aws.amazon.com/jp/blogs/aws/boost-your-infrastructure-with-cdk/
Slide 14
Slide 14 text
CloudFormation経由でデプロイされるまでに4つのフェーズがあり PrepareのフェーズでAspectsのvisitが実⾏される CDKでリソースがデプロイされるまでの流れ 14 https://aws.amazon.com/jp/blogs/devops/align-with-best-practices-while-creating-infrastructure-using-cdk-aspects/
Slide 15
Slide 15 text
cdk-nag:Aspectsを利⽤して、CDKが⽣成したAWSリソース⽤の オブジェクトを精査しセキュリティ基準に合うのかチェックする Aspectsの主な利⽤例 15 https://github.com/cdklabs/cdk-nag
Slide 16
Slide 16 text
cdk.IAspects インターフェースからクラスを実装してvisitを実⾏ cdk-mentorの実装⽅法 16 CloudFormationテンプレートにaws:cdk:pathとして出⼒される NodeのPath構造からConstruct IDを抽出
Slide 17
Slide 17 text
Constructに指定するIDがPascalCaseでなければエラーとする cdk-mentorの機能(Construct IDがPascalCaseかチェック) 17
Slide 18
Slide 18 text
Constructに指定するIDにConstruct|Stackという⽂字を⼊れない cdk-mentorの機能(Construct IDにConstruct|Stackを⼊れない) 18
Slide 19
Slide 19 text
未然に事故を防ぐため、CDKがデフォルトで提供するprops渡しのクロスス タック参照(※strong stack reference)を使った場合に警告を出す cdk-mentorの機能(クロススタック参照で警告) 19 ※参考:https://github.com/aws/aws-cdk/pull/22008
Slide 20
Slide 20 text
内部実装はTypeScriptですが、jssiによる変換でPythonでも使えます cdk-mentorの機能(python対応) 20 appファイル stackファイル
Slide 21
Slide 21 text
● CDKのL2/L3が⽣成するConstructIDがPascalCase出ない場合もある ○ APIGateway(v1/v2) ○ VPC(ElasticIP, InternetGateway, SecurityGroupIngress/Egress) ○ Cognito(Role) ○ AppConfig etc… おまけ:実装で苦労した(している)点 21 …
Slide 22
Slide 22 text
おまけ:実装で苦労した(している)点 22 ● 対処⽅法 ○ GAしている全L2 ConstructをSynthできるコードを書いて検査 ■ Readmeのサンプルレベルのリソースを⽣成して確認 ○ AWSリソースやパスのprefix、特定のAWSリソースで特定の名前の場合は除外 ● おまけ情報 ○ 現状AWSリソースでL2がGAしてるのは⼤体80~90ぐらいっぽい https://github.com/tomoki10/cdk-mentor/blob/main/src/excluded-resource-types.ts
Slide 23
Slide 23 text
出来そうなこと(未検証) ● 特定のAWSリソースで、特定の命名規則を適⽤する ○ ex: DynamoDBのテーブル名はUPPER_SNAKE_CASEとする ○ ex: DynamoDBのGSI名はUPPER_SNAKE_CASEとする ● L2Constructがある場合、L1 Constructの利⽤でアラートを出す ● コスト最適化のため、特定のインスタンスタイプを推奨 ● バックアップ設定の確認 ● 特定サービスの組み合わせを強制(LambdaにDLQを設定) 考えられる今後の拡張 23
Slide 24
Slide 24 text
No content