はじめに
AWS Lambda は、イベントソースとして SQS、DynamoDB、Kinesis のコンテンツフィルタリングオプションを提供するようになりました。イベントパターンのコンテンツフィルタリングでは、お客様が指定したフィルタリング条件の下で、SQS、DynamoDB、Kinesis からのみ Lambda 関数がトリガーされるような複雑なルールを書くことができます。これにより、お客様の Lambda 関数へのトラフィックを減らし、コードを簡素化し、全体的なコストを削減することができます。
お客様は、SQS、DynamoDB、Kinesis をトリガーとする Lambda 関数のためにイベントソースマッピングを作成または更新する際に、最大 5 つのフィルター条件を指定することができます。フィルターの組み合わせは、デフォルトでは OR 論理で行われます。つまり、定義されたフィルタリング条件のいずれかに合致するイベント/ペイロードは Lambda 関数のトリガーに渡され、フィルタリング条件のどれにも合致しないイベント/ペイロードはドロップされます。この機能により、利用可能なイベントのサブセットのみを使用するマイクロサービスの関数呼び出しを減らし、対象となる Lambda 関数やダウンストリームアプリケーションがフィルタリングを実行する必要がなくなります。
コンテンツフィルタリングは、AWS Lambda が利用できるすべての商用リージョンで利用可能です。この機能を使用するために、AWS Lambda の標準料金以上の追加費用はかかりません。
この機能の詳細については、イベントフィルタリングのための AWS Lambda ドキュメントをご覧ください。
の記事の更新内容を確認してみました。
どんな更新
Lambdaのトリガに設定したSQS、DynamoDB、Kinesisに対しフィルタリング条件を設定することで、無駄なLambda呼び出しを減らすことが出来るようになった。
これまでは
- 呼び出されたLambda側でフィルタリングしてあげる必要があった。
なにがうれしいか
-
Lambdaを呼び出す前にフィルタリングすることで、Lambda側のフィルタリングロジックがなくなる
-
Lambdaの呼び出し回数が減ってお財布にやさしい
料金は
Lambdaにかかる通常料金以外に追加費用はなし
やってみる
- Labmda側フィルタリング条件
- ProductName要素が存在する場合、Lambdaが発火するように指定
- SQSメッセージ
- ProductName要素が存在するメッセージを送信する
適当なLambda1を作成します。
フィルタリング条件については
を参考に。
今回はSQSから送信するメッセージのJSON構造が
{
"DataName": {
"messageAttributes": {},
"md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
"ProductName": "product name aruyo"
}
}
であるため、フィルタリング条件を
{
"body": {
"DataName": {
"ProductName": [ { "exists": true } ]
}
}
}
のように設定します。
追加すると、以下のようにフィルタリング条件が確認できます。
これで準備は完了です。
では、メッセージを送信してみましょう。
メッセージ本文にメッセージjsonを指定してメッセージを送信すると......
Lambdaが動作したことが確認できました。2
まとめ
LambdaのトリガにSQS、DynamoDB、Kinesisを利用する&特定の条件に一致した場合のみ動作させたいという場合、こちらの機能を思い出しましょう。
さいごに
Lambdaのフィルタリング条件にデータプロパティを指定するとき、イベントソース(SQS, DynamoDB, Kinesis)によってデーターキーを変える必要があります。
{
"body": {
"Data1": [ pattern ]
}
}
{
"dynamodb": {
"Data1": [ pattern ]
}
}
{
"data": {
"Data1": [ pattern ]
}
}
この形式で設定しないとうまく動かないので注意しましょう。3
参考