Lambda 비동기 호출 레코드 캡처 - AWS Lambda

Lambda 비동기 호출 레코드 캡처

Lambda는 비동기 호출 레코드를 다음 중 하나로 전송할 수 있습니다. AWS 서비스

  • Amazon SQS— 표준 SQS 대기열입니다.

  • Amazon SNS – 표준 SNS 주제.

  • AWS Lambda – Lambda 함수입니다.

  • Amazon EventBridge - EventBridge 이벤트 버스입니다.

호출 레코드에는 JSON 형식의 요청 및 응답에 대한 세부 정보가 포함되어 있습니다. 처리에 성공한 이벤트와 모든 처리 시도에서 실패한 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 또는 삭제된 이벤트에 대해 표준 Amazon SQS 대기열 또는 표준 Amazon SNS 주제를 배달 못한 편지 대기열로 구성할 수 있습니다. 배달 못한 편지 대기열의 경우 Lambda는 응답에 대한 세부 정보 없이 이벤트의 콘텐츠만 전송합니다.

Lambda에서 구성한 대상으로 레코드를 전송할 수 없는 경우 Amazon CloudWatch로 DestinationDeliveryFailures 지표를 전송합니다. 이는 구성에 Amazon SQS FIFO 대기열 또는 Amazon SNS FIFO 주제와 같이 지원되지 않는 대상 유형이 포함된 경우 발생할 수 있습니다. 전송 오류는 권한 오류 및 크기 제한으로 인해 발생할 수도 있습니다. Lambda 호출 지표에 대한 자세한 내용은 호출 지표의 내용을 참조하세요.

참고

함수가 트리거되지 않도록 함수에 예약된 동시성을 0으로 설정할 수 있습니다. 비동기적으로 호출된 함수에 대해 예약된 동시성을 0으로 설정하면 Lambda는 모든 이벤트를 구성된 DLQ(Dead Letter Queue) 또는 실패 시 이벤트 대상으로 새 이벤트를 보내기 시작합니다. 예약된 동시성이 0으로 설정된 상태에서 전송된 이벤트를 처리하려면 DLQ(Dead Letter Queue) 대기열 또는 실패 시 이벤트 대상에서 이벤트를 반드시 사용해야 합니다.

비동기식 호출에 대한 대상 구성

비동기 호출 레코드를 유지하려면 함수에 대상을 추가합니다. 성공한 또는 실패한 간접 호출을 대상으로 전송하도록 선택할 수 있습니다. 각 함수에는 여러 대상이 있을 수 있으므로 성공 및 실패한 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 대상으로 전송되는 각 레코드는 간접 호출에 대한 세부 정보가 포함된 JSON 문서입니다. 오류 처리 설정과 마찬가지로 함수, 함수의 버전 또는 별칭에 대상을 구성할 수 있습니다.

참고

Amazon Kinesis, Amazon DynamoDB, 자체 관리형 Apache KafkaAmazon MSK와 같은 이벤트 소스 매핑 유형에 대해 실패한 간접 호출 기록을 유지할 수도 있습니다.

다음 표는 비동기 호출 레코드를 위해 지원되는 대상을 나열합니다. Lambda가 선택한 목적지로 레코드를 성공적으로 전송하려면 함수의 실행 역할에도 관련 권한이 포함되어야 합니다. 또한 표에는 각 대상 유형이 JSON 간접 호출 레코드를 수신하는 방법도 설명되어 있습니다.

대상 유형 필수 권한 대상별 JSON 형식

Amazon SQS 대기열

sqs:SendMessage

Lambda는 간접 호출 레코드를 Message로 목적지에 전달합니다.

Amazon SNS 주제

sns:Publish

Lambda는 간접 호출 레코드를 Message로 목적지에 전달합니다.

Lambda 함수

InvokeFunction

Lambda는 간접 호출 레코드를 페이로드로 함수에 전달합니다.

EventBridge

events:PutEvents

  • Lambda는 간접 호출 레코드를 PutEvents 호출의 detail로 전달합니다.

  • source 이벤트 필드의 값은 lambda입니다.

  • detail-type 이벤트 필드의 값은 “Lambda 함수 간접 호출 결과 - 성공” 또는 “Lambda 함수 간접 호출 결과 - 실패”입니다.

  • resource 이벤트 필드에는 함수와 대상 Amazon 리소스 이름(ARN)이 포함됩니다.

  • 다른 이벤트 필드의 경우 Amazon EventBridge 이벤트를 참조하세요.

다음 예제에서는 함수 오류로 인해 처리에 연속 3회 실패한 이벤트에 대한 호출 레코드를 보여 줍니다. 호출 레코드에는 이벤트, 응답 및 레코드가 전송된 이유에 대한 세부 정보가 포함되어 있습니다.

{ "version": "1.0", "timestamp": "2019-11-14T18:16:05.568Z", "requestContext": { "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST", "condition": "RetriesExhausted", "approximateInvokeCount": 3 }, "requestPayload": { "ORDER_IDS": [ "9e07af03-ce31-4ff3-xmpl-36dce652cb4f", "637de236-e7b2-464e-xmpl-baf57f86bb53", "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15" ] }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "responsePayload": { "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request" } }

다음 단계에서는 Lambda 콘솔을 사용하여 함수의 대상을 구성하는 방법을 설명합니다.

비동기 호출 레코드의 대상 구성
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 함수 개요(Function overview)에서 대상 추가(Add destination)를 선택합니다.

  4. 소스에서 비동기식 호출을 선택합니다.

  5. Condition(조건)에서 다음 옵션 중에 선택합니다.

    • 실패 시 – 이벤트가 모든 처리 시도에 실패하거나 최대 기간을 초과할 때 레코드를 전송합니다.

    • 성공 시 – 함수가 비동기식 호출을 성공적으로 처리할 때 레코드를 전송합니다.

  6. Destination type(대상 유형)에서 호출 레코드를 수신하는 리소스 유형을 선택합니다.

  7. Destination(대상)에서 리소스를 선택합니다.

  8. 저장을 선택합니다.

호출이 조건과 일치하면 Lambda는 호출에 대한 세부 정보가 포함된 JSON 문서를 대상으로 전송합니다.

대상별 JSON 형식
  • Amazon SQS 및 Amazon SNS(SnsDestinationSqsDestination)의 경우 호출 레코드는 Message로 대상에 전달됩니다.

  • Lambda(LambdaDestination)의 경우 호출 레코드는 페이로드로 함수에 전달됩니다.

  • EventBridge(EventBridgeDestination)의 경우 호출 레코드는 PutEvents 호출의 detail로 전달됩니다. source 이벤트 필드의 값은 lambda입니다. detail-type 이벤트 필드의 값은 Lambda 함수 호출 결과 - 성공 또는 Lambda 함수 호출 결과 - 실패입니다. resource 이벤트 필드에는 함수와 대상 Amazon 리소스 이름(ARN)이 포함됩니다. 다른 이벤트 필드의 경우 Amazon EventBridge 이벤트를 참조하세요.

다음 예제에서는 함수 오류로 인해 처리에 연속 3회 실패한 이벤트에 대한 호출 레코드를 보여 줍니다.

예 호출 레코드
{ "version": "1.0", "timestamp": "2019-11-14T18:16:05.568Z", "requestContext": { "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST", "condition": "RetriesExhausted", "approximateInvokeCount": 3 }, "requestPayload": { "ORDER_IDS": [ "9e07af03-ce31-4ff3-xmpl-36dce652cb4f", "637de236-e7b2-464e-xmpl-baf57f86bb53", "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15" ] }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "responsePayload": { "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request" } }

호출 레코드에는 이벤트, 응답 및 레코드가 전송된 이유에 대한 세부 정보가 포함되어 있습니다.

목적지로 향하는 요청 추적

AWS X-Ray을 사용하면 대기열에 추가되고, Lambda 함수에서 처리되고, 대상 서비스로 전달되는 각 요청의 연결된 보기를 볼 수 있습니다. 함수 또는 함수를 호출하는 서비스에 대해 X-Ray 추적을 활성화하면 Lambda는 요청에 X-Ray 헤더를 추가하고 헤더를 대상 서비스에 전달합니다. 업스트림 서비스의 추적은 다운스트림 Lambda 함수 및 대상 서비스의 추적과 자동으로 연결되므로 전체 애플리케이션을 종합적으로 파악할 수 있습니다. 추적에 대한 자세한 내용은 AWS X-Ray로 Lambda 함수 간접 호출 시각화의 내용을 참조하세요.

배달 못한 편지 대기열

on-failure 대상의 대안으로, 이후 처리를 위해 폐기된 이벤트를 저장하기 위해 배달 못한 편지 대기열을 사용하여 함수를 구성할 수 있습니다. 배달 못한 편지 대기열은 이벤트가 모든 처리 시도에 실패하거나 처리되지 않고 만료될 때 사용된다는 점에서 on-failure 대상과 동일하게 작동합니다. 그러나 DLQ(Dead Letter Queue)은 함수 수준에서만 추가하거나 제거할 수 있습니다. 함수 버전은 게시되지 않은 버전($LATEST)과 동일한 DLQ(Dead Letter Queue) 설정을 사용합니다. On-failure 대상은 추가 대상도 지원하며, 호출 레코드에 함수의 응답에 관한 세부 정보를 포함합니다.

배달 못한 편지 대기열의 이벤트를 다시 처리하려면 Lambda 함수의 이벤트 소스로 설정하면 됩니다. 또는 수동으로 이벤트를 검색할 수도 있습니다.

배달 못한 편지 대기열에 대한 Amazon SQS 표준 대기열 또는 Amazon SNS 표준 주제를 선택할 수 있습니다. FIFO 대기열과 Amazon SNS FIFO 주제는 지원되지 않습니다. 대기열 또는 주제가 없는 경우 생성합니다. 사용 사례에 부합하는 대상 유형을 선택합니다.

  • Amazon SQS 대기열 – 대기열은 실패한 이벤트를 검색될 때까지 보관합니다. Lambda 함수 또는 CloudWatch 경보와 같은 단일 엔터티가 실패한 이벤트를 처리해야 하는 경우 Amazon SQS 표준 대기열을 선택합니다. 자세한 내용은 Amazon SQS에서 Lambda 사용 단원을 참조하십시오.

    Amazon SQS 콘솔을 사용하여 대기열을 생성합니다.

  • Amazon SNS 주제 – 주제는 실패한 이벤트를 한 개 이상의 대상으로 전달합니다. 실패한 이벤트에 대해 여러 엔터티가 작동할 것으로 예상되는 경우 Amazon SNS 표준 주제를 선택합니다. 예를 들어 이벤트를 이메일 주소, Lambda 함수 및/또는 HTTP 엔드포인트로 전송하도록 주제를 구성할 수 있습니다. 자세한 내용은 Amazon SNS 알림을 사용하여 Lambda 함수 간접 호출 단원을 참조하십시오.

    Amazon SNS 콘솔에서 주제를 생성합니다.

대기열 또는 주제로 이벤트를 전송하려면 함수에 추가 권한이 필요합니다. 필요한 권한이 있는 정책을 함수의 실행 역할에 추가합니다.

대상 대기열 또는 주제가 고객 관리형 키로 암호화되는 경우, 실행 역할은 키의 리소스 기반 정책의 사용자여야 합니다.

대상을 생성하고 함수의 실행 역할을 업데이트한 후 배달 못한 편지 대기열을 함수에 추가합니다. 여러 함수에서 동일한 대상으로 이벤트를 전송하도록 구성할 수 있습니다.

배달 못한 편지 대기열을 구성하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 구성(Configuration)을 선택한 다음 비동기식 호출(Asynchronous invocation)을 선택합니다.

  4. 비동기식 호출에서 편집을 선택합니다.

  5. DLQ 리소스Amazon SQS 또는 Amazon SNS로 설정합니다.

  6. 대상 대기열 또는 주제를 선택합니다.

  7. 저장을 선택합니다.

AWS CLI를 이용해 배달 못한 편지 대기열을 구성하려면 update-function-configuration 명령을 사용하세요.

aws lambda update-function-configuration --function-name my-function \ --dead-letter-config TargetArn=arn:aws:sns:us-east-2:123456789012:my-topic

Lambda는 이벤트를 속성 관련 추가 정보와 함께 배달 못한 편지 대기열에 있는 그대로 보냅니다. 이 정보를 사용해 함수가 반환한 오류를 식별하거나 이벤트와 로그 또는 AWS X-Ray 트레이스의 상관 관계를 알 수 있습니다.

배달 못한 편지 대기열 메시지 속성
  • RequestID(문자열) – 호출 요청의 ID입니다. 요청 ID는 함수 로그에 표시됩니다. X-Ray SDK를 사용하여 트레이스의 속성에 대한 요청 ID를 기록할 수도 있습니다. 그런 다음 X-Ray 콘솔에서 요청 ID로 트레이스를 검색할 수 있습니다.

  • ErrorCode(숫자) – HTTP 상태 코드입니다.

  • ErrorMessage(문자열) – 오류 메시지의 첫 1KB입니다.

Lambda는 배달 못한 편지 대기열로 메시지를 전송할 수 없는 경우 이벤트를 삭제하고 DeadLetterErrors 지표를 내보냅니다. 이것은 권한이 없는 경우나 메시지 총 크기가 대상 대기열이나 주제의 한도를 초과하는 경우에 발생할 수 있습니다. 예를 들어 본문의 크기가 256KB에 가까운 Amazon SNS 알림이 함수를 트리거하여 오류가 발생한다고 가정합니다. 이 경우 Amazon SNS가 추가하는 이벤트 데이터가 Lambda가 추가하는 속성과 결합되어 메시지가 DLQ(Dead Letter Queue)에서 허용하는 최대 크기를 초과하게 될 수 있습니다.

Amazon SQS를 이벤트 소스로 사용하는 경우, Lambda 함수가 아닌 Amazon SQS 대기열 자체에 배달 못한 편지 대기열을 구성합니다. 자세한 내용은 Amazon SQS에서 Lambda 사용 섹션을 참조하세요.