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
DynamoDB Streams を Lambda のトリガーで使う話
Search
hmatsu47
PRO
March 29, 2023
Technology
0
1.1k
DynamoDB Streams を Lambda のトリガーで使う話
JAWS-UG 名古屋 推しの AWS サービスを語る LT 会 2023/03/29
hmatsu47
PRO
March 29, 2023
Tweet
Share
More Decks by hmatsu47
See All by hmatsu47
さいきんの MySQL との付き合い方 〜 MySQL 8.0 より後の世界へようこそ 〜
hmatsu47
PRO
0
12
ベクトルストア入門
hmatsu47
PRO
0
11
Aurora DSQL について
hmatsu47
PRO
0
9
DynamoDB Global Tables MRSC・pgvector 0.8.0・caching_sha2_password 関連アップデート
hmatsu47
PRO
0
10
10 年(+1 年)の振り返りと 2025 年の活動予定
hmatsu47
PRO
0
24
RDS/Aurora アップデート(2024 年版)
hmatsu47
PRO
0
30
Aurora DSQL と楽観的同時実行制御(OCC)
hmatsu47
PRO
0
43
Claude 3.5 で Haiku
hmatsu47
PRO
0
26
HeatWave on AWS の PrivateLink インバウンドレプリケーションで Aurora フェイルオーバーに追従する
hmatsu47
PRO
0
23
Other Decks in Technology
See All in Technology
目標と時間軸 〜ベイビーステップでケイパビリティを高めよう〜
kakehashi
PRO
8
760
株式会社Awarefy(アウェアファイ)会社説明資料 / Awarefy-Company-Deck
awarefy
3
11k
エンジニアリング価値を黒字化する バリューベース戦略を用いた 技術戦略策定の道のり
kzkmaeda
7
3.1k
AWSを活用したIoTにおけるセキュリティ対策のご紹介
kwskyk
0
410
Potential EM 制度を始めた理由、そして2年後にやめた理由 - EMConf JP 2025
hoyo
2
2.8k
Change Managerを活用して本番環境へのセキュアなGUIアクセスを統制する / Control Secure GUI Access to the Production Environment with Change Manager
yuj1osm
0
110
フォーイット_エンジニア向け会社紹介資料_Forit_Company_Profile.pdf
forit_tech
1
1.7k
Share my, our lessons from the road to re:Invent
naospon
0
150
事業を差別化する技術を生み出す技術
pyama86
2
380
20250304_赤煉瓦倉庫_DeepSeek_Deep_Dive
hiouchiy
2
110
EMConf JP 2025 懇親会LT / EMConf JP 2025 social gathering
sugamasao
2
200
1行のコードから社会課題の解決へ: EMの探究、事業・技術・組織を紡ぐ実践知 / EM Conf 2025
9ma3r
12
4.3k
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
570
Typedesign – Prime Four
hannesfritz
40
2.5k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Become a Pro
speakerdeck
PRO
26
5.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
Java REST API Framework Comparison - PWX 2021
mraible
29
8.4k
Transcript
DynamoDB Streams を Lambda のトリガーで使う話 JAWS-UG 名古屋 推しの AWS サービスを語る
LT 会 2023/3/29 まつひさ(hmatsu47)
自己紹介…は時間省略のためスキップ 松久裕保(@hmatsu47) • https://qiita.com/hmatsu47 2
本日のネタは • RDS / Aurora 3
本日のネタは 4 • RDS / Aurora
本日のネタは • RDS / Aurora ではなく DynamoDB + Lambda •
データ登録用の DynamoDB テーブルでストリームを設定 • それをトリガーに Lambda を実行させる話 ◦ 元テーブルのデータを加工して別テーブルにコピーする ◦ Lambda で何らかの非同期 API を呼び出す ▪ 「中身が見えるキュー」としての使い方 5
どういうときに使う? • 違う設計の参照用テーブルを(複数)用意したいケース ◦ インデックスの数が多すぎる ▪ GSI は 20 個まで、LSI
は 5 個まで ◦ 後から LSI を追加したくなった ◦ 参照用テーブルに必要なパーティションキーまたはソートキーが 非正規形で、テーブルごとに値の組み合わせを変えたい ▪ 例)テーブル A では登録日+ユーザー ID、テーブル B では ユーザー ID + 商品 ID をパーティションキーにしたい 6
どういうときに使う? • 「中身が見えるキュー」として使いたいケース ◦ アプリケーションの実装者がキューの扱いに慣れていない ▪ キューの中身が見えないと不安 ◦ 中身を確認後「キューの一部だけ選んで Lambda
再発火」したい ▪ レコードを変更して保存すれば再びストリームに流れる ◦ ベストプラクティスは別にあるとしても、使う人に合わせた技術 (処理方法)選定があっても良いのでは? 7
使用例(1/2) • blastengine API でメール送信 ◦ 送信用テーブルに挿入・変更すると、 ◦ Streams をトリガーに
Lambda を起動 ▪ blastengine API にリクエストし、 ▪ 成功したら送信履歴テーブルに記録 • 送信用テーブルのレコードは削除 ▪ 失敗したら時間をあけてリトライ • レートリミット対策 ◦ バウンス処理部分の図示・説明は省略 8 ↑ ここ (ストリーム)
使用例(2/2) • Qiita 記事はこちら ◦ https://qiita.com/hmatsu47/items/e6e8fc9290eede7c8a55 ◦ API コールを失敗したレコードだけが送信用テーブルに残る ▪
必要があれば対象レコードの変更で Lambda 再発火 ◦ 送信履歴テーブルはバウンス(Webhook で取得)と突合する ▪ ここでは説明を省略 9
実行例(送信用テーブルに挿入) 10
実行例(送信用テーブル : API コール失敗レコードが残る) 11
実行例(送信履歴テーブル : API コール成功レコードのみ) 12
実行例(実際に届いたメール) 13
トリガーの設定例(1/3) 14 挿入・更新・削除レコードを 最大 100 件ずつまとめて Lambda に渡す 挿入・更新・削除レコードを まとめるために待機する秒数
トリガーの設定例(2/3) 15 Lambda 関数の実行がエラー になったときの再試行回数 (デフォルトは -1: 無制限) チェックするとエラー再試行時 にレコード行数を半分に分割
トリガーの設定例(3/3) 16 同一シャードから 同時に呼び出される Lambda は 1 つ 挿入・更新時のみ Lambdaを呼び出す
注意点(1/2) • 1 テーブルで複数ストリームが流れる ◦ シャード単位でストリームが分かれるので、挿入・更新・削除の 順序が完全に保証されるわけではない ▪ 1 シャード
複数パーティション・1 パーティション複数シャードの両方あり ◦ 一方で、ストリームごとの Lambda の処理時間が長すぎると処理 が詰まってしまう ▪ Step Functions を呼び出す形を検討 17
注意点(2/2) • デフォルトでは Lambda のトリガー再試行は無制限 ◦ 処理途中に捕捉し損ねたエラー・例外があると課金死の危険が ▪ エラー・例外の捕捉漏れが無いようにする ▪
再試行の回数を限定しておいたほうが良い 18
まとめ • DynamoDB の制約に引っ掛かる場合に使える ◦ インデックスが多すぎる or LSI を追加したいけどできない •
「中身が見えるキュー」として使える ◦ 中身を見た上で選択的に Lambda を再発火させることも • ストリームの順序と無限再試行に注意 ◦ 順序の保証が必要な場合は使わない ◦ 再試行の回数を限定して課金死を防ぐ 19