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
なぜ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
67
なぜconsole.logはTokenになるのか?もうハマらないためにTokenをちゃんと理解する
AWS CDKのTokenの仕組みを追っています。
Shota Kawasaki
February 01, 2026
Tweet
Share
More Decks by Shota Kawasaki
See All by Shota Kawasaki
初心者を卒業したい! CDKをちゃんと理解するためにAspectsを覗いてみる
kawaaaas
3
220
2026年はアウトプットに挑戦したい!
kawaaaas
0
6
3つのアーキテクチャで試す、IAM Policy Autopilot
kawaaaas
0
150
作って学ぶ!Kiro Powers
kawaaaas
0
120
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
174
15k
Paper Plane
katiecoart
PRO
0
46k
Test your architecture with Archunit
thirion
1
2.1k
Designing Powerful Visuals for Engaging Learning
tmiket
0
210
GitHub's CSS Performance
jonrohan
1032
470k
How to build a perfect <img>
jonoalderson
1
4.9k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
280
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Accessibility Awareness
sabderemane
0
45
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
310
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
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 は面白い。 これからももっと勉強していきます!