AWS/AWS 알아두면 좋은 지식

[Lambda] 재귀루프 감지(recursive loop detection)에 대하여 알아보자.

[앙금빵] 2024. 5. 26.

개요

갑작스럽게 AWS 측으로부터 재귀호출이 탐지되어져 함수가 중단되었다는 통보를 받게 되었다.

이와 관련하여 어떤 조건을 충족하여 해당 알림을 받게되었는지 알아보자.

 

내용

(1) 2023년 7월 5일부터 AWS Lambda는 특정 재귀 호출을 자동으로 감지하고 중지하는 기능인 재귀 루프(recursion loop) 감지를 도입하였다.

 

(2) Lambda는 특정 Event가 발생할 때 함수 코드를 실행하는 Event 기반 컴퓨팅 서비스이며 재귀 루프(recursion loop)는 Event 추적을 통해 감지되어진다.

 

(3) 기본적으로 람다함수가 생성되어질 때 재귀 루프 감지가 활성화 되어져 있다.

 

(4) 재귀 루프 감지를 위해 Lambda는 AWS X-Ray 기반 'lineage'라는 헤더를 이용하여 동일한 이벤트로 함수가 호출된 횟수를 추적한다.

 

(5) 동일한 request chain에서 16번 이상 호출이 되어진 경우 다음 함수 호출을 자동으로 중지하고 해당 감지 내용에 대하여 안내를 한다. ('Lambda runaway termination notification' PHD 이벤트 )

 

(6) 만약 의도한 경우 AWS Support 에 감지 중단을 요청해야 한다. 단, region 레벨로 적용되기에 감지 중단 활성화 시 해당 리전에 운영중인 모든 lambda 함수에 대하여 재귀호출 감지를 중단한다.

 

재귀호출 횟수 확인방법

그렇다면 운영중인 Lambda 함수에서 재귀호출이 몇번이나 일어나는지는 어떻게 알 수 있을까?

Lambda가 자체적으로 저장하고 있는 환경변수를 이용하여 확인할 수 있다.

[+] https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-retrieve

 

Using Lambda environment variables - AWS Lambda

In some cases, you may need to use the following format: region = os.environ.get('AWS_REGION')

docs.aws.amazon.com

 

본문에서 언급했듯이 재귀호출 탐지는 AWS X-Ray 기반 'lineage'라는 헤더를 이용한다. 이를 통해 한 이벤트당 몇번 호출하는지 확인할 수 있다.

#Python 예시
print(os.environ['_X_AMZN_TRACE_ID'])

#Java 예시
String lineage_header = System.getenv("_X_AMZN_TRACE_ID");

 

아래 출력 결과인 경우 Lineage=43e12f0f:5 임을 확인할 수 있다. 즉, 5번 호출한다는 의미이다.

X-Amzn-Trace-Id:Root=1-645f7998-
4b1e232810b0bb733dba2eab;Parent=5be88d12eefc1fc0;Sampled=1;Lineage=43e12f0f:5

 

 

 


Reference

[1]  https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html

[2] https://aws.amazon.com/blogs/compute/detecting-and-stopping-recursive-loops-in-aws-lambda-functions/

[3] https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-retrieve

댓글