Slide 1

Slide 1 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. AWS CDKで学ぶGoFデザインパターン 〜IaCにもコード設計〜 後藤 健太 (k.goto) 2 0 2 3 . 0 6 . 2 2 - 2 3 A W S D E V D A Y 2 0 2 3 T O K Y O B - 1

Slide 2

Slide 2 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⾃⼰紹介 • 後藤 健太 (k.goto) § テックリード § AWS Community Builder (DevTools) § 365歩のテック (技術ブログ) § ⾃作AWSツールのOSS開発 § AWS CDK コントリビューター § Twitter: @365_step_tech – k.goto(365歩のテック)

Slide 3

Slide 3 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. アジェンダ • GoFデザインパターンとは • 本セッションの⽬的と注意 • GoFデザインパターン × AWS CDK実例集 • まとめ

Slide 4

Slide 4 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターンとは

Slide 5

Slide 5 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターンとは • オブジェクト指向におけるコード設計のデザインパターン § 書籍『オブジェクト指向における再利⽤のためのデザインパターン』 (※) – 通称『GoF本』 – GoF(Gang of Four) = この共著者の4⼈ – 全23パターン • 古くからあるが、AWS Cloud Development Kit (AWS CDK) の 内部実装にも⼀部⽤いられている ※『オブジェクト指向における再利⽤のためのデザインパターン』 (ソフトバンクパブリッシング) 著: エーリヒ・ガンマ、ラルフ・ジョンソン、リチャード・ヘルム、ジョン・ブリシディース 監訳: 本位⽥真⼀, 吉⽥和樹

Slide 6

Slide 6 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. 本セッションの⽬的と注意

Slide 7

Slide 7 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. 本セッションの⽬的 • AWS CDKを通してGoFデザインパターンを学ぶ • AWS CDKコードを効率的にする ※もちろんCDKコードの効率性に繋がる点もたくさんありますが、あくまで 本セッションではそれらを推奨・⽬的とするものではありません。 AWSユーザに馴染み深いAWS CDKを通して GoFデザインパターンを学ぼう︕

Slide 8

Slide 8 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. 注意 • 本来のGoFデザインパターンと表現が多少異なる場合があります。 § CDKコードにうまく適⽤するため • CDKコードを書く上で、通常と⽐べて冗⻑になる場合があります。 § GoFデザインパターンを適⽤・説明しやすくするため

Slide 9

Slide 9 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集

Slide 10

Slide 10 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩

Slide 11

Slide 11 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン

Slide 12

Slide 12 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン • ⽊構造を伴う再起的なデータ構造を利⽤した⼿法 § 容器と中⾝を同⼀視することで再起的な構造の⾛査が可能に

Slide 13

Slide 13 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン 【CDKでのシチュエーション】 § 特定のリソース群に対して⼀元的にパラメータ設定などの操作を適⽤したい 【使⽤例】 § AWS CDKの特徴であるリソースのツリー構造を利⽤して、 特定のコンストラクト内の全リソース、またはスタック内のすべてのリソースに 対して⼀括で「RemovalPolicy」パラメータを指定する

Slide 14

Slide 14 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン 【CDKクラス図】

Slide 15

Slide 15 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン 【CDKクラス図 簡略版】

Slide 16

Slide 16 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン 【⽐較】

Slide 17

Slide 17 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン 【コード例】

Slide 18

Slide 18 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ①Compositeパターン 【コード例】 →ResourceならRemovalPolicy適⽤ →Constructなら、さらにその⼦供達に対して同メソッドを再起呼び出し ※applyRemovalPolicy: Resourceに定義されたRemovalPolicy適⽤メソッド ※RetainConstruct: Retainにしたいリソースを集めた⾃作Construct

Slide 19

Slide 19 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩

Slide 20

Slide 20 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ②Facadeパターン

Slide 21

Slide 21 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ②Facadeパターン • 複数のクラス群を組み合わせて⾏う複雑な⼿順を、⼀つの窓⼝を 設けることで、それを呼び出すだけで簡単に⾏えるようにする⼿法

Slide 22

Slide 22 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ②Facadeパターン 【CDKでのシチュエーション】 § 複雑なリソース構築をうまくまとめてシンプルに呼び出したい 【使⽤例】 § Constructを作成してその中に⼀連のリソース定義をまとめて定義し、 Stackからはそれを呼び出すだけでシンプルなリソース構築を⾏う

Slide 23

Slide 23 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ②Facadeパターン 【CDKクラス図】

Slide 24

Slide 24 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ②Facadeパターン 【⽐較】

Slide 25

Slide 25 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ②Facadeパターン 【コード例】 Facade≒Constructみたいなもの ① ① ② ③ ② ③

Slide 26

Slide 26 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩

Slide 27

Slide 27 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン

Slide 28

Slide 28 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン • 既存のクラスに⼿を加えられない時に、そのクラスを変更すること なく機能拡張をするための⼿法 § ライブラリの拡張など後⽅互換性を損ないたくないケースで有効

Slide 29

Slide 29 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン • 継承でなく委譲(コンポジションを利⽤した技法)する形も可 § AdapterがAdapteeをプロパティとして持ち、Adapterのメソッド内部でAdapteeの メソッドを呼び出す • 本セッション例ではCDKとの相性の理由で継承を使⽤しているが、 本来は継承より委譲の⽅が望ましい § “クラス継承よりもオブジェクトコンポジションを多⽤すること” – GoF本 第1章『概論』より

Slide 30

Slide 30 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン 【CDKでのシチュエーション】 § CDK提供のリソース定義(BucketやQueue等)に、新たなメソッドを追加したい 【使⽤例】 § あるリソースに複数のリソースポリシーを⼀度の呼び出しで⼀気に付けたいが、 単⼀ポリシーを付けるメソッド(addToResourcePolicy)しか⽤意されていない § そこで、それらのリソースクラスを拡張する新たなクラスを作り、そのクラスに ⾃作のメソッド(addManyToResourcePolicy)を定義する

Slide 31

Slide 31 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン 【CDKクラス図】

Slide 32

Slide 32 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン 【⽐較】

Slide 33

Slide 33 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン 【コード例】 ※Bucketをextendsしているので、⾃⾝(this)が addToResourcePolicyメソッドを持っている →それをループで回すことで⼀気にポリシーをアタッチするように⾒せる ① ② ① ②

Slide 34

Slide 34 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ③Adapterパターン 【コード例】

Slide 35

Slide 35 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩

Slide 36

Slide 36 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン

Slide 37

Slide 37 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン • 基となるオブジェクトに動的に飾りつけを重ねていき、柔軟に機能の 拡張を⾏うための⼿法 § オブジェクトをラップすることで、飾りつけ(機能追加)が可能に

Slide 38

Slide 38 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン 【CDKでのシチュエーション】 § リソースを作成するときに、あらかじめ特定の設定が適⽤されたものが 作られるようにしたい 【使⽤例】 § リソースを作成する際にいちいちapplyRemovalPolicyメソッドを呼び出さずに RemovalPolicyが適⽤できるようなラップクラスを定義する

Slide 39

Slide 39 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン 【CDKクラス図】

Slide 40

Slide 40 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン 【CDKクラス図 簡略版】

Slide 41

Slide 41 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン 【⽐較】

Slide 42

Slide 42 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン 【コード例】 ※若⼲無理やりパターンを実現をしています constructor内で、サブクラスのgetOwnRemovalPolicyでRETAIN|DESTROYを呼び、 それを⾃⾝のapplyRemovalPolicyに渡している。 これによってnewと同時にRemovalPolicyの適⽤ができるようになる。 ① ② ③ ① ② ③

Slide 43

Slide 43 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ④Decoratorパターン 【コード例】

Slide 44

Slide 44 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④Decoratorパターン ⑤ ⑥ ⑦ ⑧ ⑨ ⑩

Slide 45

Slide 45 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン

Slide 46

Slide 46 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン • あるクラスのコンストラクタが、何度呼び出されても⼀つしか インスタンスが作成されないことを保証する⼿法 § ⼀度作られたインスタンスを使い回す ※今はあまり推奨されていないパターン

Slide 47

Slide 47 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン 【CDKでのシチュエーション】 § あるスタック内で何度呼び出されても作られるリソースは⼀つであって欲しい – Custom ResourceのハンドラーとしてLambda関数を使う場合など 【使⽤例】 § CDK提供のSingletonFunctionクラスを使う ※CDK提供のSingletonFunctionは、挙動はいわゆるSingletonパターンと同じ ですが内部の実装がCDK⾊強いため、今回は⾃前のSingleton実装を出します。 ※参考: 『AWS CDK コンストラクトライブラリ開発に関する5つのTips』 https://tmokmss.hatenablog.com/entry/20220517/1652755027

Slide 48

Slide 48 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン 【CDKクラス図】

Slide 49

Slide 49 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン 【⽐較】

Slide 50

Slide 50 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン 【コード例】 constructorがprivateなのでクラス内部からしか呼び出せない ① ①

Slide 51

Slide 51 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン 【コード例】

Slide 52

Slide 52 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑤Singletonパターン https://github.com/aws/aws-cdk/blob/a2c633f1e698249496f11338312ab42bd7b1e4f0/packages/aws-cdk-lib/aws-lambda/lib/singleton-lambda.ts 【参考: SingletonFunctionコード】

Slide 53

Slide 53 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④Decoratorパターン ⑤Singletonパターン ⑥ ⑦ ⑧ ⑨ ⑩

Slide 54

Slide 54 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン

Slide 55

Slide 55 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン • クライアントと独⽴してアルゴリズムを定義し、かつクライアントが 意識せず動的に振る舞いを変更可能にする⼿法 § 戦略(アルゴリズム)/型(クラス)ごとの分岐処理いらず

Slide 56

Slide 56 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン 【CDKでのシチュエーション】 【使⽤例】 § CDKで提供されるValidation機能の内部実装において使⽤されている

Slide 57

Slide 57 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン 【addValidation / IValidation】 ※https://docs.aws.amazon.com/cdk/api/v2/docs/constructs.Node.html#addwbrvalidationvalidation addValidationによりバリデーションルール(IValidation)を登録し、 cdk synth時にvalidationメソッドが発⽕しバリデーションが⾛る

Slide 58

Slide 58 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン 【addValidation / IValidation】 ※https://docs.aws.amazon.com/cdk/api/v2/docs/constructs.IValidation.html validate()というメソッドを 実装すれば良い

Slide 59

Slide 59 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン 【CDKクラス図】

Slide 60

Slide 60 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン 【CDKクラス図 簡略版】

Slide 61

Slide 61 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン 【⽐較】

Slide 62

Slide 62 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン 【コード例】 ① ① addValidationにより登録されたバリデーション処理 (validationメソッド)がcdk synth時に発⽕する

Slide 63

Slide 63 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑥Strategyパターン https://github.com/aws/constructs/blob/10.x/src/construct.ts 【validateコード】 IValidationというinterfaceであればvalidate()を持っているので _validationsの各要素が何の実クラスなのか気にしなくて良い。 validate()の中⾝がどんな処理かも知らずに実⾏できる。 = ポリモーフィズム

Slide 64

Slide 64 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④Decoratorパターン ⑤Singletonパターン ⑥Strategyパターン ⑦ ⑧ ⑨ ⑩

Slide 65

Slide 65 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑦Template Methodパターン

Slide 66

Slide 66 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑦Template Methodパターン • 処理の⼤枠の⼿順を組んでおき、各ステップの具体的な内容は サブクラスで実装する⼿法

Slide 67

Slide 67 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑦Template Methodパターン 【CDKでのシチュエーション】 § Validation機能(⑥Strategyパターン参照)において、各環境(dev | prod)ごとで バリデーションの内容を変えたい 【使⽤例】 § IValidationを実装するValidatorを抽象クラスとし、 そこでバリデーションロジックの⼤枠を組む § それを継承するdev | prod⽤サブクラスを作成し、上記⼤枠の中の 各ステップでのロジックをそれぞれのサブクラスごとで組む

Slide 68

Slide 68 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑦Template Methodパターン 【CDKクラス図】

Slide 69

Slide 69 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑦Template Methodパターン 【⽐較】

Slide 70

Slide 70 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑦Template Methodパターン 【コード例】 ① ① ② ② ③ ③

Slide 71

Slide 71 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑦Template Methodパターン 【コード例】

Slide 72

Slide 72 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④Decoratorパターン ⑤Singletonパターン ⑥Strategyパターン ⑦Template Methodパターン ⑧ ⑨ ⑩

Slide 73

Slide 73 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑧Factory Methodパターン

Slide 74

Slide 74 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑧Factory Methodパターン • 操作の中でオブジェクト⽣成部分は抽象的に定義しておき、実際に どのクラスをインスタンス化するかはサブクラスが決める⼿法

Slide 75

Slide 75 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑧Factory Methodパターン 【CDKでのシチュエーション】 § あるリソースを⽣成する際に、あらかじめ特定の設定が適⽤されたものが 作られるようにしたい – ④Decoratorパターン章とほぼ同じシチュエーション – Decoratorでは「どのリソースも」、こちらは「あるリソースを」 【使⽤例】 § あるリソースの⽣成処理だけ抽象的に定義しておき、それによって⽣成された オブジェクトに対して特定の設定(RemovalPolicy)を適⽤する処理を定義する § 抽象定義した⽣成部分は、サブクラスで実装する

Slide 76

Slide 76 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑧Factory Methodパターン 【CDKクラス図】

Slide 77

Slide 77 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑧Factory Methodパターン 【⽐較】

Slide 78

Slide 78 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑧Factory Methodパターン 【コード例】 ① ① ② ② ③ ③ 何が作られるかはサブクラス次第だが、作られるものはResource型である。 Resource型はapplyRemovalPolicyを持つので、作られるものが何だろうと実⾏できる

Slide 79

Slide 79 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑧Factory Methodパターン 【コード例】

Slide 80

Slide 80 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④Decoratorパターン ⑤Singletonパターン ⑥Strategyパターン ⑦Template Methodパターン ⑧Factory Methodパターン ⑨ ⑩

Slide 81

Slide 81 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン

Slide 82

Slide 82 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン • 特定の組み合わせのオブジェクト群を⽣成するためのインターフェー ス(受け⼝)を提供する⼿法

Slide 83

Slide 83 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン 【CDKでのシチュエーション】 § 環境ごとでコンポーネントの組み合わせの違う、環境特有のセットを作りたい 【使⽤例】 § 細かいコンポーネント(App群, Batch群, WAF等)を各Constructで定義する § Dev | Prodでそれぞれ使⽤するコンポーネント(Construct)の組み合わせを さらにConstructとして定義し、環境ごとに個別で構築できるようにする – 例︓Devはアプリだけでいいが、Prodは管理⽤バッチやWAFなどもつけたい

Slide 84

Slide 84 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン 【CDKクラス図】

Slide 85

Slide 85 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン 【CDKクラス図 簡略版】

Slide 86

Slide 86 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン 【⽐較】

Slide 87

Slide 87 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン 【コード例】 ① ② ③ ③ ① ②

Slide 88

Slide 88 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン 【コード例】 ④ ⑤ ⑥ ⑥ ④ ⑤ AppModule, BatchModule, WafModuleはそれぞれConstruct。 例︓AppModuleにはLambdaがn個、BatchにはLambdaが1個、WAFにはWAFやIPSetなど・・・ ※ProductBもほぼ同様コード

Slide 89

Slide 89 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑨Abstract Factoryパターン 【コード例】 これを呼んでconfigを作り、Stack呼び出しで渡す これだけで、dev | prdで違うセットのリソースが作れ、 条件分岐の数も最⼩(余計な分岐が出てこない) さらにパラメータも違うものが作れる(以下参照)

Slide 90

Slide 90 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④Decoratorパターン ⑤Singletonパターン ⑥Strategyパターン ⑦Template Methodパターン ⑧Factory Methodパターン ⑨Abstract Factoryパターン ⑩

Slide 91

Slide 91 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン

Slide 92

Slide 92 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン • データ構造から操作を分離することで、既存のオブジェクトに対する 新しい操作をデータ構造に変更を加えずに追加できる⼿法

Slide 93

Slide 93 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン 【CDKでのシチュエーション】 【使⽤例】 § “Aspects employ the visitor pattern.”(※) § スコープ内の全ての要素に操作の適⽤・検証する機能 – コンプライアンス・セキュリティのガードレールなどのために使われることが多い ※https://docs.aws.amazon.com/cdk/v2/guide/aspects.html

Slide 94

Slide 94 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン 【CDKクラス図】

Slide 95

Slide 95 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン 【CDKクラス図 簡略版】

Slide 96

Slide 96 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン 【⽐較】

Slide 97

Slide 97 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン 【コード例】 ① ① データ構造と操作を分離することが Visitorパターンの本質 データ構造: ResourceやConstruct 構造に対する操作: Aspect(visit)

Slide 98

Slide 98 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン 【コード例】 ② ③ ② ③ ※これはただのAspectsの使い⽅ (Visitorパターンにあまり関係ない) 例︓Bucketを定義したスタック(③)に対してAspectを当てる

Slide 99

Slide 99 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン https://github.com/aws/aws-cdk/blob/a2c633f1e698249496f11338312ab42bd7b1e4f0/packages/aws-cdk-lib/core/lib/aspect.ts 【参考: Aspectsコード】 ④ ④

Slide 100

Slide 100 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. ⑩Visitorパターン 【参考: synthesizeコード】 https://github.com/aws/aws-cdk/blob/a2c633f1e698249496f11338312ab42bd7b1e4f0/packages/aws-cdk-lib/core/lib/private/synthesis.ts データ構造に対して⾛査し 分離して定義した操作を当てる =Visitorパターンの本質 再起呼び出し (データ構造の⾛査) visit(操作) Aspectsを取得 してループ

Slide 101

Slide 101 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. • ※補⾜︓よく使われるVisitorパターンのセオリー(以下例)とは細かい実装⽅法が異なる § ①構造⾃体(CDKで⾔うconstruct) がacceptというメソッドを持つ § ②visitor側がデータ構造の各サブクラスごとの型の引数のメソッドを全て⽤意 § ③acceptメソッドの引数でvisitorを渡し、その中でvisitor.visit(this)呼び出し – ⾃分⾃⾝を渡すことで(動的に)メソッド/型の選択を⾏うダブルディスパッチ § ④ObjectStructure(構造保持オブジェクト)により構造を⾛査 (これはデータ構造の種類が限られている前提であり、CDKの様に構造の種類が膨⼤・かつ可変なケースでは現実的に難しい。 そのためCDK(Aspects)ではダブルディスパッチでなく抽象を受け取るvisitメソッドでinstanceofでの分岐が必要になる) ⑩Visitorパターン ② ① ③

Slide 102

Slide 102 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. GoFデザインパターン × AWS CDK実例集 ①Compositeパターン ②Facadeパターン ③Adapterパターン ④Decoratorパターン ⑤Singletonパターン ⑥Strategyパターン ⑦Template Methodパターン ⑧Factory Methodパターン ⑨Abstract Factoryパターン ⑩Visitorパターン

Slide 103

Slide 103 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. まとめ

Slide 104

Slide 104 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. まとめ • GoFデザインパターン × AWS CDKの実例紹介 § 10パターン / 全23パターン • 本セッションの⽬的 § AWS CDKを通してGoFデザインパターンを学ぶ § AWS CDKコードを効率的にする AWSユーザに馴染み深いAWS CDKを通して GoFデザインパターンを学ぼう︕

Slide 105

Slide 105 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. 参考︓ GitHub(参考コード・クラス図) • 本セッションで挙げたCDKコード実例・クラス図など全てGitHubにて 公開しています。 – https://github.com/go-to-k/cdk-gof-design-pattern

Slide 106

Slide 106 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. 宣伝︓⾃作AWSツールOSS • delstack: AWS CloudFormationスタック強制削除ツール – https://go-to-k.hatenablog.com/entry/delstack • cls3: S3バケット⾼速削除・空にするツール(バージョニング対応) – https://go-to-k.hatenablog.com/entry/cls3 • lamver: Lambdaランタイム/バージョン検索ツール(リージョン横断) – https://go-to-k.hatenablog.com/entry/lamver

Slide 107

Slide 107 text

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. Thank you! © 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved. 後藤 健太 Twitter: @365_step_tech