프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

 

Lambda를 비동기로 호출해야 할 경우

 

AWS SDK(python용 sdk는 boto3)를 이용해서 Lambda 함수를 호출할 수 있는데,

이를 그대로 Lambda에서 사용하면 다른 Lambda 함수를 호출할 수 있게 된다.

boto3의 경우, 라이브러리 업로드 없이도 import 가능하므로 lambda에서의 사용도 편리하다.

 

 

이때 고려해 볼 문제로는 Lambda가 15분의 시간제한이 있다는 것이다.

호출한 후 값의 반환을 기다릴 필요가 없는 함수를 사용한다면, 이를 동기식(응답 대기)으로 호출하는 것은 시간과 비용에서 비효율적이다.

 

 

물론 AWS SDK는 이미 Lambda를 비동기식으로 호출하는 api 옵션을 제공한다.

 

 

 

 

 

Invoke API

 

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/API_Invoke.html

 

Invoke - AWS Lambda

Invoke Lambda 함수를 호출합니다. 동기식(응답 대기) 또는 비동기식으로 함수를 호출할 수 있습니다. 기본적으로 Lambda는 함수를 동기식으로 간접적으로 호출합니다(예: InvocationType은 RequestResponse

docs.aws.amazon.com

 

 

invoke 호출 시 InvocationType을 ' Event '로 명시하면 비동기로 호출해 준다.

(기본적으로는 동기 호출이다.)

# 상위 Lambda function

import json
import boto3

def lambda_handler(event, context):
    # TODO implement
    
    body = {"user_id": "aadd"}
    lambda_service = boto3.client(service_name='lambda', region_name="ap-northeast-2")
    
    functionName="001_TATTOO_Alarm"
    lambda_service.invoke(FunctionName=functionName, InvocationType='Event', Payload=json.dumps(body))
    
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

 

 

 

# 호출되는 하위 Lambda function

import json
import time

def lambda_handler(event, context):
    print("child lambda run!")
    time.sleep(5)
    
    print(event)	#전달 받은 json 데이터
    
    
    return {
        'statusCode': 200,
        'body': json.dumps('child lambda run!')
    }

 

하위 fucntion은 5초간 정지한 후 종료(실제로는 시간이 걸리는 로직 실행 후 종료를 가정) 되기 때문에 만약 동기식으로 호출된다면, 상위 lambda 함수도 5초간 응답을 대기하게 된다. 

하지만 비동기식으로 호출해 주었기 때문에 아래와 같이 로그를 확인해 보면 상위 함수는 실행이 바로 종료되는 것을 확인할 수 있다.

 

 

 

 

상위 함수

상위 함수 로그는 하위 함수 호출 후 실행 종료

 

 

 

하위 함수

하위 함수는 5초 후 종료

 

 

 

 

 

이벤트 오류 대처

 

오류가 발생하면 함수가 여러 번 호출될 수 있습니다. 재시도 동작은 오류 유형, 클라이언트, 이벤트 소스, 호출 유형에 따라 다릅니다. 예를 들어 함수를 비동기식으로 호출했는 데 오류를 반환한 경우 Lambda는 함수를 최대 두 번 더 실행합니다. 

 

 

비동기 호출의 경우 이벤트를 함수로 보내기 전에 Lambda가 이벤트를 대기열에 추가합니다. 대기열에 맞출 수 있는 함수의 용량이 충분하지 않으면 이벤트가 손실될 수 있습니다. 경우에 따라 오류가 발생하지 않더라도 함수가 동일한 이벤트를 여러 번 수신할 수 있습니다. 처리되지 않은 이벤트를 유지하려면 배달 못한 편지 대기열로 함수를 구성합니다.

 

 

호출 시 오류가 발생한 다면, 재시도 횟수와 배달 못한 편지 대기열 서비스를 설정할 수 있다.

 

 

 

특히 대기열 초과로 lambda 이벤트가 손실된다면, 주문 및 결제와 같은 서비스에서 치명적일 수 있다.

 

이럴 때는 SQS와 같은 서비스를 통해서 추가적인 이벤트 오류 케이스를 재처리해 주어야 한다.

AWS Lambda는 이를 배달 못한 편지 대기열 서비스로 제공해 준다.

 

 

 

 

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함