Slide 1

Slide 1 text

\ 積極採用中 / 全AWSアカウント×全CDKアプリで
 LegacyテンプレートをMigrationした話
 大越 雄太
 小笠原 寛明


Slide 2

Slide 2 text

\ 積極採用中 / 自己紹介
 ● 大越 雄太 (Yuta Okoshi) 
 ● Twitter: @cossy70461807 
 ● 2021年11月にjustincaseのSREチームにJOIN 
 ● 趣味:
 サバイバルゲーム
 チンチラのお世話
 2

Slide 3

Slide 3 text

\ 積極採用中 / 自己紹介
 ● 小笠原 寛明
 ● justInCase ソフトウェアエンジニア 
 ● 好きなAWSのサービス: CDK! 
 ● 👇のChrome拡張の作者です 😀
 3

Slide 4

Slide 4 text

\ 全職種採用中 / 4

Slide 5

Slide 5 text

\ 積極採用中 / 会社紹介
 日本初の商品を連発している保険会社です。 
 5

Slide 6

Slide 6 text

\ 積極採用中 / 会社紹介
 そのノウハウを元に保険SaaSを提供しています。 
 6 顧客 保険会社 * *事業会社や保険代理店 のご利用も可能 プラン選択 本人認証 告知・重要事項説明 会員資格確認 商品ページ(LP) & 申込フォーム 契約参照 異動・解約 決済 契約更新 お客様 ポータル 査定・承認 問合せ 提出書類の参照 (電子データ) 支払記録 保険金 請求フォーム

Slide 7

Slide 7 text

\ 積極採用中 / 会社紹介
 保険業務をSaaSでなめらかにし、みなさんがよい保険にアクセスしやすいようにして います。
 7

Slide 8

Slide 8 text

目次
 \ お話したい / 1. ことのはじまり
 2. その原因は。。。?
 3. LegacyとModernの共存について
 4. 学んだTips
 5. マイグレーションを終えて


Slide 9

Slide 9 text

\ あなたと一緒に働きたい! / ことのはじまり


Slide 10

Slide 10 text

\ 積極採用中 / ことのはじまり
 実は juseincaseはcdk v1.0.0発表前からキャッチアップをしており v0.33から利用を開始している超ヘビーユーザーです🥰

Slide 11

Slide 11 text

\ 積極採用中 / ことのはじまり
 v0.8.0 first public release of the AWS CDK! 2018/9 v1.18.0 AWS CDK for Java 一般公開! 2019/11 v1.0.0 一般公開! 2019/7 「AWS CDK」のキャッ チアップ開始 2019/2 cdk v0.33をKotlinから 動かすことに成功 2019/6 aws-cdk justincase v2.0.0 aws-cdk-lib is now stable! 2021/12 マイグレーション計画始動 2021/12

Slide 12

Slide 12 text

\ 積極採用中 / ことのはじまり
 当初、justincaseではKotlinユーザーが大半を締めており KotlinでCDKを書くために「AWS-CDK-Kotlin-DSL」を独自で開発! awesome-cdkのLanguage Supportでは一番上に!✌ https://github.com/kolomied/awesome-cdk 
 https://github.com/justincase-jp/AWS-CDK-Kotlin-DSL

Slide 13

Slide 13 text

\ 積極採用中 / ことのはじまり
 justincaseでも、cdk v1に対してみなさんと同じ辛さをとても強く感じていました ● ライブラリが個別なので、cdkリポジトリが大量にあるとバージョンアップが大変 ● Constructの抽象度が低く新規開発のたびに同じコードを書く羽目に

Slide 14

Slide 14 text

\ 積極採用中 / ことのはじまり
 cdk v2の発表を知った時、 justincaseのエンジニアは世界で1番幸せを感じていました!

Slide 15

Slide 15 text

\ 積極採用中 / ことのはじまり
 cdk v2も出てきたことだし 
 当社でもアップグレードを進めていきましょう! 
 古参メンバー

Slide 16

Slide 16 text

\ 積極採用中 / ことのはじまり
 さっそく
 機能開発のついでにv2化! 
 古参メンバー そして無事、リリースは完了!
 しかし.....?
 い い ね !

Slide 17

Slide 17 text

\ 積極採用中 / それ以外のcdkデプロイが
 失敗するようになってしまいました


Slide 18

Slide 18 text

\ あなたと一緒に働きたい! / 原因は。。。。?


Slide 19

Slide 19 text

\ 積極採用中 / 原因は?
 v2のためだけにbootstrapすると
 何もしていないv1はデプロイが
 エラーになる!!

Slide 20

Slide 20 text

\ 積極採用中 / cdkを利用するにはcdk bootstrapを行いCDKToolkitというスタックを
 利用するリージョンにデプロイする必要があります。
 そのCDKToolkitのテンプレートには
 modern templateとlegacy templateの2種類存在します。
 もともとはlegacy templateのみ存在していて後にmodern templateが登場しました。
 2022年4月現在はどちらも生成・利用が可能です。
 
 「DevelopersIO | CDK BootstrapのModern templateで何が変わるのか」 
 https://dev.classmethod.jp/articles/cdk-bootstrap-modern-template/ 
 
 オススメ!
 この問題を解決するために知っておくべきこと


Slide 21

Slide 21 text

\ 積極採用中 / この問題を解決するために知っておくべきこと
 「AWS Document | What is the AWS CDK?」より 
 https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/migrating-v2.html 
 
 cdk v1の初期ではlegacy templateしか利用できないので、 justincaseではlegacy templateでのデプロイが行われていました。 なお、cdk v1のデフォルト設定ではmodern templateを利用したデプロイはサポートしていません

Slide 22

Slide 22 text

\ 積極採用中 / この問題を解決するために知っておくべきこと
 また、cdk v2ではlegacy templateによるデプロイもサポートされていません。
 なので、cdk v2を利用するためにはmodern templateを利用する必要がありました。
 本文)
 CDK v2 requires that the environments you deploy into be boostrapped using the modern bootstrap stack. 
 the legacy bootstrap stack (the default under v1) is no longer supported. 
 意訳)
 CDK v2 では、デプロイする環境はmodern bootstrap stackを使用してbootstrapする必要があります。 
 legacy templateではCDK v2のデプロイがサポートされなくなりました。 
 
 「AWS Document | What is the AWS CDK?」より 
 https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/migrating-v2.html 
 


Slide 23

Slide 23 text

\ 積極採用中 / 原因は?
 v2のために
 bootstrapするだけではなく
 v1のmodern化対応が
 必要なことに気づかなかった


Slide 24

Slide 24 text

\ あなたと一緒に働きたい! / LegacyとModernの共存について


Slide 25

Slide 25 text

\ 積極採用中 / LegacyとModernの共存について
 結論から言うと
 LegacyとModernのCDKリポジトリを共存させることは可能です


Slide 26

Slide 26 text

\ 積極採用中 / LegacyとModernの共存について
 共存する方法
 cdk deploy前にModernとLegacyのCDKToolkitを作成しておき、
 deploy時にどのCDKToolkitを利用するのかをオプションで指定する方法があります
 以下ドキュメントで手順が指定方法が記載されています
 ● AWS Cloud Development Kit | Developer Guide > Customizing synthesis
 https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-custom-synth
 ● AWS CDK Reference | class DefaultStackSynthesizer 
 https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_core.DefaultStackSynthesizer.html


Slide 27

Slide 27 text

\ 積極採用中 / LegacyとModernの共存について
 共存のメリット・デメリット
 ● メリット
 ○ 既存のv1をほぼそのまま使える
 
 ● デメリット
 ○ リージョンごとにLegacyとModernの2つのCDKToolkitをデプロイする必要がある
 ○ cdkのオプションでわざわざ指定することが負担


Slide 28

Slide 28 text

\ 積極採用中 / LegacyとModernの共存について
 完全移行のメリット・デメリット
 ● デメリット、短期的に作業が大変
 ○ 利用するAWSアカウントとリージョンすべての環境でCDKToolkitをmodernへ変更する必要
 ○ CDK v1リポジトリすべてでmodernフラグを設定
 
 ● メリット
 ○ 長期的な作業はほぼなし!
 ○ AWSアカウント作成時のCDKToolkitのキッティングが楽に!
 ○ エンジニアがcdk deployするときに、余計なオプションを付けないで済む
 ○ 誤ってv1が使われることを防ぐことで、v2への移行を後押しできる


Slide 29

Slide 29 text

\ 積極採用中 / LegacyとModernの共存について
 これら理由や社内からのアップグレードの熱い希望もあり
 全AWS環境の完全移行の覚悟を決めました✌


Slide 30

Slide 30 text

\ あなたと一緒に働きたい! / マイグレーションを通して学んだTips


Slide 31

Slide 31 text

\ 積極採用中 / 1. cloudformation_includeの便利さについて
 2. bootstrapするときのtemplateのバージョンについて
 マイグレーションを通して学んだTips


Slide 32

Slide 32 text

\ あなたと一緒に働きたい! / cloudformation_includeの便利さについて


Slide 33

Slide 33 text

\ 積極採用中 / cloudformation_includeの便利さについて
 justincaseのKotlin CDKではmodern templateに対応していないv1.20~v1.64を利用。 
 Kotlin CDKをなんとかアップグレードするか、TypeScriptへの移行を行うか、とても悩みました。 


Slide 34

Slide 34 text

\ 積極採用中 / cloudformation_includeの便利さについて
 Kotlin CDKを利用しているリポジトリは4リポジトリ 
 リポジトリあたり500~1000行ぐらいのコード 😇


Slide 35

Slide 35 text

\ 積極採用中 / cloudformation_includeの便利さについて
 Kotlin CDKの更新は1.63でとまっているし 
 TypeScriptへ書き換えるだけでも 
 何百時間もかかってしまう。。。! 


Slide 36

Slide 36 text

\ 積極採用中 / cloudformation_includeの便利さについて
 そして!
 cloudformation_includeで管理する方法を思いつ きました!


Slide 37

Slide 37 text

\ 積極採用中 / cloudformation_includeの便利さについて
 既存スタックのcfnテンプレートをファイルとして管理。
 このソースコードのようにtemplate fileとして読み込めばCDKで利用することが可能になります
 
 https://docs.aws.amazon.com/cdk/api/v1/docs/cloudformation-include-readme.html 
 https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.cloudformation_include-readme.html 
 
 import * as cfn_inc from "@aws-cdk/cloudformation-include"; const template = new cfn_inc.CfnInclude(this, `${env}-amplify-app-xxxx-xxxx-xxxx-frontend`, { templateFile: `template/amplify-app-xxxx-xxxx-xxxx-frontend.yaml`, parameters: { "ENV": env }, });

Slide 38

Slide 38 text

\ 積極採用中 / cloudformation_includeの便利さについて
 例えば
 cfnを利用しているリポジトリや、 
 エンジニアが行方不明になり管理できなくなってしまったCDKリポジトリなど 
 cloudformation_includeを使えば簡単にダウンタイムなしで移行することができる! 
 
 環境ごとにパラメーターや設定値を 
 オーバライドすることも可能! 
 import * as cfn_inc from "@aws-cdk/cloudformation-include"; const template = new cfn_inc.CfnInclude(this, `${env}-amplify-app-xxxx-xxxx-xxxx-frontend`, { templateFile: `template/amplify-app-xxxx-xxxx-xxxx-frontend.yaml`, parameters: {"ENV": env}, }); const domain = template.getResource(`amplifyappxxxxxxxxfrontenddomain`) as amplify.CfnDomain; const amplifyApp = template.getResource(`amplifyappxxxxxxxxfrontend75681723`) as amplify.CfnApp; switch (env) { case 'demo': domain.domainName = `xxxxxxxx.${env}.justincase.jp`; break; case 'dev': domain.domainName = `xxxxxxxx.${env}.justincase.jp`; amplifyApp.autoBranchCreationConfig = {enablePullRequestPreview: true}; break; }

Slide 39

Slide 39 text

\ あなたと一緒に働きたい! / Bootstrapするときの
 templateバージョンについて


Slide 40

Slide 40 text

\ 積極採用中 / Bootstrapするときのtemplateバージョンについて
 - AWS CDK Reference | The bootstrapping template contract>Template historyより 
 - https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-contract 
 bootstrapを実行するCDK CLIのバージョンによって 
 展開されるmodern templateの内容が異なります! 


Slide 41

Slide 41 text

\ 積極採用中 / Bootstrapするときのtemplateバージョンについて
 v2で生成したcfnテンプレートには、modern templateのバージョンが6以上でないとエラーになるRuleが追加さ れています!
 (2022/04/06時点)
 追加されるRule:
 "Parameters": { "BootstrapVersion": { "Type": "AWS::SSM::Parameter::Value", "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" } }, "Rules": { "CheckBootstrapVersion": { "Assertions": [ { "Assert": { "Fn::Not": [ { "Fn::Contains": [["1","2","3","4","5"],{"Ref": "BootstrapVersion"}] } ] }, "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." } ] } }

Slide 42

Slide 42 text

\ 積極採用中 / Bootstrapするときのtemplateバージョンについて
 bootstrapする場合は
 CDK CLIのバージョンが最新かどうか確認してから実行することで、
 この問題を事前に回避することができます!


Slide 43

Slide 43 text

\ あなたと一緒に働きたい! / マイグレーションを終えて


Slide 44

Slide 44 text

\ 積極採用中 / マイグレーションを終えて
 CDKを使う人には最高の環境を作ることができました!✌
 bootstrapもすべてのAWSアカウントで実施済み!😆
 これからjustincaseに入る人はlegacyやmodernを気にせず開発に🎉🎉🎉


Slide 45

Slide 45 text

\ 全職種採用中 / WE ARE HIRING!!!

Slide 46

Slide 46 text

\ 積極採用中 / 興味はあるけど、という方へ
 技術情報、積極発信中!