DynamoDB 有觸發器嗎?
有。DynamoDB 的觸發器由 DynamoDB Streams 加上 AWS Lambda 組成:流捕獲每一次項目級別的更改,而訂閱了這條流的 Lambda 函式會自動作為響應執行。沒有 CREATE TRIGGER 語句——觸發器程式碼活在 Lambda 裡,在資料庫之外。
觸發器是怎麼工作的
你在表上啟用 DynamoDB Streams,然後把流的 ARN 關聯到一個 Lambda 函式。每一次建立、更新和刪除都會被捕獲成一條流記錄;Lambda 服務每秒輪詢這條流四次,並用一批批新記錄同步呼叫你的函式。你也可以過濾事件,讓函式只為你關心的那些更改執行。
函式實際收到的是什麼
我們用 StreamViewType: NEW_AND_OLD_IMAGES 啟用了一條流,寫入一個訂單、改了它的狀態、再刪除它,然後用 GetRecords 把分片讀了回來。出來了三條記錄:INSERT、MODIFY、REMOVE。下面是中間那一條,原樣照錄:
{
"eventID": "77dabd57-20e1-4827-83e9-0fa20153adb0",
"eventName": "MODIFY",
"eventVersion": "1.1",
"eventSource": "aws:dynamodb",
"awsRegion": "ddblocal",
"dynamodb": {
"ApproximateCreationDateTime": 1785266820,
"Keys": {"pk": {"S": "ORDER#1"}},
"NewImage": {
"total": {"N": "42"},
"pk": {"S": "ORDER#1"},
"status": {"S": "SHIPPED"}
},
"OldImage": {
"total": {"N": "42"},
"pk": {"S": "ORDER#1"},
"status": {"S": "PENDING"}
},
"SequenceNumber": "000000000000000019180",
"SizeBytes": 67,
"StreamViewType": "NEW_AND_OLD_IMAGES"
}
}兩個映象都在記錄裡。PENDING 到 SHIPPED 這件事在函式內部就能回答,不用回頭去調錶。觸發器裡的一次 GetItem 既要花掉一次讀取,又要和下一次寫入賽跑,所以它可能交給你一個兩個映象都描述不了的第三種狀態。
檢視型別是在你啟用流時選定的,而已經寫下的記錄只攜帶它當時要求的內容。選 KEYS_ONLY 或 NEW_IMAGE,以後就沒有 OldImage 可以拿來做對比了。
Lambda 把這些同樣的記錄放在一個 Records 陣列裡交給你的函式,並加上一個 eventSourceARN 欄位。上面的 awsRegion 之所以讀作 ddblocal,是因為這次執行用的是 DynamoDB Local;針對線上服務時它攜帶的是區域。
觸發器都用來做什麼
經典用途包括:值發生變化時傳送通知、啟動工作流、維護聚合值和計數器,以及把每一次更改複製到持久儲存(比如 S3)以形成永久審計軌跡。如果函式出錯,Lambda 會重試這一批,直到成功或者記錄過期,重試與批次行為都可配置。
值得了解的限制
AWS 建議一條流最多訂閱兩個 Lambda 函式——再多可能導致讀取被限流。觸發器函式應當是短命的;重活要交給非同步工作流,而不是把長邏輯內聯跑在裡面。
深入了解
先從 DynamoDB Streams 指南入手瞭解流模型本身,用運算式構建器來編寫觸發器所響應的那些寫入,然後下載 DynoTable 來觀察餵給流的那些項目更改。
參考資料
- DynamoDB Streams and AWS Lambda triggers — Amazon DynamoDB Developer Guide
- Change data capture for DynamoDB Streams — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Using AWS Lambda with Amazon DynamoDB — AWS Lambda Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。
這條流記錄捕獲於 2026-07-28,環境為 DynamoDB Local 3.3.0、@aws-sdk/client-dynamodb 3.1095.0、Node v24.18.0,除縮排外未作任何編輯地照錄。