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 호출 시 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초간 응답을 대기하게 된다.
하지만 비동기식으로 호출해 주었기 때문에 아래와 같이 로그를 확인해 보면 상위 함수는 실행이 바로 종료되는 것을 확인할 수 있다.
상위 함수
하위 함수
이벤트 오류 대처
오류가 발생하면 함수가 여러 번 호출될 수 있습니다. 재시도 동작은 오류 유형, 클라이언트, 이벤트 소스, 호출 유형에 따라 다릅니다. 예를 들어 함수를 비동기식으로 호출했는 데 오류를 반환한 경우 Lambda는 함수를 최대 두 번 더 실행합니다.
비동기 호출의 경우 이벤트를 함수로 보내기 전에 Lambda가 이벤트를 대기열에 추가합니다. 대기열에 맞출 수 있는 함수의 용량이 충분하지 않으면 이벤트가 손실될 수 있습니다. 경우에 따라 오류가 발생하지 않더라도 함수가 동일한 이벤트를 여러 번 수신할 수 있습니다. 처리되지 않은 이벤트를 유지하려면 배달 못한 편지 대기열로 함수를 구성합니다.
호출 시 오류가 발생한 다면, 재시도 횟수와 배달 못한 편지 대기열 서비스를 설정할 수 있다.
특히 대기열 초과로 lambda 이벤트가 손실된다면, 주문 및 결제와 같은 서비스에서 치명적일 수 있다.
이럴 때는 SQS와 같은 서비스를 통해서 추가적인 이벤트 오류 케이스를 재처리해 주어야 한다.
AWS Lambda는 이를 배달 못한 편지 대기열 서비스로 제공해 준다.
'Cloud > AWS' 카테고리의 다른 글
AWS IAM User Group (사용자 그룹) (0) | 2024.03.20 |
---|---|
AWS load balancer internal vs internet-facing (0) | 2023.12.23 |
AWS Lambda로 Slack에 메시지 전송하기 (SNS 트리거) (0) | 2023.10.12 |
AWS boto3로 SNS Topic에 메시지 전송하기 (python) (0) | 2023.10.10 |
ECS 태스크 실행 오류 (ECR pull error) (0) | 2023.09.19 |