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
120
第140回 雲勉 今度こそ AWS CDK で構築してみたくなるようなCDK活用集
iret.kumoben
July 25, 2024
Tweet
Share
More Decks by iret.kumoben
See All by iret.kumoben
第170回 雲勉 Lyria が切り拓く音楽制作の未来
iret
1
22
第169回 雲勉 AWS WAF 構築 RTA
iret
0
32
第168回 雲勉 JITNAの使い方とハマったポイントについて語る回
iret
0
35
第167回 雲勉 エージェント開発を加速する Agent Development Kit 入門
iret
1
43
第166回 雲勉 コードを読んで理解する AWS Amplify Gen2 Backend
iret
0
43
第165回 雲勉 Google Agentspace について
iret
0
41
第164回 雲勉 Agent Development Kit と MCP Toolbox for Databases で MCP 連携してみた
iret
1
90
第163回 雲勉 CircleCIで複数リポジトリ間のパイプラインを連携する
iret
1
38
第162回 雲勉 比較して学ぶ AWS Amplify Gen 2
iret
0
55
Other Decks in Technology
See All in Technology
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
6.3k
Rubyの国のPerlMonger
anatofuz
3
730
風が吹けばWHOISが使えなくなる~なぜWHOIS・RDAPはサーバー証明書のメール認証に使えなくなったのか~
orangemorishita
15
5.7k
Jamf Connect ZTNAとMDMで実現! 金融ベンチャーにおける「デバイストラスト」実例と軌跡 / Kyash Device Trust
rela1470
1
200
僕たちが「開発しやすさ」を求め 模索し続けたアーキテクチャ #アーキテクチャ勉強会_findy
bengo4com
0
2.4k
ユーザー課題を愛し抜く――AI時代のPdM価値
kakehashi
PRO
1
120
アカデミーキャンプ 2025 SuuuuuuMMeR「燃えろ!!ロボコン」 / Academy Camp 2025 SuuuuuuMMeR "Burn the Spirit, Robocon!!" DAY 1
ks91
PRO
0
140
AIに頼りすぎない新人育成術
cuebic9bic
3
300
はじめての転職講座/The Guide of First Career Change
kwappa
0
340
ファッションコーディネートアプリ「WEAR」における、Vertex AI Vector Searchを利用したレコメンド機能の開発・運用で得られたノウハウの紹介
zozotech
PRO
0
280
ZOZOTOWNの大規模マーケティングメール配信を支えるアーキテクチャ
zozotech
PRO
0
290
全員が手を動かす組織へ - 生成AIが変えるTVerの開発現場 / everyone-codes-genai-transforms-tver-development
tohae
0
170
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
800
Why Our Code Smells
bkeepers
PRO
337
57k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
110
19k
Designing for humans not robots
tammielis
253
25k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
880
Making the Leap to Tech Lead
cromwellryan
134
9.5k
Fireside Chat
paigeccino
38
3.6k
Facilitating Awesome Meetings
lara
54
6.5k
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