Amazon SQS 이벤트 소스에서 이벤트 필터링 사용

Amazon SQS 이벤트 소스에서 이벤트 필터링 사용

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

출처: AWS Lambda 개발자 안내서

본문

이 섹션은 Amazon SQS 이벤트 소스의 이벤트 필터링에 초점을 맞춥니다.

Amazon SQS 이벤트 소스 매핑은 body 키에 대해서만 필터링을 지원합니다.

이 페이지의 내용:

  • Amazon SQS 이벤트 필터링 기본

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\" ] } }"
        }
    ]
}

명확성을 위해 필터 Pattern 값을 평문 JSON으로 펼치면 다음과 같습니다.

{
    "body": {
        "RequestCode": [ "BBBB" ]
        }
}

콘솔, AWS CLI, AWS SAM 템플릿으로 필터를 추가할 수 있습니다.

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

{ "body" : { "RequestCode" : [ "BBBB" ] } }

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": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'

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

aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'

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

FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RequestCode" : [ "BBBB" ] } }'

RecordNumber가 9999보다 큰 레코드만 함수가 처리하도록 하려면 FilterCriteria 객체는 다음과 같습니다.

{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"
        }
    ]
}

명확성을 위해 필터 Pattern 값을 평문 JSON으로 펼치면 다음과 같습니다.

{
    "body": {
        "RecordNumber": [
            {
                "numeric": [ ">", 9999 ]
            }
        ]
    }
}

콘솔, AWS CLI, AWS SAM 템플릿으로 필터를 추가할 수 있습니다.

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

{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }

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": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'

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

aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'

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

FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }'

Amazon SQS의 경우 메시지 body는 어떤 문자열이든 될 수 있습니다. 다만 FilterCriteria가 body가 유효한 JSON 형식이라고 기대한다면 이는 문제가 될 수 있습니다. 반대 상황도 마찬가지입니다. 들어오는 메시지 body가 JSON 형식인데 필터 기준이 body가 평문 문자열이라고 기대하면 의도치 않은 동작이 발생할 수 있습니다.

이 문제를 피하려면 FilterCriteria의 body 형식이 큐에서 받는 메시지의 body 예상 형식과 일치하는지 확인하세요. 메시지를 필터링하기 전에 Lambda는 들어오는 메시지 body의 형식과 body 필터 패턴의 형식을 자동으로 평가합니다. 불일치가 있으면 Lambda는 메시지를 버립니다. 다음 표는 이 평가를 요약합니다.

들어오는 메시지 body 형식 필터 패턴 body 형식 결과 동작
평문 문자열 평문 문자열 Lambda가 필터 기준에 따라 필터링합니다.
평문 문자열 데이터 속성 필터 패턴 없음 Lambda가 (다른 메타데이터 속성에 대해서만) 필터 기준에 따라 필터링합니다.
평문 문자열 유효한 JSON Lambda가 메시지를 버립니다.
유효한 JSON 평문 문자열 Lambda가 메시지를 버립니다.
유효한 JSON 데이터 속성 필터 패턴 없음 Lambda가 (다른 메타데이터 속성에 대해서만) 필터 기준에 따라 필터링합니다.
유효한 JSON 유효한 JSON Lambda가 필터 기준에 따라 필터링합니다.

더 알아보기 (Learn more)