ExecutionContext
1 AWS Lambda 실행 컨텍스트 (Execution Context)
- AWS Lambda의 실행 컨텍스트는 Lambda 함수의 성능과 효율성에 중요한 역할을 합니다.
- 이 글에서는 실행 컨텍스트의 개념, 특징, 그리고 최적화 방법에 대해 알아보겠습니다.
2 실행 컨텍스트란?
- 실행 컨텍스트는 Lambda 함수의 코드를 실행하기 위한 격리된 환경입니다.
- 이는 함수 코드와 그 종속성을 초기화하고 실행하는 임시 런타임 환경을 제공합니다.
- 데이터베이스 연결, HTTP 클라이언트, SDK 클라이언트 등을 위한 환경을 포함합니다.
- Lambda 서비스는 향후 함수 호출을 대비하여 일정 시간 동안 이 컨텍스트를 유지합니다.
3 실행 컨텍스트의 특징
- 재사용성: 다음 함수 호출 시 이전에 생성된 컨텍스트를 "재사용"할 수 있습니다.
- 시간 절약: 연결 객체 초기화에 필요한 시간을 절약할 수 있습니다.
- /tmp 디렉토리: 실 행 컨텍스트에는 /tmp 디렉토리가 포함되어 있어 임시 파일 저장이 가능합니다.
- 격리성: 각 실행 컨텍스트는 다른 Lambda 함수나 AWS 고객의 코드로부터 완전히 격리됩니다.
- 유지 시간: 실행 컨텍스트는 일정 시간 동안 유지되며, 이 기간 동안 여러 Lambda 호출이 동일한 컨텍스트를 공유할 수 있습니다.
- 상태 공유: 동일한 실행 컨텍스트에서 실행되는 Lambda 호출들은 컨텍스트의 상태를 공유할 수 있습니다.
4 실행 컨텍스트의 생명주기
- Lambda 함수가 처음 호출될 때 새로운 실행 컨텍스트가 생성됩니다. 이를 "콜드 스타트"라고 합니다.
- 이후 호출에서는 기존 컨텍스트가 재사용될 수 있습니다. 이를 "웜 스타트"라고 합니다.
- AWS는 일정 시간 동안 실행 컨텍스트를 유지합니다.
- 이 시간은 가변적이며 AWS에 의해 관리됩니다.
- 일정 시간 동안 사용되지 않거나 AWS에 의해 결정된 경우 실행 컨텍스트는 종료됩니다.
5 실행 컨텍스트 최적화
5.1 핸들러 외부에서 초기화 하기
- Lambda 함수의 성능을 최적화하는 중요한 방법 중 하나는 핸들러 함수 외부에서 초기화 작업을 수행하는 것입니다.
잘못된 예시
import os
def get_user_handler(event, context):
DB_URL = os.getenv("DB_URL")
db_client = db.connect(DB_URL)
user = db_client.get(user_id = event["user_id"])
return user
올바른 예시
import os
DB_URL = os.getenv("DB_URL")
db_client = db.connect(DB_URL)
def get_user_handler(event, context):
user = db_client.get(user_id = event["user_id"])
return user
- 이 방식에서는 DB 연결이 한 번만 설정되고, 이후의 호출에서 재사용됩니다.
5.2 최적화의 이점
- 성능 향상: 연결 객체 초기화 시간을 절약하여 함수 실행 시간을 단축할 수 있습니다.
- 비용 절감: 실행 시간 감소는 곧 비용 절감으로 이어집니다.
- 리소스 효율성: 불필요한 연결 생성을 줄여 리소스를 효율적으로 사용할 수 있습니다.
6 Lambda 함수의 /tmp 공간 활용
- Lambda 함수에서 /tmp 디렉토리를 활용하면 다양한 작업을 수행할 수 있습니다.
6.1 /tmp 디렉토리의 특징
- 용량: 최대 10GB까지 사용 가능합니다.
- 지속성: 실행 컨텍스트가 유지되는 동안 /tmp 디렉토리의 내용이 유지됩니다.
- 캐시 활용: 여러 호출에 걸쳐 사용할 수 있는 임시 캐시로 활용 가능합니다.
- 독립성: 각 실행 컨텍스트는 자체적인 /tmp 디렉토리를 가지며, 다른 컨텍스트와 공유되지 않습니다.
6.2 /tmp 디렉토리 활용 사례
- 대용량 파일 다운로드: 함수 실행에 필요한 큰 파일을 임시로 저장할 수 있습니다.
- 디스크 작업: 디스크 공간이 필요한 연산을 수행할 수 있습니다.
- 작업 체크포인트: 장기 실행 작업의 중간 결과를 저장할 수 있습니다.
6.3 /tmp 사용 시 주의사항
- 임시 저장소: 영구적인 데이터 저장이 필요한 경우 S3를 사용해야 합니다.
- 암호화: /tmp의 내용을 암호화해야 할 경우, KMS 데이터 키를 생성하여 사용해야 합니다.
- 용량 제한: 10GB 제한을 초과하지 않도록 주의해야 합니다.
7 실행 컨텍스트 활용 시 주의사항
- 상태 관리: 실행 컨텍스트가 재사용될 수 있으므로, 함수 간 상태 공유에 주의해야 합니다. 특히 전역 변수 사용 시 주의가 필요합니다.
- 타임아웃 고려: 컨텍스트 유지 시간이 제한적이므로, 장시간 연결이 필요한 경우 별도의 전략이 필요할 수 있습니다.
- 메모리 사용: /tmp 디렉토리 사용 시 할당된 메모리 한도를 고려해야 합니다.
- 동시성: 여러 실행 컨텍스트가 동시에 존재할 수 있으며, 각각은 독립적인 환경을 가집니다.
- 비결정적 동작: 실행 컨텍스트의 재사용 여부는 AWS에 의해 결정되므로, 함수 로직이 이에 의존해서는 안 됩니다.
8 실행 컨텍스트 공유의 이해
- 동일한 실행 컨텍스트 내에서 실행되는 Lambda 호출들은 일부 리소스와 상태를 공유할 수 있습니다.
- 이는 성능 최적화에 도움이 되지만, 잘못 사용하면 예기치 않은 동작을 야기할 수 있습니다.
8.1 공유되는 요소
- 초기화된 변수: 핸들러 외부에서 정의된 변수들은 여러 호출 간에 공유될 수 있습니다.
- 데이터베이스 연결: 한 번 설정된 DB 연결은 여러 호출에서 재사용될 수 있습니다.
- /tmp 디렉토리: 동일한 컨텍스트 내에서 /tmp의 내용이 유지됩니다.