Slide 1

Slide 1 text

JSONataを使ってみよう Step Functionsが楽しく なる実践テクニック ふじい 製造ビジネステクノロジー部 スマートプロダクトチーム

Slide 2

Slide 2 text

2 ● 2020年9⽉ ⼊社 ○ サーバサイドエンジニアのお仕事 ● 2023年3⽉ 育児休業取得 ○ 育休⼀年取ってみた 〜4カ⽉⽬〜 ○ 育休⼀年取ってみた 〜13カ⽉⽬〜 ● 2024年5⽉ 育児休業から復帰 ● 2025年9⽉ ○ DevelopersIO 2025 Osaka 登壇なう ○ ⼊社してもう5年経ってる怖 部署 ● 製造ビジネステクノロジー部 近況 ● マリカーワールドで全キャラ、 全コスチューム解放完了! 資格: AWS 全部 All Cert: 2022, 2023, 2024, 2025 自己紹介 ふじい

Slide 3

Slide 3 text

今⽇話す内容について 3 ターゲット ● まだ JSONPath を使っている⼈ ● これから Step Functions を触ろうとしている⼈ ゴール ● Step Functions で JSONata を使ってみる

Slide 4

Slide 4 text

JSONata はいいぞ

Slide 5

Slide 5 text

【悲報】re:Growth 2024 OSAKAでJSONataについて話されていた 5 【朗報】使いまわせる https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/

Slide 6

Slide 6 text

6 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/

Slide 7

Slide 7 text

7 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/

Slide 8

Slide 8 text

8 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/

Slide 9

Slide 9 text

9 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/

Slide 10

Slide 10 text

10 https://dev.classmethod.jp/articles/re-growth-2024-osaka-jsonata/

Slide 11

Slide 11 text

JSONata で Fizz Buzz やってみた

Slide 12

Slide 12 text

1.各ステートで利⽤ 12 ステートマシンらしい⾒た⽬

Slide 13

Slide 13 text

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 %}" }

Slide 14

Slide 14 text

1. 各ステートで利⽤ 14 実⾏時間: 約26秒 状態遷移数: 2004

Slide 15

Slide 15 text

1. 各ステートで利⽤ 15 実⾏時間: 約26秒 状態遷移数: 2004

Slide 16

Slide 16 text

1. 各ステートで利⽤ 16 教訓 ループに気をつけよう (JSONata関係なく)

Slide 17

Slide 17 text

2. 1ステートで完結 17 これぞ JSONata ステートマシン 超シンプル

Slide 18

Slide 18 text

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) }) ※ダブルクオーテーションはエスケープ されるのでシングルクォーテーションの 使⽤をおすすめします。

Slide 19

Slide 19 text

2. 1ステートで完結 19 実⾏時間: 約0.1秒 状態遷移数: 3 めっちゃ速い! 課⾦も抑えられる!

Slide 20

Slide 20 text

JSONata にわくわくしてきました? ● プログラミング構造はチューリング完全 ● ループ処理を1ステート内で表現できれば、状態遷移数が節約できる ● Lambda でしていた処理を表現できれば、処理時間の短縮ができる => つまり 料⾦の削減、処理時間の削減 ができる ● AI に「⚪⚪の処理を JSONata で書いて」が通じる ● (あと書いててちょっと楽しい) 20

Slide 21

Slide 21 text

JSONata で⽇付操作やってみた

Slide 22

Slide 22 text

和暦変換 ● 22 https://dev.classmethod.jp/articles/step-functions-jsonata-japanese-era-date-conversion/

Slide 23

Slide 23 text

和暦変換 ($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

Slide 24

Slide 24 text

うるう年判定 24 $fromMillis( $toMillis( $states.input.year & "-02-28T00:00:00" ) + 60*60*24*1000, "[M1]" ) = "2"

Slide 25

Slide 25 text

JSONata で ⚪⚪ やってみた

Slide 26

Slide 26 text

DevelopersIO で JSONata タグの記事を⾒てね 26 https://dev.classmethod.jp/tags/jsonata/

Slide 27

Slide 27 text

注意点

Slide 28

Slide 28 text

テストがしにくい 28 CDK で Step Functions + Lambda の場合 ● Lambda 関数のコードに対して単体テストが書きやすい でも JSONata のテストとなると……

Slide 29

Slide 29 text

テストがしにくい 29 CDK で Step Functions で JSONata ステートのテストの場合 ● 変更するたびにデプロイして、マネコンでポチポチはつらい ● LocalStack は Step Functions の JSONata 対応済み ○ ※ 無料版に Step Functions が含まれている 🙌 ○ Lambda 関数のテスト環境構築するより⼿間 ● テストを記述しようとすると、AWS SDK で StartExecution API や TestState API を叩くテストになる(統合テスト)

Slide 30

Slide 30 text

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 とは結果が異なる ○ ブラウザのタイムゾーンが使⽤されるため

Slide 31

Slide 31 text

うるう年判定(再) 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

Slide 32

Slide 32 text

うるう年判定(再) 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 で動くとは限らない

Slide 33

Slide 33 text

まとめ

Slide 34

Slide 34 text

JSONata はいいぞ 34 使ってみよう ● JSON をクエリするだけでなく、計算や⽇付操作など処理ができる ● JSONata Exerciser で気軽に試せる ○ でも JSONata Exerciser で動いても、Step Functions で動かない パターンがある ○ JSONata を試す⽤のステートマシンを作っておくと便利

Slide 35

Slide 35 text

JSONata はいいぞ 35 でも効果的に使おう ● うまく使えば料⾦削減、実⾏時間削減できる ● テスタビリティが低いので使い所を⾒極めよう JSON の加⼯に徹する、変更の少ない箇所、 組み込み関数を有効活⽤しプログラミングを頑張らない ⾮ビジネスロジック、Lambda を使うほどでもない処理、 既存の JSONPath の Step Function は無理に移⾏しない、など ぜひ使ってみてください!

Slide 36

Slide 36 text

No content