AWS Lambda의 Cold Start를 피하기 위한 해결책으로 Provisioned Concurrency를 도입하기도 합니다. aws lambda의 공식문서에는 아래 그림과 같이 provisioned concurrency 에서 t3 구간에서는 "Nothing happens" 라고 설명합니다.
하지만, 이것은 틀렸습니다. concurrency 즉 동시성을 보장할 뿐, 해당 실행환경 (execution environment)을 보장하지는 않습니다.
이 말은 무슨 뜻일까요 ?
람다가 실행될 때는 (Invoke) 람다가 실행될 실행환경 (컴퓨팅 환경)을 준비합니다. # Init
람다 함수가 호출됩니다. # Invoke
람다 함수가 종료됩니다. #Shutdown
하나의 실행환경이 준비되고, 람다가 호출됩니다. 람다 함수가 한 번 호출되면 실행환경은 일정 시간동안 실행되고 있습니다. 이때 람다 함수가 한 번 더 호출되면 Init 없이 람다가 호출됩니다. 이를 Warm Start 라고 합니다.
그렇다면, 항상 람다가 Warm Start 하도록 할 수 있을까요 ? 이러한 기능으로 출시된 게 Provisioned Concurrency 입니다. Provisioned Concurrency는 실행환경이 유지되는 동안 최초 요청을 제외하고 Init을 보장해줍니다.
provisioned concurrency를 잘 쓰기 위해서는 람다 함수를 어떻게 작성하면 좋을까요 ?
람다 함수는 invoke시 메인 함수가 호출됩니다. 이 함수에 정의되지 않은 함수 바깥에 있는 전역 변수들은 init에서 미리 호출됩니다.
메인 함수의 실행 시간을 줄이기 위해 메인함수에서 선언하지 않아도 되는 전역 변수들을 메인 함수 바깥으로 빼놓는다면 provisioned concurrency의 효과를 극대화할 수 있습니다.
provisioned concurrency가 실패하는 경우는 어떤 경우일까요 ?
전역 변수를 선언하는 데 드는 시간이 130초 혹은 람다의 타임아웃중 더 큰 값보다 더 걸리는 경우 provision이 실패할 수 있습니다.
예를 들어, 이런 코드가 있습니다.
import json
import time
time.sleep(135)
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
전역에 설정한 time.sleep(135) 에 의해서 130초보다 더 큰 시간이 필요하므로 provisioned concurrency 가 구성이 실패할 수 있습니다.
'AWS' 카테고리의 다른 글
SES가 꺼졌다. (1) | 2024.02.24 |
---|---|
JIRA에서 IAM 권한 요청 관리하기 (0) | 2024.02.12 |
IAM 서비스 알고 쓰자 - 1 (0) | 2023.09.28 |
EC2에서 로그 확인 (0) | 2023.08.31 |
AWS CodeWhisperer를 활용하기 (0) | 2023.04.18 |