

# 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로 결합됩니다. 이벤트 소스의 레코드가 하나 이상의 필터를 충족하는 경우 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 이벤트 필터링에 사용할 수 있는 모든 비교 연산자에 대한 요약입니다.


| 비교 연산자 | 예제 | 규칙 구문 | 
| --- | --- | --- | 
|  Null  |  UserID가 null임  |  "UserID": [ null ]  | 
|  비어 있음  |  LastName이 비어 있음  |  "LastName": [""]  | 
|  같음  |  이름이 “Alice”임  |  "Name": [ "Alice" ]  | 
|  같음(대/소문자 무시)  |  이름이 ‘Alice’임  |  "Name": [ \$1 "equals-ignore-case": "alice" \$1 ]  | 
|  및  |  위치가 “New York”이고 요일이 “Monday”임  |  "Location": [ "New York" ], "Day": ["Monday"]  | 
|  또는  |  PaymentType이 “Credit” 또는 “Debit”임  |  "PaymentType": [ "Credit", "Debit"]  | 
|  또는(여러 필드)  |  위치가 'New York'이고 요일이 'Monday'임  |  "\$1or": [ \$1 "Location": [ "New York" ] \$1, \$1 "Day": [ "Monday" ] \$1 ]   | 
|  아님  |  날씨는 “Raining”이 아님  |  "Weather": [ \$1 "anything-but": [ "Raining" ] \$1 ]  | 
|  숫자(같음)  |  가격은 100임  |  "Price": [ \$1 "numeric": [ "=", 100 ] \$1 ]  | 
|  숫자(범위)  |  가격이 10을 초과하고 20보다 작거나 같음  |  "Price": [ \$1 "numeric": [ ">", 10, "<=", 20 ] \$1 ]  | 
|  존재함  |  Productname이 있음  |  "ProductName": [ \$1 "exists": true \$1 ]  | 
|  존재하지 않음  |  Productname이 없음  |  "ProductName": [ \$1 "exists": false \$1 ]  | 
|  로 시작함  |  리전이 미국에 있음  |  "Region": [ \$1"prefix": "us-" \$1 ]  | 
|  다음으로 끝남  |  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 콘솔의 [함수(Functions)](https://console.aws.amazon.com/lambda/home#/functions) 페이지를 엽니다.

1. 이벤트 소스 매핑을 생성할 함수의 이름을 선택합니다.

1. **함수 개요(Function overview)**에서 **트리거 추가(Add trigger)**를 선택합니다.

1. **트리거 구성(Trigger configuration)**에서 이벤트 필터링을 지원하는 트리거 유형을 선택합니다. 지원되는 서비스 목록은 이 페이지의 시작 부분에 있는 목록을 참조하세요.

1. **추가 설정**을 폅니다.

1. **필터 기준(Filter criteria)**에서 **추가(Add)**를 선택한 다음, 필터를 정의하고 입력합니다. 예를 들면 다음과 같이 입력할 수 있습니다.

   ```
   { "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가 필요합니다. [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) 호출에서 UUID를 가져올 수 있습니다. 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에 암호 해독 요청을 할 때 [암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)에서 `aws:lambda:FunctionArn` 및 `aws:lambda:EventSourceArn` 키와 해당 값을 전달합니다. 암호 해독 요청이 성공하려면 이러한 값이 키 정책의 지정된 조건과 일치해야 합니다. 자체 관리형 Kafka 이벤트 소스에는 EventSourcearn이 없으므로 EventSourcearn을 포함할 필요가 없습니다.
+ `kms:Decrypt`[[ - 또한 GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) 또는 DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.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) 조건 키를 사용하여 KMS 키 사용을 Lambda의 요청으로만 제한하는 것이 좋습니다. 이 키의 값은 리전 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` 필드가 더 이상 표시되지 않습니다. 함수가 이벤트 필터링을 사용하는 경우 `{}` 필드는 empty(`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`가 empty(`{}`)로 표시됩니다. 이는 함수가 현재 사용하고 있는 유효한 필터 기준이 `FilterCriteria` 객체에 포함되어 있는 경우에도 마찬가지입니다. 함수가 이벤트 필터링을 사용하지 않는 경우 CloudTrail은 로그 항목에 `FilterCriteria` 필드를 전혀 표시하지 않습니다.

```
{
    "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)