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