イベントフィルタリングを使用して、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\" ] } } } }"
}
]
}
以下は、わかりやすくするためにプレーン JSON で展開したフィルターの Pattern
の値を記載しています。
{
"dynamodb": {
"Keys": {
"CustomerName": {
"S": [ "AnyCompany Industries" ]
}
}
}
}
コンソール、AWS CLI、または AWS SAM テンプレートを使用してフィルターを追加できます。
コンソールを使用してこのフィルターを追加するには、イベントソースマッピングへのフィルター条件のアタッチ (コンソール) の指示に従って [フィルター条件] に次の文字列を入力します。
{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }
テーブル属性でフィルタリングする
DynamoDB を使用すると、NewImage
および OldImage
キーを使用して属性値をフィルタリングすることもできます。最新のテーブル画像の AccountManager
属性が「Pat Candella」または「Shirley Rodriguez」のレコードをフィルタリングするとします。FilterCriteria
オブジェクトは次のようになります。
{
"Filters": [
{
"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"
}
]
}
以下は、わかりやすくするためにプレーン JSON で展開したフィルターの Pattern
の値を記載しています。
{
"dynamodb": {
"NewImage": {
"AccountManager": {
"S": [ "Pat Candella", "Shirley Rodriguez" ]
}
}
}
}
コンソール、AWS CLI、または AWS SAM テンプレートを使用してフィルターを追加できます。
コンソールを使用してこのフィルターを追加するには、イベントソースマッピングへのフィルター条件のアタッチ (コンソール) の指示に従って [フィルター条件] に次の文字列を入力します。
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }
ブール式でフィルタリングする
ブール型 AND 式を使用してフィルターを作成することもできます。これらの式には、テーブルの主パラメータと属性パラメータの両方を含めることができます。AccountManager
の NewImage
の値が「Pat Candella」で、OldImage
の値が「Terry Whitlock」であるレコードをフィルタリングするとします。FilterCriteria
オブジェクトは次のようになります。
{
"Filters": [
{
"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } }"
}
]
}
以下は、わかりやすくするためにプレーン JSON で展開したフィルターの Pattern
の値を記載しています。
{
"dynamodb" : {
"NewImage" : {
"AccountManager" : {
"S" : [
"Pat Candella"
]
}
}
},
"dynamodb": {
"OldImage": {
"AccountManager": {
"S": [
"Terry Whitlock"
]
}
}
}
}
コンソール、AWS CLI、または AWS SAM テンプレートを使用してフィルターを追加できます。
コンソールを使用してこのフィルターを追加するには、イベントソースマッピングへのフィルター条件のアタッチ (コンソール) の指示に従って [フィルター条件] に次の文字列を入力します。
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }
注記
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 形式である必要があります。 |