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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Shota Kawasaki
February 01, 2026
1.5k
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
12
MCPって本当に不要? AWS MCP Serverで確かめる 新しい役割
kawaaaas
1
51
AIに書かせたCDK、動くだけで満足してませんか?今日から始める、CDKハーネス設計!
kawaaaas
3
1.1k
CloudFormationから理解するCDKのAwsCustomResourceの使用法
kawaaaas
1
70
CDKとは?からコントリビュートまで〜半年間のCDK学習振り返りとこれから〜
kawaaaas
1
150
アーキテクト・CDK・OSSを一気に学ぶ!L3 Construct実装のススメ
kawaaaas
0
110
おばけのアイコン可愛い、で終わらせない!KiroのSpec駆動開発に再入門
kawaaaas
0
85
初心者CDKコントリビューターによる、初心者CDKコントリビューターのためのJSII入門
kawaaaas
0
46
5分でわかって、明日からCDKを使いたくなる!個人的感動機能10選!
kawaaaas
1
380
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Mind Mapping
helmedeiros
1
400
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Crafting Experiences
bethany
1
390
Docker and Python
trallard
47
4.2k
Skip the Path - Find Your Career Trail
mkilby
1
260
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
560
A Soul's Torment
seathinner
8
3.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
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 は面白い。 これからももっと勉強していきます!