イベントフィルタリングを使用して、Lambda が関数に送信するストリームまたはキューからのレコードを制御することができます。イベントフィルタリングの仕組みに関する一般情報については、「Lambda が関数に送信するイベントを制御する」を参照してください。
このセクションでは、Amazon MSK イベントソースのイベントフィルタリングに焦点を当てます。
Amazon SQS イベントフィルタリングの基本
Amazon SQS キューに次の JSON 形式のメッセージが含まれているとします。
{
"RecordNumber": 1234,
"TimeStamp": "yyyy-mm-ddThh:mm:ss",
"RequestCode": "AAAA"
}
このキューのレコード例は次のようになります。
{
"messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
"receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
"body": "{\n "RecordNumber": 1234,\n "TimeStamp": "yyyy-mm-ddThh:mm:ss",\n "RequestCode": "AAAA"\n}",
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1545082649183",
"SenderId": "AIDAIENQZJOLO23YVJ4VO",
"ApproximateFirstReceiveTimestamp": "1545082649185"
},
"messageAttributes": {},
"md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue",
"awsRegion": "us-west-2"
}
Amazon SQS メッセージの内容に基づいてフィルタリングするには、Amazon SQS メッセージレコードの body
キーを使用します。Amazon SQS メッセージの RequestCode
が「BBBB」のレコードのみを処理するとします。FilterCriteria
オブジェクトは次のようになります。
{
"Filters": [
{
"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"
}
]
}
以下は、わかりやすくするためにプレーン JSON で展開したフィルターの Pattern
の値を記載しています。
{
"body": {
"RequestCode": [ "BBBB" ]
}
}
コンソール、AWS CLI、または AWS SAM テンプレートを使用してフィルターを追加できます。
コンソールを使用してこのフィルターを追加するには、イベントソースマッピングへのフィルター条件のアタッチ (コンソール) の指示に従って [フィルター条件] に次の文字列を入力します。
{ "body" : { "RequestCode" : [ "BBBB" ] } }
関数が、RecordNumber
が 9999 を超えるレコードのみを処理するとします。FilterCriteria
オブジェクトは次のようになります。
{
"Filters": [
{
"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"
}
]
}
以下は、わかりやすくするためにプレーン JSON で展開したフィルターの Pattern
の値を記載しています。
{
"body": {
"RecordNumber": [
{
"numeric": [ ">", 9999 ]
}
]
}
}
コンソール、AWS CLI、または AWS SAM テンプレートを使用してフィルターを追加できます。
コンソールを使用してこのフィルターを追加するには、イベントソースマッピングへのフィルター条件のアタッチ (コンソール) の指示に従って [フィルター条件] に次の文字列を入力します。
{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
Amazon SQS では、メッセージ本文は任意の文字列にすることができます。body
が有効な JSON フォーマットであることが FilterCriteria
で想定されている場合は、これが問題になる可能性があります。逆の場合も同様です。着信メッセージの本文が JSON 形式であっても、フィルター条件が body
をプレーン文字列であると想定する場合、意図しない動作が発生する可能性があります。
この問題を回避するには、FilterCriteria
の本文の形式がキューで受信するメッセージで想定する body
の形式と一致することを確認してください。メッセージをフィルタリングする前に、Lambda は着信メッセージの本文の形式および body
のフィルターパターンの形式を自動的に評価します。一致しない場合、Lambda はメッセージを除外します。この評価のまとめは、以下の表のとおりです。
着信メッセージの body の形式 |
フィルターパターンの body の形式 |
結果として生じるアクション |
---|---|---|
プレーン文字列 |
プレーン文字列 |
Lambda がフィルター条件に基づいてフィルタリングを実行します。 |
プレーン文字列 |
データプロパティのフィルターパターンがない |
Lambda がフィルター条件に基づいて (他のメタデータプロパティのみを) フィルタリングします。 |
プレーン文字列 |
有効な JSON |
Lambda はメッセージを除外します。 |
有効な JSON |
プレーン文字列 |
Lambda はメッセージを除外します。 |
有効な JSON |
データプロパティのフィルターパターンがない |
Lambda がフィルター条件に基づいて (他のメタデータプロパティのみを) フィルタリングします。 |
有効な JSON |
有効な JSON |
Lambda がフィルター条件に基づいてフィルタリングを実行します。 |