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
70
第140回 雲勉 今度こそ AWS CDK で構築してみたくなるようなCDK活用集
iret.kumoben
July 25, 2024
Tweet
Share
More Decks by iret.kumoben
See All by iret.kumoben
第148回 雲勉 Web アプリケーションセキュリティ
iret
0
27
第147回 雲勉 Amazon CloudWatchをウォッチ!
iret
0
48
第146回 雲勉 BLEAを眺めてCDKの書き方について学ぶ
iret
1
51
第145回 雲勉 Amazon ECSでサービス間通信する方法を調べてみよう
iret
0
47
第144回 雲勉 Amazon Aurora Serverless v2の基礎とアーキの裏側を覗いてみる
iret
0
94
第143回 雲勉 [New Relic]インフラストラクチャ監視と気をつけたいポイント
iret
0
44
第142回 雲勉 AWS Backupの復元テストで自動化できること・できないこと
iret
0
110
第141回 雲勉 Amazon Inspectorによる脆弱性管理~ECR コンテナイメージ編~
iret
0
290
第2回 雲勉LT大会 パブリッククラウドのサーバレスサービスの違いを調べてみた
iret
0
26
Other Decks in Technology
See All in Technology
生成AIのガバナンスの全体像と現実解
fnifni
1
200
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
5
230
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
120
.NET 9 のパフォーマンス改善
nenonaninu
0
1.1k
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
プロダクト開発を加速させるためのQA文化の築き方 / How to build QA culture to accelerate product development
mii3king
1
270
C++26 エラー性動作
faithandbrave
2
800
APIとはなにか
mikanichinose
0
100
NW-JAWS #14 re:Invent 2024(予選落ち含)で 発表された推しアップデートについて
nagisa53
0
270
継続的にアウトカムを生み出し ビジネスにつなげる、 戦略と運営に対するタイミーのQUEST(探求)
zigorou
0
630
終了の危機にあった15年続くWebサービスを全力で存続させる - phpcon2024
yositosi
20
20k
小学3年生夏休みの自由研究「夏休みに Copilot で遊んでみた」
taichinakamura
0
170
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
65
11k
How to Ace a Technical Interview
jacobian
276
23k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
Documentation Writing (for coders)
carmenintech
66
4.5k
Become a Pro
speakerdeck
PRO
26
5k
Faster Mobile Websites
deanohume
305
30k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
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