본문으로 건너뛰기

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의 내용이 유지됩니다.

8.2 공유의 장단점

  • 장점: 초기화 시간 단축, 리소스 효율성 증가, 전체적인 성능 향상
  • 단점: 잠재적인 상태 관리 문제, 예기치 않은 동작 가능성

8.3 모범 사례

  • 멱등성 유지: 함수가 이전 실행의 상태에 의존하지 않도록 설계합니다.
  • 명시적 초기화: 필요한 경우 함수 시작 시 상태를 명시적으로 초기화합니다.
  • 로깅 활용: 컨텍스트 재사용 여부를 로깅하여 디버깅에 활용합니다.

9 결론

  • Lambda 실행 컨텍스트를 이해하고 적절히 활용하면 함수의 성능을 크게 향상시킬 수 있습니다.
  • 핸들러 외부에서 초기화 작업을 수행하고, 연결 객체를 재사용하는 방식으로 최적화를 달성할 수 있습니다.
  • /tmp 디렉토리를 효과적으로 활용하면 Lambda 함수의 기능을 확장하고 성능을 개선할 수 있습니다.
  • 실행 컨텍스트의 공유 특성을 이해하고 적절히 활용하면 더욱 효율적인 Lambda 함수를 구현할 수 있습니다.
  • 그러나 상태 관리와 리소스 사용에 주의를 기울여야 하며, Lambda의 특성을 고려한 설계가 필요합니다.