비동기식 호출 - AWS Lambda

비동기식 호출

Amazon Simple Storage Service(S3), Amazon Simple Notification Service(SNS)와 같은 여러 AWS 서비스에서 함수를 비동기적으로 호출하여 이벤트를 처리합니다. 비동기적으로 함수를 호출하면 함수 코드에서 응답을 기다리지 않습니다. 이벤트를 Lambda에 전달하면 Lambda가 나머지를 처리합니다. Lambda가 오류를 처리하는 방법을 구성하고, 호출 레코드를 Amazon Simple Queue Service(Amazon SQS) 또는 Amazon EventBridge(EventBridge)와 같은 다운스트림 리소스로 전송하여 애플리케이션의 구성 요소를 하나로 연결할 수 있습니다.

Lambda가 비동기 호출을 처리하는 방법

다음 다이어그램은 Lambda 함수를 비동기적으로 호출하는 클라이언트를 보여줍니다. Lambda는 이벤트를 함수로 보내기 전에 대기열에 넣습니다.

클라이언트는 비동기적으로 함수를 호출합니다. Lambda는 이벤트를 함수로 보내기 전에 대기열에 넣습니다.

비동기식 호출의 경우 Lambda는 이벤트를 대기열에 배치하고 추가 정보 없이 성공 응답을 반환합니다. 별도의 프로세스를 통해 대기열에서 이벤트를 읽은 후 함수로 보냅니다. 함수를 비동기식으로 호출하려면 호출 유형 파라미터를 Event로 설정하세요.

aws lambda invoke \ --function-name my-function \ --invocation-type Event \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

cli-binary-format 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 aws configure set cli-binary-format raw-in-base64-out을(를) 실행하세요. 자세한 내용은 AWS CLI 지원되는 글로벌 명령줄 옵션을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

{ "StatusCode": 202 }

출력 파일(response.json)에는 아무런 정보도 포함되어 있지 않지만 이 명령을 실행하면 여전히 생성됩니다. Lambda가 이벤트를 대기열에 추가할 수 없는 경우 명령 출력에 오류 메시지가 나타납니다.

Lambda는 함수의 비동기 이벤트 대기열을 관리하고 오류를 다시 시도합니다. 함수가 오류를 반환하면 Lambda는 함수를 두 번 더 실행하려 합니다. 이때 첫 두 시도 간에는 1분의 대기 시간이 있으며, 두 번째와 세 번째 시도 간에는 2분의 대기 시간이 있습니다. 함수 오류에는 함수의 코드가 반환하는 오류와 제한 시간과 같이 함수의 런타임에서 반환하는 오류가 포함되어 있습니다.

함수에 모든 이벤트를 처리하는 데 사용할 수 있을 정도로 동시성이 충분하지 않은 경우 추가 요청은 제한됩니다. 제한 오류(429) 및 시스템 오류(500 시리즈)의 경우 Lambda는 이벤트를 대기열로 반환하고 최대 6시간 동안 함수 재실행을 시도합니다. 재시도 간격은 첫 번째 시도 후 1초에서 최대 5분까지 기하급수적으로 증가합니다. 대기열에 많은 항목이 있는 경우 Lambda는 재시도 간격을 늘리고 대기열에서 이벤트를 읽는 속도를 줄입니다.

함수가 오류를 반환하지 않는다 하더라도 대기열 자체가 최종적으로 일관성을 갖기 때문에 Lambda에서 동일한 이벤트를 여러 번 수신할 수 있습니다. 함수가 수신 이벤트를 따라잡을 수 없는 경우 이벤트는 함수로 전송되지 않고 대기열에서 삭제될 수도 있습니다. 함수 코드가 중복 이벤트를 정상적으로 처리하는지, 모든 호출을 처리할 수 있을 만큼의 가용 동시성이 있는지 확인하세요.

대기열이 매우 길면 Lambda가 새 이벤트를 함수로 전송하기 전에 해당 이벤트가 만료될 수 있습니다. 이벤트가 만료되거나 모든 처리 시도에 실패하면 Lambda는 이벤트를 삭제합니다. 함수에 대한 오류 처리를 구성하여 Lambda가 수행하는 재시도 횟수를 줄이거나, 처리되지 않은 이벤트를 더 빠르게 폐기할 수 있습니다.

호출 레코드를 다른 서비스에 전송하도록 Lambda를 구성할 수도 있습니다. Lambda는 비동기식 호출을 위해 다음의 대상을 지원합니다. SQS FIFO 대기열과 SNS FIFO 주제는 지원되지 않습니다.

  • 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) 대기열 또는 실패 시 이벤트 대상에서 이벤트를 반드시 사용해야 합니다.

비동기식 호출에 대한 오류 처리 구성

Lambda 콘솔을 사용하여 함수, 버전 또는 별칭에 대한 오류 처리 설정을 구성합니다.

오류 처리를 구성하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

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

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

  5. 다음 설정을 구성합니다.

    • 최대 이벤트 기간 - Lambda가 비동기 이벤트 대기열에서 이벤트를 유지하는 최대 시간입니다(최대 6시간).

    • 재시도 시도 - 함수가 오류를 반환할 때 Lambda 재시도 횟수입니다(0~2 사이).

  6. 저장을 선택합니다.

호출 이벤트가 최대 기간을 초과하거나 모든 재시도 시도에 실패하면 Lambda는 해당 이벤트를 폐기합니다. 취소된 이벤트의 복사본을 보존하려면 실패한 이벤트 대상을 구성합니다.

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

비동기 호출 레코드를 유지하려면 함수에 대상을 추가합니다. 성공한 또는 실패한 간접 호출을 대상으로 전송하도록 선택할 수 있습니다. 각 함수에는 여러 대상이 있을 수 있으므로 성공 및 실패한 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 대상으로 전송되는 각 레코드는 간접 호출에 대한 세부 정보가 포함된 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 함수 간접 호출 시각화의 내용을 참조하세요.

비동기식 호출 구성 API

AWS CLI 또는 AWS SDK를 사용하여 비동기식 호출 설정을 관리하려면 다음과 같은 API 작업을 사용합니다.

AWS CLI를 사용하여 비동기식 호출을 구성하려면 put-function-event-invoke-config 명령을 사용합니다. 다음 예제에서는 최대 이벤트 기간이 1시간이고 재시도가 없는 함수를 구성합니다.

aws lambda put-function-event-invoke-config --function-name error \ --maximum-event-age-in-seconds 3600 --maximum-retry-attempts 0

다음 결과가 표시됩니다:

{ "LastModified": 1573686021.479, "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:error:$LATEST", "MaximumRetryAttempts": 0, "MaximumEventAgeInSeconds": 3600, "DestinationConfig": { "OnSuccess": {}, "OnFailure": {} } }

put-function-event-invoke-config 명령은 함수, 버전 또는 별칭의 기존 구성을 덮어씁니다. 다른 옵션을 재설정하지 않고 옵션을 구성하려면 update-function-event-invoke-config를 사용합니다. 다음 예제에서는 이벤트를 처리할 수 없을 때 destination이라는 표준 SQS 대기열로 레코드를 전송하도록 Lambda를 구성합니다.

aws lambda update-function-event-invoke-config --function-name error \ --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-2:123456789012:destination"}}'

다음 결과가 표시됩니다.

{ "LastModified": 1573687896.493, "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:error:$LATEST", "MaximumRetryAttempts": 0, "MaximumEventAgeInSeconds": 3600, "DestinationConfig": { "OnSuccess": {}, "OnFailure": { "Destination": "arn:aws:sqs:us-east-2:123456789012:destination" } } }

배달 못한 편지 대기열

on-failure 대상의 대안으로, 이후 처리를 위해 폐기된 이벤트를 저장하기 위해 배달 못한 편지 대기열을 사용하여 함수를 구성할 수 있습니다. 배달 못한 편지 대기열은 이벤트가 모든 처리 시도에 실패하거나 처리되지 않고 만료될 때 사용된다는 점에서 on-failure 대상과 동일하게 작동합니다. 그러나 배달 못한 편지 대기열은 함수의 버전별 구성의 일부이므로 버전을 게시할 때 잠깁니다. 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입니다.

Amazon SQS 콘솔의 배달 못한 편지 대기열 이벤트 속성입니다.

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

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