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
なぜconsole.logはTokenになるのか?もうハマらないためにTokenをちゃんと理解する
Search
Shota Kawasaki
February 01, 2026
1.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
なぜconsole.logはTokenになるのか?もうハマらないためにTokenをちゃんと理解する
AWS CDKのTokenの仕組みを追っています。
Shota Kawasaki
February 01, 2026
More Decks by Shota Kawasaki
See All by Shota Kawasaki
MCPって本当に不要? AWS MCP Serverで確かめる 新しい役割
kawaaaas
1
20
AIに書かせたCDK、動くだけで満足してませんか?今日から始める、CDKハーネス設計!
kawaaaas
3
1k
CloudFormationから理解するCDKのAwsCustomResourceの使用法
kawaaaas
1
66
CDKとは?からコントリビュートまで〜半年間のCDK学習振り返りとこれから〜
kawaaaas
1
140
アーキテクト・CDK・OSSを一気に学ぶ!L3 Construct実装のススメ
kawaaaas
0
100
おばけのアイコン可愛い、で終わらせない!KiroのSpec駆動開発に再入門
kawaaaas
0
64
初心者CDKコントリビューターによる、初心者CDKコントリビューターのためのJSII入門
kawaaaas
0
42
5分でわかって、明日からCDKを使いたくなる!個人的感動機能10選!
kawaaaas
1
380
初心者を卒業したい! CDKをちゃんと理解するためにAspectsを覗いてみる
kawaaaas
3
340
Featured
See All Featured
Designing for Timeless Needs
cassininazir
1
480
The SEO identity crisis: Don't let AI make you average
varn
0
560
Discover your Explorer Soul
emna__ayadi
2
1.3k
The browser strikes back
jonoalderson
0
1.7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
From π to Pie charts
rasagy
1
370
Optimizing for Happiness
mojombo
378
71k
Unsuck your backbone
ammeep
672
58k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
240
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
Transcript
JAWS-UG 茨城 #11 CDK 支部コラボ回 2026/2/1 Shota Kawasaki なぜconsole.log はToken
になるのか? もうハマらないためにToken をちゃんと理解する
出身: 千葉県 所属: SIer 年次: 1 年目(CDK 利用歴半年) 好きなサービス: CDK,
Kiro : @kawaaaas Shota Kawasaki
CDK を学び始めて約半年、 難しいことがたくさんあります
CDK を学び始めて約半年、 難しいことがたくさんあります Stack 間の値の受け渡しが うまくいかなかったり...
CDK を学び始めて約半年、 難しいことがたくさんあります 循環参照に陥って、 deploy ができなかったり... Stack 間の値の受け渡しが うまくいかなかったり...
CDK を学び始めて約半年、 難しいことがたくさんあります リソースのID が変わって リソースが再作成されてしまったり... 循環参照に陥って、 deploy ができなかったり... Stack
間の値の受け渡しが うまくいかなかったり...
CDK を学び始めて約半年、 難しいことがたくさんあります リソースのID が変わって リソースが再作成されてしまったり... 循環参照に陥って、 deploy ができなかったり... Stack
間の値の受け渡しが うまくいかなかったり... 中でも頻繁にやってしまうことは...
つい、普通の開発と同様に 文字列比較したり、console 出力してしまいがち
何度も値の扱いでハマる全私に向けて Token について整理しました
console.log() ではバケット名がToken と出力される
console.log() ではバケット名がToken と出力される 本来であれば物理名を指定することは望ましく ないですが、説明の都合上指定しています
Token とは何か? コンストラクトの定義やスタックの合成時にわからない 値のプレースホルダー 実際のインフラストラクチャが作成されると、これらの 値はデプロイ時に実際の値に展開される (公式ドキュメントより) https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/tokens.html
cdk synth 時 cdk deploy 時 なぜToken が必要か Cfn テンプレート時点では
まだリソースが存在しない Cfn がリソースを作成して はじめてarn やID が確定 「まだ決まっていない値」をTypeScript として 扱うために、仮の値を埋め込んでおく必要がある。 これがToken
Construct Prepare Validate Synthesize CDK のアプリケーションライフサイクル CDK App Deploy Cfn
Construct Prepare Validate Synthesize CDK のアプリケーションライフサイクル CDK App Deploy Cfn
TypeScript コードのほとんどはConstruct フェーズで実行され、実際にToken が生成される 生成されたToken が解決され、 Cfn に展開される
物理名を指定してCfn に出力されていても、 TS 上ではToken として扱われる Construct
参照では「確定していない値」が渡される 入力値→ 指定したbucketName(physicalName) が渡される 参照値→ 指定したbucketName に関わらず、参照を渡す /packages/aws-cdk-lib/aws-s3/lib/bucket.ts Construct
ref ではToken クラスのメソッドを叩き、 トークンエンコーディングが行われる bucketName() がToken を返す仕組み /packages/aws-cdk-lib/aws-s3/lib/bucket.ts /packages/aws-cdk-lib/core/lib/cfn-element.ts Construct
Token クラスはStatic Methods を提供する ユーティリティクラス Construct Token.isUnresolved(bucketName) にてトークンであるかを検証する Token クラス
/packages/aws-cdk-lib/core/lib/token.ts トークンエンコーディング用メソッド
トークンエンコーディング IResolvable の可能性がある値を TS で扱えるようにプリミティブ型のToken にする技術 Construct Token.asString(value) →${TOKEN[Bucket.Name.1234]} Token.asNumber(value)
→-1.8881545897087626e+289 Token.asList(value) →["#{TOKEN[Stack.NotificationArns.1234]}"]
IResolvable インターフェイス 遅延評価される値を表現するためのインターフェース /packages/aws-cdk-lib/core/lib/resolvable.ts IResolvable な値は resolve メソッドを定義する Construct
トークンエンコーディング時にIResolvable な値は Map で保持され、synth 時に展開されることに よってCloudFormation に埋め込まれる TokenMap によるIResolvable な値の保持
/packages/aws-cdk-lib/core/lib/private/token-map.ts Construct
Synthesize CfnReference がresolve される /packages/aws-cdk-lib/core/lib/private/cfn-reference.ts Synthesize フェーズではTS がCfn に変換されるため、 検知されたToken
もTokenMap によってIResolvable な値が 取り出され、Cfn に解決される Intrinsic クラスを継承しており、Intrinsic クラスのresolve メソッドを実行する
Synthesize Intrinsic クラス packages/aws-cdk-lib/core/lib/private/intrinsic.ts Cfn テンプレートに最終的に出力される値を表す トークンの基底クラス 解決時にはすでに保持しているCfn 形式の値をそのまま出力する
結局、Token に対して文字列操作したい時はどうする? Fn 組み込み関数を利用する CloudFormation に埋め込まれ、deploy 時に解決される Fn.join(delimiter, values)→ 文字列を結合
Fn.split(delimiter, string)→ 文字列を分割 Fn.select(index, array)→ 配列から要素を選択 Fn.sub(template, variables)→ テンプレート文字列を置換
遅延処理を実現するLazy 指定した時点では決定させず、 synth 完了時に値を解決させるための機能 Lazy.string() で呼び出し時点では値が 未確定であるが最終的には確定する
Lazy の仕組み 内部ではトークンエンコーディングの仕組みが 用いられている Token.asString(value) にてIResolvable の 可能性がある値をTS のプリミティブ型にする
これでもうToken でハマることはない( はず) CDK は面白い。 これからももっと勉強していきます!