Using event filtering with a DynamoDB event source
You can use event filtering to control which records from a stream or queue Lambda sends to your function. For general information about how event filtering works, see Control which events Lambda sends to your function.
This section focuses on event filtering for DynamoDB event sources.
Topics
DynamoDB event
Suppose you have a DynamoDB table with the primary key CustomerName
and attributes AccountManager
and
PaymentTerms
. The following shows an example record from your DynamoDB table’s stream.
{ "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" } } }
To filter based on the key and attribute values in your DynamoDB table, use the dynamodb
key in the record.
The following sections provide examples for different filter types.
Filtering with table keys
Suppose you want your function to process only those records where the primary key CustomerName
is “AnyCompany Industries.” The
FilterCriteria
object would be as follows.
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }" } ] }
For added clarity, here is the value of the filter's Pattern
expanded in plain JSON.
{ "dynamodb": { "Keys": { "CustomerName": { "S": [ "AnyCompany Industries" ] } } } }
You can add your filter using the console, AWS CLI or an AWS SAM template.
Filtering with table attributes
With DynamoDB, you can also use the NewImage
and OldImage
keys to filter for attribute values. Suppose you want
to filter records where the AccountManager
attribute in the latest table image is “Pat Candella” or "Shirley Rodriguez." The
FilterCriteria
object would be as follows.
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }" } ] }
For added clarity, here is the value of the filter's Pattern
expanded in plain JSON.
{ "dynamodb": { "NewImage": { "AccountManager": { "S": [ "Pat Candella", "Shirley Rodriguez" ] } } } }
You can add your filter using the console, AWS CLI or an AWS SAM template.
Filtering with Boolean expressions
You can also create filters using Boolean AND expressions. These expressions can include both your table's key and attribute parameters.
Suppose you want to filter records where the NewImage
value of AccountManager
is "Pat Candella" and the
OldImage
value is "Terry Whitlock". The FilterCriteria
object would be as follows.
{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } }" } ] }
For added clarity, here is the value of the filter's Pattern
expanded in plain JSON.
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } }, "dynamodb": { "OldImage": { "AccountManager": { "S": [ "Terry Whitlock" ] } } } }
You can add your filter using the console, AWS CLI or an AWS SAM template.
Note
DynamoDB event filtering doesn’t support the use of numeric operators (numeric equals and numeric range). Even if items in your table are stored as numbers, these parameters are converted to strings in the JSON record object.
Using the Exists operator
Because of the way that JSON event objects from DynamoDB are structured, using the Exists operator requires special care. The Exists operator only works on leaf nodes in the event JSON, so if your filter pattern uses Exists to test for an intermediate node, it won't work. Consider the following DynamoDB table item:
{ "UserID": {"S": "12345"}, "Name": {"S": "John Doe"}, "Organizations": {"L": [ {"S":"Sales"}, {"S":"Marketing"}, {"S":"Support"} ] } }
You might want to create a filter pattern like the following that would test for events containing "Organizations"
:
{ "dynamodb" : { "NewImage" : { "Organizations" : [ { "exists": true } ] } } }
However, this filter pattern would never return a match because "Organizations"
is not a leaf node. The following
example shows how to properly use the Exists operator to construct the desired filter pattern:
{ "dynamodb" : { "NewImage" : {"Organizations": {"L": {"S": [ {"exists": true } ] } } } } }
JSON format for DynamoDB filtering
To properly filter events from DynamoDB sources, both the data field and your filter criteria for the data field (dynamodb
)
must be in valid JSON format. If either field isn't in a valid JSON format, Lambda drops the message or throws an exception. The following
table summarizes the specific behavior:
Incoming data format | Filter pattern format for data properties | Resulting action |
---|---|---|
Valid JSON |
Valid JSON |
Lambda filters based on your filter criteria. |
Valid JSON |
No filter pattern for data properties |
Lambda filters (on the other metadata properties only) based on your filter criteria. |
Valid JSON |
Non-JSON |
Lambda throws an exception at the time of the event source mapping creation or update. The filter pattern for data properties must be in a valid JSON format. |
Non-JSON |
Valid JSON |
Lambda drops the record. |
Non-JSON |
No filter pattern for data properties |
Lambda filters (on the other metadata properties only) based on your filter criteria. |
Non-JSON |
Non-JSON |
Lambda throws an exception at the time of the event source mapping creation or update. The filter pattern for data properties must be in a valid JSON format. |