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
JSONataを使ってみよう Step Functionsが楽しくなる実践テクニック #dev...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
dafujii
September 03, 2025
Programming
1.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JSONataを使ってみよう Step Functionsが楽しくなる実践テクニック #devio2025
DevelopersIO 2025 Osaka 登壇資料です。
dafujii
September 03, 2025
More Decks by dafujii
See All by dafujii
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
440
Software Design 定期購読のススメ
dafujii
1
4.9k
100均商品でスモールスタートを決めよう MixLeap Live LT #42 - 「デスク周りのDIY」
dafujii
0
1.2k
オフィスランチにこそ完全食
dafujii
0
2.6k
石油王よりもOSSコントリビュータを選んだ話
dafujii
0
780
チームサンドイッチマン ゼロカロリースキル #Alexaスキルアワード 2019
dafujii
1
160
Other Decks in Programming
See All in Programming
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
ChromeでローカルLLM
ryu1013
0
140
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
870
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
phperだってパンチカードでコーディングしたい
o0h
PRO
0
350
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
820
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
300
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
110
Jetpack Compose Mechanisms
skydoves
3
820
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
190
Featured
See All Featured
Accessibility Awareness
sabderemane
1
250
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
480
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
For a Future-Friendly Web
brad_frost
184
10k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
710
New Earth Scene 8
popppiees
4
2.7k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
Believing is Seeing
oripsolob
1
250
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
Transcript
JSONataを使ってみよう Step Functionsが楽しく なる実践テクニック ふじい 製造ビジネステクノロジー部 スマートプロダクトチーム
2 • 2020年9⽉ ⼊社 ◦ サーバサイドエンジニアのお仕事 • 2023年3⽉ 育児休業取得 ◦ 育休⼀年取ってみた 〜4カ⽉⽬〜
◦ 育休⼀年取ってみた 〜13カ⽉⽬〜 • 2024年5⽉ 育児休業から復帰 • 2025年9⽉ ◦ DevelopersIO 2025 Osaka 登壇なう ◦ ⼊社してもう5年経ってる怖 部署 • 製造ビジネステクノロジー部 近況 • マリカーワールドで全キャラ、 全コスチューム解放完了! 資格: AWS 全部 All Cert: 2022, 2023, 2024, 2025 自己紹介 ふじい
今⽇話す内容について 3 ターゲット • まだ JSONPath を使っている⼈ • これから Step
Functions を触ろうとしている⼈ ゴール • Step Functions で JSONata を使ってみる
JSONata はいいぞ
【悲報】re:Growth 2024 OSAKAでJSONataについて話されていた 5 【朗報】使いまわせる https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/
6 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/
7 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/
8 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/
9 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/
10 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/
JSONata で Fizz Buzz やってみた
1.各ステートで利⽤ 12 ステートマシンらしい⾒た⽬
1. 各ステートで利⽤ 13 "Items": "{% [1..1000] %}", "Choices": [ {
"Condition": "{% $states.input%15=0 %}", "Next": "15" },(略) ], "Default": "Default" "Output":{"output":"{% $states.input^(number).output %}"} "Output": { "number": "{% $states.input %}", "output": "{% $states.input %}" }
1. 各ステートで利⽤ 14 実⾏時間: 約26秒 状態遷移数: 2004
1. 各ステートで利⽤ 15 実⾏時間: 約26秒 状態遷移数: 2004
1. 各ステートで利⽤ 16 教訓 ループに気をつけよう (JSONata関係なく)
2. 1ステートで完結 17 これぞ JSONata ステートマシン 超シンプル
2. 1ステートで完結 18 { "output": "{% $map([1..1000], function($i) {\n $i
% 15 = 0 ? \"FizzBuzz\" :\n $i % 3 = 0 ? \"Fizz\" :\n $i % 5 = 0 ? \"Buzz\" :\n ($i)\n})\n %}" } $map([1..1000], function($i) { $i % 15 = 0 ? "FizzBuzz" : $i % 3 = 0 ? "Fizz" : $i % 5 = 0 ? "Buzz" : ($i) }) ※ダブルクオーテーションはエスケープ されるのでシングルクォーテーションの 使⽤をおすすめします。
2. 1ステートで完結 19 実⾏時間: 約0.1秒 状態遷移数: 3 めっちゃ速い! 課⾦も抑えられる!
JSONata にわくわくしてきました? • プログラミング構造はチューリング完全 • ループ処理を1ステート内で表現できれば、状態遷移数が節約できる • Lambda でしていた処理を表現できれば、処理時間の短縮ができる =>
つまり 料⾦の削減、処理時間の削減 ができる • AI に「⚪⚪の処理を JSONata で書いて」が通じる • (あと書いててちょっと楽しい) 20
JSONata で⽇付操作やってみた
和暦変換 • 22 https://dev.classmethod.jp/articles/step-functions-jsonata-japanese-era-date-conversion/
和暦変換 ($toWareki := function($year, $month, $day){( $eras := [ {"name":"令和","abbr":"R","start":{"year":2019,"month":5,"day":1}},
{"name":"平成","abbr":"H","start":{"year":1989,"month":1,"day":8}}, {"name":"昭和","abbr":"S","start":{"year":1926,"month":12,"day":25}}, {"name":"⼤正","abbr":"T","start":{"year":1912,"month":7,"day":30}}, {"name":"明治","abbr":"M","start":{"year":1868,"month":1,"day":25}}]; $compareDate := function($y1, $m1, $d1, $y2, $m2, $d2) { $y1 > $y2 ? 1 : $y1 < $y2 ? -1 : $m1 > $m2 ? 1 : $m1 < $m2 ? -1 : $d1 > $d2 ? 1 : $d1 < $d2 ? -1 : 0 }; $era := $eras[$compareDate($year, $month, $day, start.year, start.month, start.day) >= 0 ][0]; $era = null ? { "wareki": "不明", "warekiAbbr": "?", "year": $year } : ( $eraYear := $year - $era.start.year + 1; $displayYear := $eraYear = 1 ? "元" : $eraYear; { "wareki": $era.name & $displayYear & "年", "warekiAbbr": $era.abbr & $displayYear, "year": $year, "month": $month, "day": $day } ) )}; $toWareki($states.input.year, $states.input.month, $states.input.day);) 23
うるう年判定 24 $fromMillis( $toMillis( $states.input.year & "-02-28T00:00:00" ) + 60*60*24*1000,
"[M1]" ) = "2"
JSONata で ⚪⚪ やってみた
DevelopersIO で JSONata タグの記事を⾒てね 26 https://dev.classmethod.jp/tags/jsonata/
注意点
テストがしにくい 28 CDK で Step Functions + Lambda の場合 •
Lambda 関数のコードに対して単体テストが書きやすい でも JSONata のテストとなると……
テストがしにくい 29 CDK で Step Functions で JSONata ステートのテストの場合 •
変更するたびにデプロイして、マネコンでポチポチはつらい • LocalStack は Step Functions の JSONata 対応済み ◦ ※ 無料版に Step Functions が含まれている 🙌 ◦ Lambda 関数のテスト環境構築するより⼿間 • テストを記述しようとすると、AWS SDK で StartExecution API や TestState API を叩くテストになる(統合テスト)
Exerciser と Step Functions で挙動が異なる 30 $toMillis("2025-02-29") • JSONata Exerciser
は動く: 1677628800000 (3/1) • Step Functions だとエラーになる ◦ うるう年(2024-02-29)、うるう⽇以外(2023-02-28)なら成功 $toMillis("2025-02-29T00:00:00") • 時間まで記載すればStep Functions でエラーにならない • ただし JSONata Exerciser とは結果が異なる ◦ ブラウザのタイムゾーンが使⽤されるため
うるう年判定(再) 31 $fromMillis($toMillis("2023-02-29T00:00:00"), "[M1]") = "2" • 2/29 をタイムスタンプに変換して再度⽇付に変換し2⽉ならうるう年 •
JSONata Exerciser ならこれだけでいい • Step Functions だとなぜかタイムスタンプ変換後 2/28 になる $fromMillis($toMillis("2023-02-28T00:00:00")+60*60*24*1000,"[M1]")="2" • 2/28 の翌⽇が2⽉ならうるう年 • Step Functions で動かそうとするとこうする必要があった • JSONata Exerciser だとブラウザのタイムゾーンを使⽤するため常 true
うるう年判定(再) 32 Step Functions でも JSONata Execiser でも動かすには • $fromMillis($toMillis("2023-02-28T00:00:00Z")+60*60*24*1000,
"[M1]") = "2" • ⽇付だけではなく時分秒まで記述する • タイムゾーンが UTC であると Z を明記する • 2/29 ではなく、 2/28 + 1⽇をタイムスタンプに変換する • JSONata Exerciser で動いても Step Functions で動くとは限らない
まとめ
JSONata はいいぞ 34 使ってみよう • JSON をクエリするだけでなく、計算や⽇付操作など処理ができる • JSONata Exerciser
で気軽に試せる ◦ でも JSONata Exerciser で動いても、Step Functions で動かない パターンがある ◦ JSONata を試す⽤のステートマシンを作っておくと便利
JSONata はいいぞ 35 でも効果的に使おう • うまく使えば料⾦削減、実⾏時間削減できる • テスタビリティが低いので使い所を⾒極めよう JSON の加⼯に徹する、変更の少ない箇所、
組み込み関数を有効活⽤しプログラミングを頑張らない ⾮ビジネスロジック、Lambda を使うほどでもない処理、 既存の JSONPath の Step Function は無理に移⾏しない、など ぜひ使ってみてください!
None