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
第140回 雲勉 今度こそ AWS CDK で構築してみたくなるようなCDK活用集
Search
iret.kumoben
July 25, 2024
Technology
0
62
第140回 雲勉 今度こそ AWS CDK で構築してみたくなるようなCDK活用集
iret.kumoben
July 25, 2024
Tweet
Share
More Decks by iret.kumoben
See All by iret.kumoben
第146回 雲勉 BLEAを眺めてCDKの書き方について学ぶ
iret
1
42
第145回 雲勉 Amazon ECSでサービス間通信する方法を調べてみよう
iret
0
39
第144回 雲勉 Amazon Aurora Serverless v2の基礎とアーキの裏側を覗いてみる
iret
0
83
第143回 雲勉 [New Relic]インフラストラクチャ監視と気をつけたいポイント
iret
0
39
第142回 雲勉 AWS Backupの復元テストで自動化できること・できないこと
iret
0
83
第141回 雲勉 Amazon Inspectorによる脆弱性管理~ECR コンテナイメージ編~
iret
0
180
第2回 雲勉LT大会 パブリッククラウドのサーバレスサービスの違いを調べてみた
iret
0
24
第2回 雲勉LT大会 AWS Control Tower の「コントロール」って何? という謎から AWS Control Tower を知る
iret
0
23
第2回 雲勉LT大会 AWS/Google Cloud/Wasabi ストレージサービスを比較したい
iret
0
43
Other Decks in Technology
See All in Technology
マルチプロダクトな開発組織で 「開発生産性」に向き合うために試みたこと / Improving Multi-Product Dev Productivity
sugamasao
1
280
利きプロセススケジューラ
sat
PRO
5
2.7k
これまでの計測・開発・デプロイ方法全部見せます! / Findy ISUCON 2024-11-14
tohutohu
3
340
Terraform Stacks入門 #HashiTalks
msato
0
320
20241108_CS_LLMMT
shigashiyama
0
260
Windows Autopilot Deployment by OSD Guy
tamaiyutaro
0
380
Microsoft Intune アプリのトラブルシューティング
sophiakunii
1
430
音声×Copilot オンコパの世界
kasada
1
120
Microsoft MVPになる前、なってから/Fukuoka_Tech_Women_Community_1_baba
nina01
0
180
Exadata Database Service on Cloud@Customer セキュリティ、ネットワーク、および管理について
oracle4engineer
PRO
0
1.1k
Can We Measure Developer Productivity?
ewolff
1
120
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
320
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
693
190k
Designing the Hi-DPI Web
ddemaree
280
34k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
7
570
Visualization
eitanlees
145
15k
Designing Experiences People Love
moore
138
23k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Into the Great Unknown - MozCon
thekraken
32
1.5k
For a Future-Friendly Web
brad_frost
175
9.4k
A Philosophy of Restraint
colly
203
16k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Transcript
第140回 雲勉 今度こそ AWS CDK で 構築してみたくなるようなCDK活⽤集
講師⾃⼰紹介 2 ▪ 名前 佐藤 淳 • (所属) クラウドインテグレーション事業部 構築第4セクション
• (経歴) 2021年 アイレット 中途⼊社 • (アイレット歴) もうすぐ3年 • (趣味) 最近は、キャンプと登⼭
アジェンダ 3 ⾃⼰紹介 1. はじめに 2. AWS CDKとは 3. 実践①
CDKで環境構築 4. 実践② CDKでテスト実装 5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 6. 終わりに
1. はじめに 4
この資料の対象者 5 この資料では以下のような⽅が対象となります。 • AWS CDK で環境構築を実践したい⽅ • 複数環境をCDKで運営したい⽅ •
作成したリソースのテストについてお悩みの⽅ • 既にCloudFormationでリソースを構築しているが、AWS CDK への移 ⾏を検討されている⽅
2. AWS CDK とは 6
2. AWS CDK とは 7 AWS CDKとは ▪ AWS CDK(Cloud
Development Kit)とは、AWSが提供するAWSリソースをプロビジョ ニングするためのIaCツール。 ▪ TypeScriptやPythonなどの⾔語を利⽤して、プロビジョニングすることができる。 (この発表では全てTypeScriptで構築) ▪ CDKライブラリでは豊富なメソッド、クラスなどが利⽤可能。 ▪ コンストラクトを使⽤し、少ないコード量でリソースを作成することができる。 L1コンストラクト … CloudFormationのように1:1でリソースを定義 L2コンストラクト … 複数の関連するリソースを1:nでリソースを定義 L3コンストラクト … L2コンストラクトをより抽象化したもの
2. AWS CDK とは 8 Resource Resource App Stack Stack
Resource ▪ Application … CDK Appを呼び出し 複数Stackを定義可能 ▪ Stack … CloudFormation上でのデプロイ単位 ▪ Resource … AWSリソースを定義 CDKの構成
2. AWS CDK とは 9 CloudFormation , Terraform, AWS CDK
⽐較 CloudFormation ▪ スタックでの安全なリソース管理 ▪ AWS公式による参考⽂献が多い ▪ AWSのリソースに限定 Terraform ▪ マルチプロバイダー(NewRelic, CloudFlare, etc.. ) ▪ HashiCorp CloudなどHashiCorp社のサー ビスを利⽤可能 AWS CDK ▪ コードライクに複雑な条件分岐など を定義可能 ▪ L2, L3コンストラクトによる抽象化 ▪ マルチプロバイダー(CDK for Terraform)も可能
2. AWS CDK とは 10 もっと CDK を学ばれたい⽅向けへ ▪ CDK
ワークショップ … CDK 初学者向け。CDK についてハンズオン形式で学べる。 https://cdkworkshop.com/ja/ ▪ baseline-environment-on-aws(BLEA) … AWS公式が提唱するセキュアなベースラインを提供するCDK テンプレート集。テンプレートの書き⽅を学習されたい⽅向け。 https://github.com/aws-samples/baseline-environment-on-aws ▪ 外部コンストラクト … AWSコミュニティやサードパーティ製のコンストラクト などを利⽤したい⽅向け。 https://constructs.dev/ cdk-nagとか
3.実践① CDKで環境構築 11
3. 実践① CDKで環境構築 12 シナリオ ▪ 以下のような複数アカウントでリソースを管理するケース。 ▪ 環境差分はリソース名やインスタンスタイプなど。 本番環境
VPC Public subnet Public subnet Private subnet Private subnet example.com ACM マルチAZ ALB テスト環境 VPC Public subnet Public subnet Private subnet Private subnet testexample.com ACM シングルAZ ALB t3.micro インスタンスタイプ t3.medium db.t3.micro インスタンスタイプ db.t3.medium CDK 1台構成
3. 実践① CDKで環境構築 13 環境ごとに変数を定義 例) リソース名を本番環境は「prd」、テスト環境は「test」と定義 インスタンスタイプなどを環境ごとで定義したい 1. コンテキスト値を編集して環境ごとの値を定義する。
./cdk.json または./cdk.context.json 内のcontex句に 環境ごとの変数をにそれぞれ定義する(右記参照)
3. 実践① CDKで環境構築 14 環境ごとに変数を定義 2. ./lib/stack.ts にてスタックを実⾏するクラスにて contextで定義した変数を渡す。 右のようにStackPropsを継承したインターフェース型を定義。
if⽂などの条件分岐も、慣れ親しんだコードで記載可能。 → 複雑な条件分岐やマッピングなど、 CloudFormationでは難しい表現も可能。
3. 実践① CDKで環境構築 15 環境ごとに変数を定義 3. ./bin/stack.ts にてtryGetContext句を追加し、 環境変数を明⽰的に定義してスタックに変数を代⼊。 CDKデプロイコマンドにて
--contextフラグを オプションとして指定して実⾏することで、 指定した環境ごとにデプロイできる。 [実⾏コマンド] $ cdk deploy -- --context env_name=prd
4. 実践② CDKでテスト実装 16
4.実践② CDKでテスト実装 17 CDKのテストとは︖ CDK のテストでは、以下の2つの⽅法があります。 1. スナップショットテスト CloudFormation テンプレートに対して以前実⾏したテンプレートとの差分を照合してテストします。
TypescriptではJest、Pythonではpytestなど各コードでのフレームワークでテストを実施。 2. アサーションテスト CDKによって⽣成されたCloudFormationスタック上のリソースのプロパティが、特定の値であるかをテ ストします。 単体テストに相当する内容。 CDK ライブラリである aws-cdk-lib.assertions を使⽤してテスト。 他にも統合テスト⽤のモジュール「integ-tests」 もありますが、2024/07時点ではアルファ版であるため、今回は割愛。
4.実践② CDKでテスト実装 18 スナップショットテスト CloudFormation テンプレートに対して以前実⾏したテンプレートとの差分を照合してテストします。 Jestフレームワーク内のJestマッチャーである「toMatchSnapshot」ファイルを利⽤します。 テストファイルは./test/<テストファイル名>.test.ts として、以下のような内容を⼊⼒して保存します。 コマンドはnpm
testコマンドを実⾏ [実⾏コマンド] $ npm test
4.実践② CDKでテスト実装 19 補⾜ どのようにテストを実施しているのか テスト⽤のフレームワークはJestを使⽤する。 Jestの仕様により初回のテスト時、 ./test配下に __snapshot__フォルダが作成される。 .snapファイルの内容を確認すると、スタックの定義が出⼒。
.snapと.tsファイルで出⼒されるスタックとの差分を ⽐較しテストする。 AWS::EC2::Instanceの出力
4.実践② CDKでテスト実装 20 スナップショットテスト 結果 PASSと出⼒され、スナップショットとの差分なし。
4.実践② CDKでテスト実装 21 スナップショットテスト 結果 失敗ケース。Failと出⼒され、スナップショットとの差分が発⽣していることを確認。 スタックの更新でも発⽣するため、更新の際は $ npm test
-- -u でスナップショットを更新することで差 分を解消することができる。
4.実践② CDKでテスト実装 22 アサーションテスト CDKによって⽣成されたCloudFormationスタック上 のリソースのプロパティが、特定の値であるかを テストします。 テストファイルは ./test/<テストファイル名>.test.ts として、
以下のような内容を⼊⼒して保存します。
4.実践② CDKでテスト実装 23 アサーションテスト 結果 PASSと出⼒され、全てのケースで特定の値であったことを確認。
4.実践② CDKでテスト実装 24 アサーションテスト 結果 失敗ケース。Failと出⼒され、 失敗の原因が出⼒。
4.実践② CDKでテスト実装 25 Tips どのようにアサーションテストケースを作成するのか __snapshot__の内容を⾒て、テストケースを作成する。
4.実践② CDKでテスト実装 26 まとめ ▪ スナップショットテストで全てのリソースが直前のスタックからの変更はないかを確認できる。 ▪ アサーションテストを実施して対象のリソースのパラメータが該当する値に設定されていることを確認で きる。 ▪
簡単なスナップショットテストから初めてみる。
5. 実践③ cdk migrateコマンドで CDKプロジェクトに 移⾏してみる 27
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 28 cdk migrateコマンドで CDKプロジェクトに移⾏してみる ▪
既存のCloudFormationで作成されたプロジェクトを、既存のリソースに影響なくCDKに移⾏したい。 ▪ CloudFormationテンプレートから、CDK に移⾏したい。 ▪ TypeScriptなどのソースコード作成も簡略化したい。 ↓ CDK migrate コマンドによって 既存のスタックや⼿動で作成したリソースをCDKプロジェクトに移⾏
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 29 Case1. CloudFormationで作成したリソースをCDKプロジェクトに移⾏ ▪ 既存のCloudFormation
スタックからCDKプロジェクトに移⾏する場合(--from-stack) $ cdk migrate --stack-name <<スタック名>> --language typescript --from-stack 上記のコマンドだけで、CDKプロジェクトに移⾏することが可能。
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 30 Case1. CloudFormationで作成したリソースをCDKプロジェクトに移⾏ 実⾏結果 ▪
Cdk migrate コマンドを実⾏したフォルダに CDKプロジェクトが移⾏できた。 ▪ ソースコードも同様に⽣成されていた。 ▪ cdk deploy で既存Stackを更新できた。
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 31 Case2. CloudFormationのテンプレートからCDKプロジェクトを作成 ▪ 新しい環境で既存のCloudFormationテンプレートファイル
-> CDKプロジェクトの移⾏(--from-path)。 既にテンプレートファイル template.json がある場合、以下のコマンドを実⾏。 $ cdk migrate --stack-name <<スタック名>> --language typescript --from-path template.json
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 32 Case2. CloudFormationのテンプレートからCDKプロジェクトを作成 実⾏結果 ▪
Cdk migrate コマンドを実⾏したフォルダに CDKプロジェクトが移⾏できた。 ▪ ソースコードも同様に⽣成されていた。
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 33 Case3. ⼿動で作成したリソースをCDKプロジェクトに移⾏ ▪ CloudFormationスタック管理外のリソースもcdk
migrate コマンドで移⾏することができる(--from- scan) ▪ --from-scanではCloudFormation上のIaCジェネレータの最新のスキャンを参照してリソースを検索 ▪ Filter句を使⽤することで、特定のタグキー/値 のリソース群をCDKプロジェクトに移⾏することができる $ cdk migrate --stack-name <<スタック名>> --language typescript --from-scan --filter tag- key=<<タグキー>>
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 34 3. ⼿動で作成したリソースをCDKプロジェクトに移⾏ 実⾏結果 ▪
Cdk migrate コマンドを実⾏したフォルダに CDKプロジェクトが移⾏できた。 ▪ cdk deploy で新規Stackを作成できた。
5. 実践③ cdk migrateコマンドで CDKプロジェクトに移⾏してみる 35 Tips cdk migrate を実⾏する上での注意点
▪ 移⾏によって作成される全てのアプリケーションはL1コンストラクトとして⽣成される。 L2やL3コンストラクトとして出⼒はされない。移⾏後にL2/L3コンストラクトの定義はできる。 ▪ CloudFormationのネストスタックの移⾏はサポートされていない。 cdk import やaws-cdk-lib.NestedStackを駆使して移⾏できるかもしれないが、影響調査が⼤きい。 ▪ --from-scanオプションを付与して移⾏する際は、関連するリソースも含めてcdk migrate コマンドを 実⾏。 以下のようにAWS::EC2::Instanceリソースの場合VPC Idを参照できなくてエラーが発⽣。
36 まとめ ▪ cdk migrate コマンドで、様々なケースでもCDKの移⾏を実施することができることがわかった。 ▪ 最⼩の労⼒でCDKに移⾏することができる。 5. 実践③
cdk migrateコマンドで CDKプロジェクトに移⾏してみる
6. 終わりに 37
6. 終わりに 38 ▪ 複数環境の構築や複雑な条件分岐でも、慣れ親しんだコードで簡単に記載することができる。 ▪ 開発⾔語と同様のテストツールで単体テストを実⾏することができる。 ▪ cdk migration
コマンドを使⽤することで少ない⼯数で移⾏することができた。 ↓ CDKを利⽤して開発・移⾏することの敷居が下がりつつある。
ご清聴ありがとうございました。 39