Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
CDKをCloudFormationテンプレートとして 利用する際の注意点n選
Search
つくぼし
February 20, 2024
Technology
5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CDKをCloudFormationテンプレートとして 利用する際の注意点n選
つくぼし
February 20, 2024
More Decks by つくぼし
See All by つくぼし
AI駆動開発におけるハーネスエンジニアリングの勘所
tsukuboshi
1
930
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
720
[モダンアプリ勉強会]今更聞けないGit/GitHub入門
tsukuboshi
0
1.1k
世界の中心でApp Runnerを叫ぶ FINAL
tsukuboshi
0
580
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
2k
Mastraに入門してみた ~AWS CDKを添えて~
tsukuboshi
0
1.6k
Amazon Bedrock GenUハンズオン座学資料 #2 GenU環境でRAGを体験してみよう
tsukuboshi
0
960
Amazon Bedrock GenUハンズオン座学資料 #1 GenU環境で生成AIを体験してみよう
tsukuboshi
0
1.8k
AWSエンジニアに捧ぐLangChainの歩き方
tsukuboshi
5
2.6k
Other Decks in Technology
See All in Technology
Agent 活用環境の構築・運用のための AWS サービスのご紹介/agentcore-for-building-and-operating-agents
ren8k
1
310
Deep Data Security 機能解説
oracle4engineer
PRO
3
990
Patterns in AI Driven Software Development
akosma
PRO
0
430
仕様駆動開発の、その先へ。決める力と確かめる仕組み
inariku
1
160
GitHub、使う?使わない?
happysamurai294
0
140
「作れる」と「リリースできる」の間にあったもの── PdMを外して見えた、PdMがやるべき仕事/Buildable ≠ Shippable: What Removing the PM Taught Me About the PM’s Job
yappli_developers
0
420
Copilot Coworkで「みのるん式」やってみた
minorun365
PRO
1
650
Consistency for mere mortals - A gentle guide to consistency
ufried
0
110
渡米前の準備を制す!re:Invent 2026徹底準備術 / The Ultimate Preparation Guide for re:Invent 2026
yuj1osm
1
490
Vibe-to-Spec開発_実践ガイド
happysamurai294
0
140
デザインレビューは自動化できるのか?─ Flutter × Figma で UI 品質保証を考える
techiro
2
720
Flutter Webを「SDK」として配る — 50以上のゲームを支える埋め込みアーキテクチャ
masayukisuda
0
170
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Documentation Writing (for coders)
carmenintech
77
5.6k
30 Presentation Tips
portentint
PRO
1
450
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
240
A Soul's Torment
seathinner
8
3.9k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
660
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
520
How to Think Like a Performance Engineer
csswizardry
28
2.9k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Practical Orchestrator
shlominoach
192
12k
Transcript
CDKをCloudFormationテンプレートとして 利用する際の注意点n選 1 2024.2.21 JAWS-UG CDK支部 #12
2 自己紹介 ★ ハンドルネーム ◦ つくぼし ★ 所属 ◦ AWS事業本部コンサルティング部
◦ ソリューションアーキテクト ★ 最近ハマっているAWSサービス ◦ AWS Lambda ◦ AWS CDK ★ SNS/ブログ ◦ Twitter(@tsukuboshi0755) ◦ DevelopersIO(つくぼし)
3 本LTのきっかけ • 社内でTypeScriptを使用したアプリ開発チームに参加 • AWSリソースについて、TypeScriptと相性の良いCDKコード に移行したいという要望が挙がる • ただし諸事情により、一部のリソースをCFnテンプレートで もデプロイ可能にする必要があった
4 cdk synthで変換した後のCFnテンプレートは そのままでは使いにくい
5 今日話す事 1. CDK独自情報のトリミング 2. CFnパラメータの使用 3. 論理IDの上書き 4. 最後に
6 CDK独自情報のトリミング
7 cdk synthで出力したテンプレートには CFnだと通常使わない情報が含まれる
8 メタデータ(Metadata/CDKMetadata) # cdk synthでの出力テンプレート例 Resources: SampleRole: Type: AWS::IAM::Role #
(中略) Metadata: aws:cdk:path: sample-stack/IAMRole/Resource # (中略) CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:H4sIAAAAAAAA/1WPzWrDMBCEnyV3eWv7DYqgt9Jg917WkmyUSL tGPwlB+N2LbAztaT5mmVmmh67voLvgMzZK3xtnJyhjQnUXcqYrBvQmmSDwGX+ KRQ9lYGfqbddPJFyMvrKz6lXdf8YmcF1DJjIBipzpPSceFTpLi2Sa7ZIDJstUg6MJD6 vMJvSL0LOeoHzjdLzaYRMO/aQRykcmdcZO3oRynPXMwe+VIGeSOSb2g4mcQ20+ qea+clpz2nf8cSWTtkcdsTZwi2+PvoWuhfZyi9Y2IVOy3sBw6C+QtP6IPgEAAA== Metadata: aws:cdk:path: sample-stack/CDKMetadata/Default Condition: CDKMetadataAvailable Conditions: CDKMetadataAvailable: Fn::Or: - Fn::Or: - Fn::Equals: - Ref: AWS::Region - af-south-1 # 以下各リージョンの条件式が並ぶため省略 • デフォルトでは、各リソースに対する aws:cdk:pathのMetadata、及び CDKMetadataがテンプレートに付与さ れる • このメタデータを元にバージョンレポー トが生成され、CDK開発チームの改善 に使用されるとの事
9 メタデータのトリミング • 各リソースのMetadataは、cdk.jsonで pathMetadataをfalseにするか、cdk synthコマンドに--no-path-metadataを つけて削除 • CDKMetadataは、cdk.jsonで versionReportingをfalseにするか、cdk
synthコマンドに--no-version-reporting をつけて削除 # cdk.jsonの例 { "app": "npx ts-node --prefer-ts-exts bin/sample.ts", "watch": { "include": [ "**" ], "exclude": [ # (中略) }, "context": { # (中略) } "pathMetadata": false, "versionReporting": false }
10 ブートストラップバージョン(CheckBootstrapVersion) # cdk synthでの出力テンプレート例 Parameters: BootstrapVersion: Type: AWS::SSM::Parameter::Value<String> 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. • CDK v2では、ブートストラップスタック バージョンを検証するルールがテンプ レートに付与される • CheckBootstrapVersionは、SSMパラ メータのCDKブートストラップスタック バージョンが6未満の場合、エラーが出 力されるというルールになっている
11 ブートストラップバージョンのトリミング • bin配下のCDKアプリで、 DefaultStackSynthesizerの generateBootstrapVersionRuleをfalseに 変更すれば削除可能 • ちなみにStackSynthesizerとは、CDKの テンプレート生成方法やデプロイ方
法、差分確認方法、Asset格納場所を 定義するクラスとの事 # bin/sample.tsの例 import * as cdk from 'aws-cdk-lib'; import { CdkInterfaceStack } from '../lib/sample-stack'; const app = new cdk.App(); new CdkInterfaceStack(app, 'CdkInterfaceStack', { synthesizer: new cdk.DefaultStackSynthesizer({ generateBootstrapVersionRule: false }), });
12 CFnパラメータの使用
13 CFnパラメータはCDKパラメータとは別で 考える必要がある
14 CFnパラメーターの使用 • CFnParameterのdefaultオプションに対 して、cdk.jsonやconfig.tsで定義した変 数を渡す • ただしこのままだと、スタック作成時に パラメータ順序が論理IDのアルファ ベット順でソートされてしまう
# lib/sample-stack.tsの例 export class SampleStack extends cdk.Stack { constructor(scope: Construct, id: string, props: SampleStackProps) { super(scope, id, props); const sysName = new cdk.CfnParameter(this, "SysName", { type: "String", default: props.sysName, description: "System name for this stack.", }); const envName = new cdk.CfnParameter(this, "EnvName", { type: "String", default: props.envName, description: "Environment for this stack.", }); const appName = new cdk.CfnParameter(this, "AppName", { type: "String", default: props.appName, description: "Application for this stack.", }); # (中略) };
15 AWS::CloudFormation::Interfaceの使用 • stack.templateOptions.metadataに対し てAWS::CloudFormation::Interfaceを定 義し、想定する順番でパラメータを並 べ替える • paramGroups配列に対してaddTo ParamGroupsメソッドを使用し、ソートし
たい順番で変数のlogicalIdを各々指定 # lib/sample-stack.tsの例 export class SampleStack extends cdk.Stack { constructor(scope: Construct, id: string, props: SampleStackProps) { super(scope, id, props); private paramGroups: ParameterGroup[] = []; private addToParamGroups(label: string, ...param: string[]) { this.paramGroups.push({ Label: { default: label }, Parameters: param, }); } # (各パラメーターは省略) this.addToParamGroups( "Sample Configuration", sysName.logicalId, envName.logicalId, appName.logicalId, ); this.templateOptions.metadata = { "AWS::CloudFormation::Interface": { ParameterGroups: this.paramGroups, }, }; };
16 論理IDの上書き
17 コンストラクト別の論理ID生成 # cdk synthでの出力テンプレート例(L2コンストラクト使用) Resources: SampleRole6CE32B88: Type: AWS::IAM::Role #
(中略) SamplePolicyC8B10014: Type: AWS::IAM::ManagedPolicy Properties: # (中略) Roles: - Ref: SampleRole6CE32B88 • L1コンストラクトを使用すると、出力さ れるテンプレートの論理IDはコンストラ クト IDそのまま • L2/L3コンストラクトを使用すると、出力 されるテンプレートの論理IDは「コンス トラクト ID + ランダムなハッシュ値」とな る
18 論理IDがランダム生成される事による問題 • CFnで運用すると、コンソールから作成リソースを確認する 時に見た目が気になる • L1コンストラクトからL2コンストラクトにリファクタリングする 時に、論理IDを維持できず困る
19 論理IDの上書き • defaultChildを用いて、デフォルトの子 要素からL1コンストラクトを取得 • overrideLogicalIdメソッドを使用し強制 的に上書きする事で、出力後テンプ レートの論理IDを意図的に制御できる •
ただしやりすぎるとCDKのコード量が多 くなってしまうので注意 # lib/sample-stack.tsの例 export class SampleStack extends cdk.Stack { constructor(scope: Construct, id: string, props: SampleStackProps) { super(scope, id, props); const SampleRole = new iam.Role( this, "SampleRole", # (中略) }, ); const cfnSampleRole = accessRoleforAppRunner.node .defaultChild as iam.CfnRole; cfnSampleRole.overrideLogicalId("SampleRole"); };
20 最後に
21 まとめ • cdk synthで出力したテンプレートをCloudFormationとして運用するに は、いくつか考慮するべき点があるので注意 • 特に以下3点に気をつけると良さそう ◦ CDK独自情報のトリミング
◦ CFnパラメータの使用 ◦ 論理IDの上書き • CDKはCloudFormationの弱点をカバーできる便利な技術である
22 参考文献 • AWS CDKはじめてのアプリ - AWS CloudFormationテンプレートを合成 する •
AWS CDKツールキット (cdkコマンド) - 構成 (cdk.json) • ブートストラッピング - 合成のカスタマイズ • AWS CDKでAWS::CloudFormation::Interfaceを設定してみた • CDK L1 ConstructのリソースをL2 Constructにリファクタリングする
23
24 templateOptionsの使い道 • stack.templateOptions.templateFormat Versionを使用する事で、フォーマット バージョンを指定可能 • stack.templateOptions.descriptionを使 用する事で、テンプレートの説明を記 述可能
# lib/sample-stack.tsの例 export class SampleStack extends cdk.Stack { constructor(scope: Construct, id: string, props: SampleStackProps) { super(scope, id, props); this.templateOptions.templateFormatVersion = '2010-09-09'; this.templateOptions.description = 'This will appear in the AWS console'; };