DynamoDB 이벤트 소스와 이벤트 필터링 사용

DynamoDB 이벤트 소스와 이벤트 필터링 사용

이벤트 필터링을 사용해서 Lambda가 함수로 보내는 스트림 또는 큐의 레코드를 제어할 수 있어요. 이벤트 필터링 작동 방식에 대한 일반적인 정보는 Lambda가 함수로 보내는 이벤트 제어를 참고하세요.

이 섹션은 DynamoDB 이벤트 소스에 대한 이벤트 필터링에 초점을 맞춰요.

참고(Note) DynamoDB 이벤트 소스 매핑은 dynamodb 키에 대한 필터링만 지원해요.

출처: AWS Lambda 개발자 안내서

본문

주제(Topics)

DynamoDB 이벤트

기본 키 CustomerName과 속성 AccountManager, PaymentTerms가 있는 DynamoDB 테이블이 있다고 가정해요. 다음은 DynamoDB 테이블 스트림의 예시 레코드예요.

{
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
          "ApproximateCreationDateTime": "1678831218.0",
          "Keys": {
              "CustomerName": {
                  "S": "AnyCompany Industries"
              }
          },
          "NewImage": {
              "AccountManager": {
                  "S": "Pat Candella"
              },
              "PaymentTerms": {
                  "S": "60 days"
              },
              "CustomerName": {
                  "S": "AnyCompany Industries"
              }
          },
          "SequenceNumber": "111",
          "SizeBytes": 26,
          "StreamViewType": "NEW_IMAGE"
      }
  }

DynamoDB 테이블의 키와 속성 값을 기준으로 필터링하려면 레코드의 dynamodb 키를 사용해요. 다음 섹션에서는 다양한 필터 유형에 대한 예시를 제공해요.

테이블 키로 필터링

함수가 기본 키 CustomerName이 "AnyCompany Industries"인 레코드만 처리하도록 하려 한다고 가정해요. FilterCriteria 객체는 다음과 같아요.

{
     "Filters": [
          {
              "Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"
          }
      ]
 }

더 명확하게, 필터의 Pattern 값을 일반 JSON으로 펼친 값은 다음과 같아요.

{
     "dynamodb": {
          "Keys": {
              "CustomerName": {
                  "S": [ "AnyCompany Industries" ]
                  }
              }
          }
 }

콘솔, AWS CLI 또는 AWS SAM 템플릿으로 필터를 추가할 수 있어요.

콘솔(Console)

콘솔로 이 필터를 추가하려면 이벤트 소스 매핑에 필터 기준 연결(콘솔)의 지침을 따르고 Filter criteria에 다음 문자열을 입력해요.

{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }

AWS CLI

AWS Command Line Interface(AWS CLI)로 이러한 필터 기준과 함께 새 이벤트 소스 매핑을 만들려면 다음 명령을 실행해요.

aws lambda create-event-source-mapping \
    --function-name {{my-function}} \
    --event-source-arn {{arn:aws:dynamodb:us-east-2:123456789012:table/my-table}} \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'

기존 이벤트 소스 매핑에 이러한 필터 기준을 추가하려면 다음 명령을 실행해요.

aws lambda update-event-source-mapping \
    --uuid {{"a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"}} \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'

AWS SAM

AWS SAM으로 이 필터를 추가하려면 이벤트 소스의 YAML 템플릿에 다음 조각을 추가해요.

FilterCriteria:
   Filters:
     - Pattern: '{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }'

테이블 속성으로 필터링

DynamoDB에서는 NewImage와 OldImage 키를 사용해서 속성 값을 필터링할 수도 있어요. 최신 테이블 이미지에서 AccountManager 속성이 "Pat Candella" 또는 "Shirley Rodriguez"인 레코드를 필터링하려 한다고 가정해요. FilterCriteria 객체는 다음과 같아요.

{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"
        }
    ]
}

더 명확하게, 필터의 Pattern 값을 일반 JSON으로 펼친 값은 다음과 같아요.

{
    "dynamodb": {
        "NewImage": {
            "AccountManager": {
                "S": [ "Pat Candella", "Shirley Rodriguez" ]
            }
        }
    }
}

콘솔, AWS CLI 또는 AWS SAM 템플릿으로 필터를 추가할 수 있어요.

콘솔(Console)

콘솔로 이 필터를 추가하려면 이벤트 소스 매핑에 필터 기준 연결(콘솔)의 지침을 따르고 Filter criteria에 다음 문자열을 입력해요.

{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }

AWS CLI

AWS Command Line Interface(AWS CLI)로 이러한 필터 기준과 함께 새 이벤트 소스 매핑을 만들려면 다음 명령을 실행해요.

aws lambda create-event-source-mapping \
    --function-name {{my-function}} \
    --event-source-arn {{arn:aws:dynamodb:us-east-2:123456789012:table/my-table}} \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'

기존 이벤트 소스 매핑에 이러한 필터 기준을 추가하려면 다음 명령을 실행해요.

aws lambda update-event-source-mapping \
    --uuid {{"a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"}} \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'

AWS SAM

AWS SAM으로 이 필터를 추가하려면 이벤트 소스의 YAML 템플릿에 다음 조각을 추가해요.

FilterCriteria:
  Filters:
    - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }'

Boolean 표현식으로 필터링

Boolean AND 표현식을 사용해서 필터를 만들 수도 있어요. 이러한 표현식은 테이블의 키와 속성 파라미터를 모두 포함할 수 있어요. AccountManager의 NewImage 값이 "Pat Candella"이고 OldImage 값이 "Terry Whitlock"인 레코드를 필터링하려 한다고 가정해요. FilterCriteria 객체는 다음과 같아요.

{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } }"
        }
    ]
}

더 명확하게, 필터의 Pattern 값을 일반 JSON으로 펼친 값은 다음과 같아요.

{ 
    "dynamodb" : { 
        "NewImage" : { 
            "AccountManager" : { 
                "S" : [ 
                    "Pat Candella" 
                ] 
            } 
        } 
    }, 
    "dynamodb": { 
        "OldImage": { 
            "AccountManager": { 
                "S": [ 
                    "Terry Whitlock" 
                ] 
            } 
        } 
    } 
}

콘솔, AWS CLI 또는 AWS SAM 템플릿으로 필터를 추가할 수 있어요.

콘솔(Console)

콘솔로 이 필터를 추가하려면 이벤트 소스 매핑에 필터 기준 연결(콘솔)의 지침을 따르고 Filter criteria에 다음 문자열을 입력해요.

{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }

AWS CLI

AWS Command Line Interface(AWS CLI)로 이러한 필터 기준과 함께 새 이벤트 소스 매핑을 만들려면 다음 명령을 실행해요.

aws lambda create-event-source-mapping \
    --function-name {{my-function}} \
    --event-source-arn {{arn:aws:dynamodb:us-east-2:123456789012:table/my-table}} \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'

기존 이벤트 소스 매핑에 이러한 필터 기준을 추가하려면 다음 명령을 실행해요.

aws lambda update-event-source-mapping \
    --uuid {{"a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"}} \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'

AWS SAM

AWS SAM으로 이 필터를 추가하려면 이벤트 소스의 YAML 템플릿에 다음 조각을 추가해요.

FilterCriteria:
  Filters:
    - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }'

참고(Note) DynamoDB 이벤트 필터링은 숫자 연산자(숫자 같음 및 숫자 범위) 사용을 지원하지 않아요. 테이블의 항목이 숫자로 저장되어 있어도 이러한 파라미터는 JSON 레코드 객체에서 문자열로 변환돼요.

Exists 연산자 사용

DynamoDB의 JSON 이벤트 객체 구조 때문에 Exists 연산자를 사용하려면 특별한 주의가 필요해요. Exists 연산자는 이벤트 JSON의 리프(leaf) 노드에서만 작동하므로, 필터 패턴이 Exists를 사용해서 중간 노드를 테스트하면 작동하지 않아요. 다음 DynamoDB 테이블 항목을 고려해요.

{
  "UserID": {"S": "12345"},
  "Name": {"S": "John Doe"},
  "Organizations": {"L": [
      {"S":"Sales"},
      {"S":"Marketing"},
      {"S":"Support"}
    ]
  }
}

"Organizations"를 포함하는 이벤트를 테스트하는 다음과 같은 필터 패턴을 만들고 싶을 수 있어요.

{ "dynamodb" : { "NewImage" : { "Organizations" : [ { "exists": true } ] } } }

하지만 "Organizations"는 리프 노드가 아니므로 이 필터 패턴은 매칭을 반환하지 않아요. 다음 예시는 원하는 필터 패턴을 구성하기 위해 Exists 연산자를 올바르게 사용하는 방법을 보여줘요.

{ "dynamodb" : { "NewImage" : {"Organizations": {"L": {"S": [ {"exists": true } ] } } } } }

DynamoDB 필터링용 JSON 형식

DynamoDB 소스의 이벤트를 올바르게 필터링하려면 데이터 필드와 데이터 필드(dynamodb)에 대한 필터 기준이 모두 유효한 JSON 형식이어야 해요. 둘 중 하나가 유효한 JSON 형식이 아니면 Lambda가 메시지를 버리거나 예외를 던져요. 다음 표는 구체적인 동작을 요약해요.

들어오는 데이터 형식 데이터 속성의 필터 패턴 형식 결과 동작
유효한 JSON 유효한 JSON Lambda가 필터 기준에 따라 필터링해요.
유효한 JSON 데이터 속성에 대한 필터 패턴 없음 Lambda가 필터 기준에 따라(다른 메타데이터 속성만) 필터링해요.
유효한 JSON 비-JSON Lambda가 이벤트 소스 매핑 생성·업데이트 시 예외를 던져요. 데이터 속성의 필터 패턴은 유효한 JSON 형식이어야 해요.
비-JSON 유효한 JSON Lambda가 레코드를 버려요.
비-JSON 데이터 속성에 대한 필터 패턴 없음 Lambda가 필터 기준에 따라(다른 메타데이터 속성만) 필터링해요.
비-JSON 비-JSON Lambda가 이벤트 소스 매핑 생성·업데이트 시 예외를 던져요. 데이터 속성의 필터 패턴은 유효한 JSON 형식이어야 해요.

더 알아보기 (Learn more)

이벤트 필터링 일반적인 내용은 Lambda가 함수로 보내는 이벤트 제어를 참고하세요.