AWS Lambda에서 Oracle에 접근하기 위한 Python Layer 만들기
AWS Lambda 함수에서 Oracle 데이터베이스에 접근하려면 oracledb
모듈을 사용해야 합니다. 하지만 이 모듈을 Lambda에서 사용하기 위해서는 Layer를 만들어야 합니다. 이번 포스팅에서는 AWS Lambda에서 Oracle에 접근하기 위한 Python Layer를 만드는 방법과 발생할 수 있는 오류 및 해결 방법을 소개합니다.
문제 상황
AWS Lambda 함수에서 oracledb
모듈을 사용하기 위해 Layer를 생성하고 함수를 실행했을 때, 다음과 같은 오류가 발생했습니다.
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': cannot import name 'base_impl' from partially initialized module 'oracledb' (most likely due to a circular import) (/opt/python/lib/python3.11/site-packages/oracledb/__init__.py)
Traceback (most recent call last):INIT_REPORT Init Duration: 93.00 ms Phase: init Status: error Error Type: Runtime.Unknown
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': cannot import name 'base_impl' from partially initialized module 'oracledb' (most likely due to a circular import) (/opt/python/lib/python3.11/site-packages/oracledb/__init__.py)
Traceback (most recent call last):INIT_REPORT Init Duration: 1363.42 ms Phase: invoke Status: error Error Type: Runtime.Unknown
오류의 원인은 레이어에 가상 환경을 구성하는 pip 와 같은 모듈이 섞여 발생하는 문제였습니다.
Layer 생성 방법
AWS Lambda에서 Python 함수용 Layer를 생성하기 위해 AWS 공식 문서인 Python Lambda 함수를 위한 계층 작업을 참고하여 다음과 같이 Layer를 생성했습니다.
1. 가상 환경 생성 및 패키지 설치
먼저, Python 3.11 버전의 가상 환경을 생성하고 필요한 패키지를 설치합니다.
requirements.txt
oracledb
1-install.sh
python3.11 -m venv create_layer
source create_layer/bin/activate
pip install -r requirements.txt --platform=manylinux2014_x86_64 --only-binary=:all: --target ./create_layer/lib/python3.11/site-packages
2. Layer 패키징
2-package.sh
mkdir python
cp -r create_layer/lib python/
zip -r layer_content.zip python
Lambda 함수 코드
Lambda 함수에서는 oracledb
모듈을 임포트하여 사용합니다.
lambda_function.py
def lambda_handler(event, context):
try:
import oracledb
return "Successfully imported oracledb"
except Exception as e:
return str(e)
오류 발생
위와 같이 Layer를 생성하고 Lambda 함수를 실행했을 때, 앞서 언급한 오류가 발생했습니다.
원인 분석
오류 메시지를 보면 oracledb
모듈에서 base_impl
을 임포트할 수 없다는 내용과 순환 임포트(circular import)가 원인일 수 있다는 힌트를 제공합니다.
Layer를 생성할 때 가상 환경을 생성하면서 기본적으로 설치되는 pip
등의 모듈이 함께 포함되어 oracledb
모듈과 충돌이 발생한 것입니다.
해결 방법
가상 환경에서 기본적으로 생성되는 불필요한 모듈들을 제외하고, 필요한 패키지만 Layer에 포함하도록 스크립트를 수정했습니다.
수정된 Layer 생성 스크립트
1-install.sh
python3.11 -m venv create_layer
source create_layer/bin/activate
pip install -r requirements.txt \
--platform manylinux2014_x86_64 \
--target=./src \
--implementation cp \
--python-version 3.11 \
--only-binary=:all:
--target=./src
옵션을 사용하여 필요한 패키지만src
디렉토리에 설치합니다.- 가상 환경의 기본 모듈들과 분리하여 충돌을 방지합니다.
2-package.sh
mkdir -p python/lib/python3.11/site-packages
cp -r src/ python/lib/python3.11/site-packages/
zip -r layer_content.zip python
src
디렉토리에 설치된 패키지들을 Layer의site-packages
디렉토리로 복사합니다.
결과 확인
수정된 Layer를 적용하여 Lambda 함수를 실행하면 oracledb
모듈이 성공적으로 임포트됩니다.
"Successfully imported oracledb"
결론
AWS Lambda에서 Oracle에 접근하기 위한 Python Layer를 생성할 때, 가상 환경의 기본 모듈들과의 충돌로 인해 발생하는 오류를 해결하기 위해 필요한 패키지만 Layer에 포함시켰습니다. 이를 통해 oracledb
모듈을 성공적으로 임포트하고 Oracle 데이터베이스에 접근할 수 있었습니다.