將事件篩選與 DynamoDB 事件來源搭配使用 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將事件篩選與 DynamoDB 事件來源搭配使用

您可以使用事件篩選來控制 Lambda 將哪些記錄從串流或佇列中傳送至函數。如需事件篩選如何運作的一般資訊,請參閱控制 Lambda 傳送給函數的事件

本節著重於 DynamoDB 事件來源的事件篩選。

動 DynamoDB 事件

假設您有一個包含主索引鍵 CustomerName 和屬性 AccountManagerPaymentTerms 的 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 產業」的記錄。FilterCriteria 物件如下所示。

{ "Filters": [ { "Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }" } ] }

為了增加清晰度,以下是以普通方式Pattern擴展過濾器的值JSON。

{ "dynamodb": { "Keys": { "CustomerName": { "S": [ "AnyCompany Industries" ] } } } }

您可以使用控制台 AWS CLI 或 AWS SAM 模板添加過濾器。

Console

若要使用主控台新增此篩選條件,請遵循 將篩選條件標準連接至事件來源映射 (主控台) 中的指示,並針對篩選條件標準輸入下列字串。

{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }
AWS CLI

若要使用 AWS Command Line Interface (AWS CLI) 建立具有這些篩選條件的新事件來源對應,請執行下列命令。

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'

若要將這些篩選條件標準新增到現有事件來源映射,請執行下列命令。

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'
AWS SAM

若要使用新增此篩選器 AWS SAM,請將下列程式碼片段新增至事件來源的YAML範本。

FilterCriteria: Filters: - Pattern: '{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }'

使用表格屬性篩選

使用 DynamoDB 時,您也可以使用 NewImageOldImage 索引鍵來篩選屬性值。假設您想篩選最新表格映像中的 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 模板添加過濾器。

Console

若要使用主控台新增此篩選條件,請遵循 將篩選條件標準連接至事件來源映射 (主控台) 中的指示,並針對篩選條件標準輸入下列字串。

{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }
AWS CLI

若要使用 AWS Command Line Interface (AWS CLI) 建立具有這些篩選條件的新事件來源對應,請執行下列命令。

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'

若要將這些篩選條件標準新增到現有事件來源映射,請執行下列命令。

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'
AWS SAM

若要使用新增此篩選器 AWS SAM,請將下列程式碼片段新增至事件來源的YAML範本。

FilterCriteria: Filters: - Pattern: '{ "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\" ] } } } }" } ] }

為了增加清晰度,以下是以普通方式Pattern擴展過濾器的值JSON。

{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } }, "dynamodb": { "OldImage": { "AccountManager": { "S": [ "Terry Whitlock" ] } } } }

您可以使用控制台 AWS CLI 或 AWS SAM 模板添加過濾器。

Console

若要使用主控台新增此篩選條件,請遵循 將篩選條件標準連接至事件來源映射 (主控台) 中的指示,並針對篩選條件標準輸入下列字串。

{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }
AWS CLI

若要使用 AWS Command Line Interface (AWS CLI) 建立具有這些篩選條件的新事件來源對應,請執行下列命令。

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'

若要將這些篩選條件標準新增到現有事件來源映射,請執行下列命令。

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'
AWS SAM

若要使用新增此篩選器 AWS SAM,請將下列程式碼片段新增至事件來源的YAML範本。

FilterCriteria: Filters: - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }'
注意

DynamoDB 事件篩選不支援使用數值運算子 (數值等於和數值範圍)。即使表格中的項目儲存為數字,這些參數也會轉換為JSON記錄物件中的字串。

使用存在運算符

由於 DynamoDB JSON 事件物件的結構化方式,因此使用 Exissions 運算子需要特別小心。Exissions 運算符僅適用於事件中的葉節點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"是葉節點。下列範例會示範如何正確使用 Exissions 運算子來建構所需的濾鏡模式:

{ "dynamodb" : { "NewImage" : {"Organizations": {"L": {"S": [ {"exists": true } ] } } } } }

JSON篩 DynamoDB 式

若要正確篩選 DynamoDB 來源中的事件,資料欄位和資料欄位 (dynamodb) 的篩選條件都必須採用有效JSON的格式。如果任一欄位不是有效的JSON格式,Lambda 會捨棄訊息或擲回例外狀況。下表摘要說明特定行為:

傳入資料格式 資料屬性的篩選條件模式格式 產生的動作

有效 JSON

有效 JSON

根據您的篩選條件標準之 Lambda 篩選條件。

有效 JSON

資料屬性沒有篩選條件模式

Lambda 篩選條件 (僅限其他中繼資料屬性) 會根據您的篩選條件標準而定。

有效 JSON

非 JSON

Lambda 會在事件來源映射建立或更新時擲回例外狀況。資料屬性的篩選器模式必須是有效的JSON格式。

非 JSON

有效 JSON

Lambda 捨棄記錄。

非 JSON

資料屬性沒有篩選條件模式

Lambda 篩選條件 (僅限其他中繼資料屬性) 會根據您的篩選條件標準而定。

非 JSON

非 JSON

Lambda 會在事件來源映射建立或更新時擲回例外狀況。資料屬性的篩選器模式必須是有效的JSON格式。