

# Lambda が関数に送信するイベントを制御する
<a name="invocation-eventfiltering"></a>

イベントフィルタリングを使用して、Lambda が関数に送信するストリームまたはキューからのレコードを制御することができます。たとえば、フィルターを追加して、関数が特定のデータパラメータを含む Amazon SQS メッセージのみを処理するようにできます。イベントフィルタリングは特定のイベントソースマッピングとだけ連動します。次の AWS のサービスのイベントソースマッピングにフィルターを追加できます。
+ Amazon DynamoDB
+ Amazon Kinesis Data Streams
+ Amazon MQ
+ Amazon Managed Streaming for Apache Kafka (Amazon MSK)
+ セルフマネージド Apache Kafka
+ Amazon Simple Queue Service (Amazon SQS)

特定のイベントソースによるフィルタリングの詳細については、「[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service)」を参照してください。Lambda は Amazon DocumentDB のイベントフィルタリングをサポートしていません。

デフォルトでは、単一のイベントソースマッピングに最大 5 つの異なるフィルターを定義することができます。フィルターは論理 OR で結合されています。イベントソースのレコードが 1 つ以上のフィルター条件を満たす場合、Lambda は関数に送信する次のイベントにそのレコードを含めます。どのフィルターも条件を満たさない場合、Lambda はレコードを破棄します。

**注記**  
イベントソースに 5 つを超えるフィルターを定義する必要がある場合、イベントソースごとに最大 10 フィルターまでクォータ引き上げをリクエストできます。現在のクォータで許可されている数よりも多くのフィルターを追加しようとすると、イベントソースの作成時に Lambda はエラーを返します。

**Topics**
+ [

## イベントフィルタリングの基本を理解する
](#filtering-basics)
+ [

## フィルター条件を満たさないレコードの処理
](#filtering-criteria-not-met)
+ [

## フィルタールールの構文
](#filtering-syntax)
+ [

## イベントソースマッピングへのフィルター条件のアタッチ (コンソール)
](#filtering-console)
+ [

## イベントソースマッピングへのフィルター条件のアタッチ (AWS CLI)
](#filtering-cli)
+ [

## イベントソースマッピングへのフィルター条件のアタッチ (AWS SAM)
](#filtering-sam)
+ [

## フィルター条件の暗号化
](#filter-criteria-encryption)
+ [

## 異なる AWS のサービス を持つフィルターの使用
](#filtering-by-service)

## イベントフィルタリングの基本を理解する
<a name="filtering-basics"></a>

フィルター条件 (`FilterCriteria`) オブジェクトは、フィルターのリスト (`Filters`) で構成される構造です。各フィルターは、イベントのフィルタリングパターン (`Pattern`) を定義する構造です。パターンは、JSON フィルタールールを文字列で表したものです。`FilterCriteria` オブジェクトの構造は次の通りです。

```
{
   "Filters": [
        {
            "Pattern": "{ \"Metadata1\": [ rule1 ], \"data\": { \"Data1\": [ rule2 ] }}"
        }
    ]
}
```

以下は、わかりやすくするためにプレーン JSON で展開したフィルターの `Pattern` の値を記載しています。

```
{
    "Metadata1": [ rule1 ],
    "data": {
        "Data1": [ rule2 ]
    }
}
```

フィルターパターンには、メタデータプロパティ、データプロパティ、またはその両方を含めることができます。使用可能なメタデータパラメータおよびデータパラメータの形式は、イベントソースとして機能している AWS のサービス によって異なります。たとえば、イベントソースマッピングが Amazon SQS キューから次のレコードを受け取ったとします。

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\\n \"City\": \"Seattle\",\\n \"State\": \"WA\",\\n \"Temperature\": \"46\"\\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
    },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
    "awsRegion": "us-east-2"
}
```
+ **メタデータプロパティ**は、レコードを作成したイベントに関する情報を含むフィールドです。Amazon SQS レコードの例では、メタデータプロパティには `messageID`、`eventSourceArn`、`awsRegion` などのフィールドが含まれます。
+ **データプロパティ**は、ストリームまたはキューからのデータを含むレコードのフィールドです。Amazon SQS イベントの例では、データフィールドのキーは `body` であり、データプロパティはフィールド `City`、`State`、`Temperature` です。

イベントソースの種類が異なれば、データフィールドに使用するキー値も異なります。データプロパティをフィルタリングするには、フィルターのパターンに正しいキーが使われていることを確認してください。データフィルタリングキーのリストおよびサポートされている各 AWS のサービス のフィルターパターンの例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

イベントフィルタリングは、マルチレベル JSON のフィルタリングを処理できます。たとえば、DynamoDB ストリームのレコードに次のフラグメントがあるとします。

```
"dynamodb": {
    "Keys": {
        "ID": {
            "S": "ABCD"
        }
        "Number": {
            "N": "1234"
    },
    ...
}
```

ソートキー `Number` の値が 4567 のレコードのみを処理するとします。この場合、`FilterCriteria` オブジェクトは以下のようになります。

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\": { \"Keys\": { \"Number\": { \"N\": [ "4567" ] } } } }"
        }
    ]
}
```

以下は、わかりやすくするためにプレーン JSON で展開したフィルターの `Pattern` の値を記載しています。

```
{
    "dynamodb": {
        "Keys": {
            "Number": {
                "N": [ "4567" ]
                }
            }
        }
}
```

## フィルター条件を満たさないレコードの処理
<a name="filtering-criteria-not-met"></a>

Lambda がフィルター条件を満たさないレコードを処理する方法は、イベントソースによって異なります。
+ **Amazon SQS** では、メッセージがフィルター条件を満たさない場合、Lambda はそのメッセージをキューから自動的に削除します。Amazon SQS でこれらのメッセージを手動で削除する必要はありません。
+ **Kinesis** および **DynamoDB** では、フィルター条件によってレコードが評価された後、ストリームイテレータはこのレコードを通り越して先に進みます。レコードがフィルター条件を満たさない場合に、そのレコードをイベントソースから手動で削除する必要はありません。保持期間が過ぎると、Kinesis と DynamoDB はこれらの古いレコードを自動的に削除します。それより早くレコードを削除したい場合は、「[データ保持期間の変更](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html)」を参照してください。
+ **Amazon MSK**、**セルフマネージド Apache Kafka**、**Amazon MQ** メッセージの場合、Lambda はフィルターに含まれるすべてのフィールドに一致しないメッセージを削除します。Amazon MSK およびセルフマネージド Apache Kafka では、Lambda は関数を正常に呼び出した後、一致するメッセージと一致しないメッセージのオフセットをコミットします。Amazon MQ では、Lambda は関数を正常に呼び出した後で一致するメッセージを認識し、一致しないメッセージはフィルタリング時に認識します。

## フィルタールールの構文
<a name="filtering-syntax"></a>

フィルタールールの場合、Lambda は Amazon EventBridge ルールをサポートしており、EventBridge と同じ構文を使用します。詳細については、「*Amazon EventBridge のユーザーガイド*」の「[Amazon EventBridge のイベントパターン](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)」を参照してください。

以下は、Lambda のイベントフィルタリングで使用できるすべての比較演算子の概要です。


| Comparison operator (比較演算子) | 例 | ルール構文 | 
| --- | --- | --- | 
|  Null  |  UserId が Null  |  "UserID": [ null ]  | 
|  空  |  LastName が空白  |  "LastName": [""]  | 
|  等しい  |  Name が「Alice」  |  "Name": [ "Alice" ]  | 
|  等しい (大文字と小文字を区別しない)  |  Name が「Alice」  |  "Name": [ \$1 "equals-ignore-case": "alice" \$1 ]  | 
|  And  |  Location が「New York」、および Day が「Monday」  |  "Location": [ "New York" ], "Day": ["Monday"]  | 
|  または  |  PaymentType が「Credit」または「Debit」  |  "PaymentType": [ "Credit", "Debit"]  | 
|  Or (複数フィールド)  |  Location が「New York」、または Day が「Monday」  |  "\$1or": [ \$1 "Location": [ "New York" ] \$1, \$1 "Day": [ "Monday" ] \$1 ]   | 
|  以外  |  Weather が「Raining」以外  |  "Weather": [ \$1 "anything-but": [ "Raining" ] \$1 ]  | 
|  数値 (等しい)  |  Price が 100  |  "Price": [ \$1 "numeric": [ "=", 100 ] \$1 ]  | 
|  数値 (範囲)  |  Price が 10 より大きく 20 以下  |  "Price": [ \$1 "numeric": [ ">", 10, "<=", 20 ] \$1 ]  | 
|  存在する  |  ProductName が存在  |  "ProductName": [ \$1 "exists": true \$1 ]  | 
|  存在しない  |  ProductName が存在しない  |  "ProductName": [ \$1 "exists": false \$1 ]  | 
|  で始まる  |  Region が US にある  |  "Region": [ \$1"prefix": "us-" \$1 ]  | 
|  Ends with  |  FileName は.png 拡張子で終わります。  |  "FileName": [ \$1 "suffix": ".png" \$1 ]   | 

**注記**  
EventBridge と同様に、Lambda は文字列に対して文字単位の厳密な一致を使用し、大文字変換やその他の文字列の正規化は行いません。数値の場合、Lambda は文字列表現も使用します。たとえば、300、300.0、3.0e2 は等しいとはみなされません。

EXISTS 演算子は、イベントソース JSON のリーフノードでのみ機能することに注意してください。中間ノードとは一致しません。例えば、次の JSON では `"address"` は中間ノードであるため、`{ "person": { "address": [ { "exists": true } ] } }"` のフィルターパターンで一致するものが見つかりません。

```
{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "country": "USA"
    }
  }
}
```

## イベントソースマッピングへのフィルター条件のアタッチ (コンソール)
<a name="filtering-console"></a>

Lambda コンソールを使用してフィルター条件を持つ新しいイベントソースマッピングを作成するには、以下の手順を実行します。

**フィルター条件が設定された新しいイベントソースマッピングを作成する (コンソール)**

1. Lambda コンソールの [[関数ページ]](https://console.aws.amazon.com/lambda/home#/functions) を開きます。

1. イベントソースマッピングを作成する関数の名前を選択します。

1. **[Function overview]** (関数の概要) で **[Add trigger]** (トリガーを追加) をクリックします。

1. **[トリガーの設定]** で、イベントフィルタリングをサポートするトリガータイプを選択します。サポートされているサービスのリストについては、このページの冒頭にあるリストを参照してください。

1. **[追加の設定]** を展開します。

1. **[フィルター条件]** で **[追加]** を選択してから、フィルターを定義して入力します。たとえば、次の内容を入力できます。

   ```
   { "Metadata" : [ 1, 2 ] }
   ```

   これは、フィールド `Metadata` が 1 または 2 に等しいレコードのみを処理するように Lambda に指示します。引き続き **[追加]** を選択し、最大許容数量までフィルターを追加できます。

1. フィルターの追加を完了したら、**[保存]** を選択します。

コンソールを使用してフィルター条件を入力するとき、フィルターパターンのみを入力し、`Pattern` キーまたはエスケープの引用符を入力する必要はありません。上記の手順のステップ 6 では、`{ "Metadata" : [ 1, 2 ] }` は次の `FilterCriteria` に対応します。

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

コンソールでイベントソースマッピングを作成すると、トリガーの詳細にフォーマットされた `FilterCriteria` が表示されます。コンソールを使用してイベントフィルターを作成するその他の例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

## イベントソースマッピングへのフィルター条件のアタッチ (AWS CLI)
<a name="filtering-cli"></a>

イベントソースマッピングに以下の `FilterCriteria` を設定するとします。

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

AWS Command Line Interface (AWS CLI) を使用してこれらのフィルター条件を持つ新しいイベントソースマッピングを作成するには、以下のコマンドを実行します。

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

この [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) コマンドは、指定された `FilterCriteria` を持つ関数 `my-function` の新しい Amazon SQS イベントソースマッピングを作成します。

これらのフィルター条件を既存のイベントソースマッピングに追加するには、次のコマンドを実行します。

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

イベントソースマッピングを更新するには、その UUID が必要であることに注意してください。UUID は [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) 呼び出しから取得できます。Lambda は、[create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) CLI 応答でも UUID を返します。

イベントソースからフィルター条件を削除するには、空の `FilterCriteria` オブジェクトを持つ次の [update-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/update-event-source-mapping.html) コマンドを実行します。

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria "{}"
```

AWS CLI を使用してイベントフィルターを作成するその他の例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

## イベントソースマッピングへのフィルター条件のアタッチ (AWS SAM)
<a name="filtering-sam"></a>

 以下のフィルタ条件を使用するように AWS SAM 内のイベントソースを設定したいとします。

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

 これらのフィルタ条件をイベントソースマッピングに追加するには、イベントソースの YAML テンプレートに以下のスニペットを挿入します。

```
FilterCriteria: 
  Filters: 
    - Pattern: '{"Metadata": [1, 2]}'
```

 イベントソースマッピング用の AWS SAM テンプレートの作成と設定に関する詳細については、「AWS SAM デベロッパーガイド」の「[EventSource](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html)」セクションを参照してください。AWS SAM テンプレートを使用してイベントフィルターを作成するその他の例については、[異なる AWS のサービス を持つフィルターの使用](#filtering-by-service) を参照してください。

## フィルター条件の暗号化
<a name="filter-criteria-encryption"></a>

Lambda は、デフォルトではフィルター条件オブジェクトを暗号化しません。フィルター条件オブジェクトに機密情報を含める可能性があるユースケースでは、自分の [KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)を使用してそのオブジェクトを暗号化できます。

フィルター条件オブジェクトを暗号化した後でも、[GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API コールを使用すれば、そのオブジェクトをプレーンテキストで表示できます。フィルター条件をプレーンテキストで正しく表示するためには、`kms:Decrypt` アクセス許可が必要です。

**注記**  
フィルター条件オブジェクトが暗号化されている場合、Lambda は [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html) 呼び出しに応答する際に `FilterCriteria` フィールドの値をマスキングします。そのため、このフィールドには `null` が表示されます。`FilterCriteria` の実際の値を表示するには、[GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API を使用します。  
`FilterCriteria` を復号化した値をコンソールに表示するには、自身に付与された IAM ロールに [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) へのアクセス許可が含まれている必要があります。

コンソール、API/CLI、または CloudFormation から自分の KMS キーを指定できます。

**顧客所有の KMS キーでフィルター条件を暗号化するには (コンソール)**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. **[トリガーを追加]** を選択します。既にトリガーが存在する場合は、**[設定]** タブ、**[トリガー]** の順に選択します。その既存のトリガーを選択し、**[編集]** を選択します。

1. **[カスタマー管理 KMS キーで暗号化]** の隣にあるチェックボックスをオンにします。

1. **[カスタマー管理 KMS 暗号化キーの選択]** で、既存の有効なキーを選択するか、新たにキーを作成します。実行する操作によっては、`kms:DescribeKey`、`kms:GenerateDataKey`、`kms:Decrypt` のアクセス許可の一部または全部が必要になります。これらのアクセス許可を付与するには、KMS キーポリシーを使用します。

自分の KMS キーを使用する場合は、[キーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)で次の API オペレーションを許可する必要があります。
+ `kms:Decrypt` – リージョンの Lambda サービスプリンシパル (`lambda.AWS_region.amazonaws.com`) に付与する必要があります。これにより、Lambda がこの KMS キーでデータを復号できるようになります。
  + [サービス間の混乱による代理問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)の発生を防ぐため、キーポリシーでは [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) グローバル条件キーを使用します。`aws:SourceArn` キーの正しい値はイベントソースマッピングリソースの ARN であるため、その ARN がわからなければポリシーに追加することはできません。また、Lambda は復号のリクエストを KMS に送るときに、`aws:lambda:FunctionArn` キーと `aws:lambda:EventSourceArn` キーのほか、それぞれの値を[暗号化コンテキスト](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)に含めて転送します。復号のリクエストを正常に処理するためには、これらの値がキーポリシーに指定された条件に一致する必要があります。セルフマネージドの Kafka イベントソースの場合、EventSourceArn がないため、EventSourceArn を含める必要はありません。
+ `kms:Decrypt` – プリンシパルがキーを使用して [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) または [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) の API コールにフィルター条件をプレーンテキストで表示する場合は、そのプリンシパルにも付与する必要があります。
+ `kms:DescribeKey` — カスタマー管理キーの詳細を定義して、指定されたプリンシパルがキーを使用できるようにします。
+ `kms:GenerateDataKey` – フィルター条件を暗号化するためのデータキーを、指定されたプリンシパルに代わって Lambda が生成できるように、必要なアクセス許可を指定します ([エンベロープ暗号化](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping))。

AWS CloudTrail を使用して、Lambda がユーザーに代わって行う AWS KMS リクエストを追跡できます。サンプルの CloudTrail イベントについては、「[Lambda の暗号化キーのモニタリング](security-encryption-at-rest.md#encryption-key-monitoring)」を参照してください。

また、[https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) 条件キーを使用して、Lambda からのリクエストに対してのみ KMS キーを使用できるように制限することをお勧めします。このキーの値は、リージョンの Lambda サービスプリンシパル (`lambda.AWS_region.amazonaws.com`) です。次に、関連するすべてのアクセス許可を付与するキーポリシーの例を示します。

**Example AWS KMS キーポリシー**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-key-policy-1",
    "Statement": [
        {
            "Sid": "Allow Lambda to decrypt using the key",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals" : {
                    "aws:SourceArn": [
                        "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:<esm_uuid>"
                    ]
                },
                "StringEquals": {
                    "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:test-function",
                    "kms:EncryptionContext:aws:lambda:EventSourceArn": "arn:aws:sqs:us-east-1:123456789012:test-queue"
                }
            }
        },
        {
            "Sid": "Allow actions by an AWS account on the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key to specific roles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/ExampleRole"
            },
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals" : {
                    "kms:ViaService": "lambda.us-east-1.amazonaws.com"
                }
            }
        }
    ]
}
```

自分の KMS キーを使用してフィルター条件を暗号化する場合は、次の [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) AWS CLI コマンドを使用することもできます。`--kms-key-arn` フラグを使用して、KMS キー ARN を指定します。

```
aws lambda create-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

イベントソースマッピングが既にある場合は、代わりに [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) AWS CLI コマンドを使用します。`--kms-key-arn` フラグを使用して、KMS キー ARN を指定します。

```
aws lambda update-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

この操作では、以前に指定された KMS キーがあれば上書きされます。`--kms-key-arn` フラグと共に空の引数を指定すると、Lambda はフィルター条件を暗号化する際に KMS キーを使用しなくなります。代わりに、Lambda はデフォルトの設定に戻って Amazon 所有のキーを使用します。

CloudFormation テンプレートに自分の KMS キーを指定するには、`AWS::Lambda::EventSourceMapping` リソースタイプの `KMSKeyArn` プロパティを使用します。例えば、次のスニペットをイベントソースの YAML テンプレートに挿入できます。

```
MyEventSourceMapping:
  Type: AWS::Lambda::EventSourceMapping
  Properties:
    ...
    FilterCriteria:
      Filters:
        - Pattern: '{"a": [1, 2]}'
    KMSKeyArn: "arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599"
    ...
```

[GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) または [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) API コールに暗号化されたフィルター条件をプレーンテキストで表示できるようにするには、`kms:Decrypt` アクセス許可が必要です。

2024 年 8 月 6 日以降、関数でイベントフィルタリングが使用されていない場合、[CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)、[UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)、[DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) の API コールの AWS CloudTrail ログには、`FilterCriteria` フィールドが表示されなくなります。関数でイベントフィルタリングが使用されていれば、`FilterCriteria` フィールドは空 (`{}`) になります。適切な KMS キーに対して `kms:Decrypt` アクセス許可が付与されていれば、これまで通り [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) API コールに応答する際にフィルター条件をプレーンテキストで表示できます。

### Create/Update/DeleteEventSourceMapping 呼び出しを行った場合の CloudTrail ログエントリの例
<a name="filter-criteria-encryption-cloudtrail"></a>

次に示した CreateEventSourceMapping 呼び出しの AWS CloudTrail ログエントリの例では、関数でイベントフィルタリングが使用されているため、`FilterCriteria` が空 (`{}`) になっています。これは、`FilterCriteria` オブジェクトに含まれている有効なフィルター条件が関数でアクティブに使用されている場合でも当てはまります。関数でイベントフィルタリングが使用されていない場合、`FilterCriteria` フィールドは CloudTrail のログエントリのどこにも表示されません。

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA123456789EXAMPLE:userid1",
        "arn": "arn:aws:sts::123456789012:assumed-role/Example/example-role",
        "accountId": "123456789012",
        "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA987654321EXAMPLE",
                "arn": "arn:aws:iam::123456789012:role/User1",
                "accountId": "123456789012",
                "userName": "User1"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-05-09T20:35:01Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2024-05-09T21:05:41Z",
    "eventSource": "lambda.amazonaws.com",
    "eventName": "CreateEventSourceMapping20150331",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "functionName": "example-function",
        "enabled": true,
        "batchSize": 10,
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "scalingConfig": {},
        "maximumBatchingWindowInSeconds": 0,
        "sourceAccessConfigurations": []
    },
    "responseElements": {
        "uUID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
        "batchSize": 10,
        "maximumBatchingWindowInSeconds": 0,
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:example-function",
        "lastModified": "May 9, 2024, 9:05:41 PM",
        "state": "Creating",
        "stateTransitionReason": "USER_INITIATED",
        "functionResponseTypes": [],
        "eventSourceMappingArn": "arn:aws:lambda:us-east-2:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLEbbbbb"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}
```

## 異なる AWS のサービス を持つフィルターの使用
<a name="filtering-by-service"></a>

イベントソースの種類が異なれば、データフィールドに使用するキー値も異なります。データプロパティをフィルタリングするには、フィルターのパターンに正しいキーが使われていることを確認してください。次の表では、サポートされている各 AWS のサービス のフィルタリングキーが示されます。


| AWS のサービス | フィルタリングキー | 
| --- | --- | 
| DynamoDB | dynamodb | 
| Kinesis | data | 
| Amazon MQ | data | 
| Amazon MSK | value | 
| セルフマネージド Apache Kafka | value | 
| Amazon SQS | body | 

次のセクションでは、さまざまなタイプのイベントソースのフィルターパターンの例を示します。サポートされている受信データ形式の定義およびサポートされている各サービスのフィルターパターン本体形式も提供します。
+ [DynamoDB イベントソースでのイベントフィルタリングの使用](with-ddb-filtering.md)
+ [Kinesis イベントソースでのイベントフィルタリングの使用](with-kinesis-filtering.md)
+ [Amazon MQ イベントソースからのイベントをフィルタリングする](with-mq-filtering.md)
+ [Amazon MSK およびセルフマネージド Apache Kafka イベントソースからのイベントのフィルタリング](kafka-filtering.md)
+ [Amazon SQS イベントソースでのイベントフィルタリングの使用](with-sqs-filtering.md)