Amazon SQS イベントソースでのイベントフィルタリングの使用
イベントフィルタリングを使用して、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 テンプレートを使用してフィルターを追加できます。
関数が、RecordNumber
が 9999 を超えるレコードのみを処理するとします。FilterCriteria
オブジェクトは次のようになります。
{ "Filters": [ { "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }" } ] }
以下は、わかりやすくするためにプレーン JSON で展開したフィルターの Pattern
の値を記載しています。
{ "body": { "RecordNumber": [ { "numeric": [ ">", 9999 ] } ] } }
コンソール、AWS CLI、または AWS SAM テンプレートを使用してフィルターを追加できます。
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 がフィルター条件に基づいてフィルタリングを実行します。 |