本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
搭配 DynamoDB 事件來源使用事件篩選
您可以使用事件篩選來控制 Lambda 將哪些記錄從串流或佇列中傳送至函數。如需事件篩選運作方式的一般資訊,請參閱控制 Lambda 將哪些事件傳送至您的函數。
本節重點介紹 DynamoDB 事件來源的事件篩選。
DynamoDB 事件
假設您有一個包含主索引鍵 CustomerName
和屬性 AccountManager
與 PaymentTerms
的 DynamoDB 表格。以下顯示 DynamoDB 表格串流中的範例記錄。
{ "eventID": "1", "eventVersion": "1.0", "dynamodb": { "ApproximateCreationDateTime": "1678831218.0", "Keys": { "CustomerName": { "S": "AnyCompany Industries" }, "NewImage": { "AccountManager": { "S": "Pat Candella" }, "PaymentTerms": { "S": "60 days" }, "CustomerName": { "S": "AnyCompany Industries" } }, "SequenceNumber": "111", "SizeBytes": 26, "StreamViewType": "NEW_IMAGE" } } }
若要根據 DynamoDB 表格中的索引鍵值和屬性值進行篩選,請使用記錄中的 dynamodb
索引鍵。下列各節提供不同的篩選條件類型範例。
使用資料表索引進行篩選
假設您希望函數僅處理主索引鍵 CustomerName
為 "AnyCompany Industries" 的記錄。FilterCriteria
物件如下所示。
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }" } ] }
補充說明,此處是篩選條件的 Pattern
在純文字 JSON 中擴展的值。
{ "dynamodb": { "Keys": { "CustomerName": { "S": [ "AnyCompany Industries" ] } } } }
您可以使用主控台、AWS CLI 或 AWS SAM 範本新增篩選條件。
使用資料表屬性進行篩選
使用 DynamoDB 時,您也可以使用 NewImage
和 OldImage
索引鍵來篩選屬性值。假設您想篩選最新表格映像中的 AccountManager
屬性為 "Pat Candella" 或 "Shirley Rodriguez" 的記錄。FilterCriteria
物件如下所示。
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }" } ] }
補充說明,此處是篩選條件的 Pattern
在純文字 JSON 中擴展的值。
{ "dynamodb": { "NewImage": { "AccountManager": { "S": [ "Pat Candella", "Shirley Rodriguez" ] } } } }
您可以使用主控台、AWS CLI 或 AWS SAM 範本新增篩選條件。
使用布林表達式進行篩選
您也可以使用布林值 AND 運算式建立篩選條件。這些運算式可以同時包含資料表的索引鍵和屬性參數。假設您想篩選記錄,其中 AccountManager
的 NewImage
值是「Pat Candella」,OldImage
值是「Terry Whitlock」。FilterCriteria
物件如下所示。
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } }" } ] }
補充說明,此處是篩選條件的 Pattern
在純文字 JSON 中擴展的值。
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } }, "dynamodb": { "OldImage": { "AccountManager": { "S": [ "Terry Whitlock" ] } } } }
您可以使用主控台、AWS CLI 或 AWS SAM 範本新增篩選條件。
注意
DynamoDB 事件篩選不支援使用數值運算子 (數值等於和數值範圍)。即使資料表中的項目儲存為數字,這些參數也會轉換為 JSON 記錄物件中的字串。
使用 Exists 運算子
由於來自 DynamoDB 的 JSON 事件物件的構造方式,使用 Exists 運算子需要特別注意。Exists 運算子只能在事件 JSON 的分葉節點上運作,因此如果您的篩選模式使用 Exists 來測試中繼節點,則無法運作。請考慮下列 DynamoDB 資料表項目。
{ "UserID": {"S": "12345"}, "Name": {"S": "John Doe"}, "Organizations": {"L": [ {"S":"Sales"}, {"S":"Marketing"}, {"S":"Support"} ] } }
您可能想要建立如下所示的篩選條件模式,以測試包含 "Organizations"
的事件:
{ "dynamodb" : { "NewImage" : { "Organizations" : [ { "exists": true } ] } } }
不過,此篩選條件模式永遠不會傳回相符項目,因為 "Organizations"
不是分葉節點。下列範例顯示了如何正確使用 Exists 運算子來建構所需的篩選條件模式:
{ "dynamodb" : { "NewImage" : {"Organizations": {"L": {"S": [ {"exists": true } ] } } } } }
DynamoDB 篩選的 JSON 格式
若要正確篩選來自 DynamoDB 來源的事件,資料欄位和資料欄位 (dynamodb
) 的篩選條件標準都必須是有效的 JSON 格式。如果其中一個欄位不是有效的 JSON 格式,則 Lambda 會捨棄訊息或擲回例外狀況。下表摘要說明特定行為:
傳入資料格式 | 資料屬性的篩選條件模式格式 | 產生的動作 |
---|---|---|
有效的 JSON |
有效的 JSON |
根據您的篩選條件標準之 Lambda 篩選條件。 |
有效的 JSON |
資料屬性沒有篩選條件模式 |
Lambda 篩選條件 (僅限其他中繼資料屬性) 會根據您的篩選條件標準而定。 |
有效的 JSON |
非 JSON |
Lambda 會在事件來源映射建立或更新時擲回例外狀況。資料屬性的篩選條件模式必須是有效的 JSON 格式。 |
非 JSON |
有效的 JSON |
Lambda 捨棄記錄。 |
非 JSON |
資料屬性沒有篩選條件模式 |
Lambda 篩選條件 (僅限其他中繼資料屬性) 會根據您的篩選條件標準而定。 |
非 JSON |
非 JSON |
Lambda 會在事件來源映射建立或更新時擲回例外狀況。資料屬性的篩選條件模式必須是有效的 JSON 格式。 |