비동기식 호출 - AWS Lambda

비동기식 호출

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

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


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

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

$ aws lambda invoke --function-name my-function --invocation-type Event --payload '{ "key": "value" }' response.json { "StatusCode": 202 }

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

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


      Lambda는 각 시도를 하위 세그먼트에 기록합니다.

함수에 모든 이벤트를 처리하는 데 사용할 수 있을 정도로 동시성이 충분하지 않은 경우 추가 요청은 제한됩니다. 조절 오류(429) 및 시스템 오류(500 시리즈)의 경우 Lambda는 이벤트를 대기열로 반환하고 최대 6시간 동안 함수 재실행을 시도합니다. 재시도 간격은 첫 번째 시도 후 1초에서 최대 5분까지 기하급수적으로 증가합니다. 그러나 대기열이 백업되는 경우 시간이 더 길어질 수 있습니다. 또한 Lambda가 대기열에서 이벤트를 읽는 속도도 느려집니다.

다음 예제에서는 대기열에 성공적으로 추가되었지만 제한으로 인해 1시간 후에도 보류 중인 이벤트를 보여줍니다.


      조정된 요청은 AWS X-Ray에서 대기 중으로 표시됩니다.

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

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

호출 레코드를 다른 서비스로 보내도록 Lambda를 구성할 수도 있습니다. Lambda는 비동기 호출에 대해 다음과 같은 대상을 지원합니다.

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

  • Amazon SNS – SNS 주제입니다.

  • AWS Lambda – Lambda 함수입니다.

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

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

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

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

오류 처리를 구성하려면

  1. Lambda 콘솔 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

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

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

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

    • 재시도 시도 – 함수가 오류를 반환할 때 0에서 2 사이의 Lambda 재시도 횟수입니다.

  5. 저장을 선택합니다.

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

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

비동기 호출 레코드를 다른 서비스로 전송하려면 함수에 대상을 추가합니다. 처리에 실패한 이벤트와 성공적으로 처리된 이벤트에 대해 별도의 대상을 구성할 수 있습니다. 오류 처리 설정과 마찬가지로 함수, 버전 또는 별칭에 대상을 구성할 수 있습니다.

다음 예제에서는 비동기 호출을 처리하는 함수를 보여 줍니다. 함수가 성공 응답을 반환하거나 오류 없이 종료되면 Lambda에서 호출 레코드를 EventBridge 이벤트 버스에 보냅니다. 이벤트가 모든 처리 시도에 실패하면 Lambda에서 호출 레코드를 Amazon SQS 대기열에 보냅니다.


        Lambda는 결과에 따라 대기열 또는 이벤트 버스 대상으로 호출 레코드를 보냅니다.

이벤트를 대상에 전송하려면 함수에 추가 권한이 필요합니다. 필요한 권한이 있는 정책을 함수의 실행 역할에 추가합니다. 다음과 같이 각 대상 서비스에는 서로 다른 권한이 필요합니다.

Lambda 콘솔의 함수 디자이너에서 함수에 대상을 추가합니다.

비동기 호출 레코드의 대상을 구성하려면

  1. Lambda 콘솔 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 디자이너에서 대상 추가를 선택합니다.

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

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

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

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

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

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

  8. 저장을 선택합니다.

호출이 조건과 일치하면 Lambda는 호출에 대한 세부 정보가 포함된 JSON 문서를 대상으로 전송합니다. 다음 예제에서는 함수 오류로 인해 처리에 연속 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" } }

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

비동기 호출 구성 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" } } }

AWS Lambda 함수 배달 못한 편지 대기열

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

대기열 또는 주제가 없는 경우 생성합니다. 사용 사례에 부합하는 대상 유형을 선택합니다.

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

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

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

배달 못한 편지 대기열을 구성하려면

  1. Lambda 콘솔 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

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

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

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

  6. Save를 선택합니다.

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 지표를 내보냅니다. 이것은 권한이 없는 경우나 메시지 총 크기가 대상 대기열이나 주제의 한도를 초과하는 경우에 발생할 수 있습니다. 예를 들어 본문이 256 KB에 근접한 Amazon SNS 알림이 오류를 발생시키는 함수를 트리거하면 Amazon SNS에서 추가된 이벤트 데이터가 Lambda에서 추가된 속성과 결합되어 메시지가 배달 못한 편지 대기열에서 허용되는 최대 크기를 초과하는 경우가 발생할 수 있습니다.

Amazon SQS을 이벤트 소스로 사용하는 경우, Lambda 함수가 아닌 Amazon SQS 대기열 자체에 배달 못한 편지 대기열을 구성합니다. 자세한 내용은 Using AWS Lambda with Amazon SQS 단원을 참조하십시오.