python lambda 에서 오라클 db에 접속하기가 쉽지 않습니다. 오라클이 상용DB 이다 보니, 여러가지로 open 소스에 잘 맞지 않는것 같습니다. node lambda 로 오라클을 접속해보려다가, 실패하고 python lambda 로 oracle 을 연동한 성공기 입니다.

우선 python 에서는 오라클을 사용하려면 cx_Oracle 라이브러리가 필요합니다. 단순히 pip3 install 로 이 패키지를 설치할 경우 local 에서는 사용할수가 있습니다. 하지만 개발자의 PC 가 windows냐, mac 이냐에 따라 다른 패키지가 설치되서 로컬에서 만든 lambda 함수를 AWS 에 업로드 하여 사용할 경우 경험하게 됩니다. 즉, cx_Oracle 라이브러리는 lambda 가 실행되는 동일한 머신의 OS(Amazon Linux) 에서 설치하여 압축을 하여 레이어로 업로드하여 사용해야 합니다.

간단히 설명하면, Amazon Linux AMI 이미지로 EC2 를 생성하여 pip3 install 로 cx_Oracle 를 설치하고 압축하여 lambda layer 로 업로드 하면됩니다. 아래와 같은 절차로 cx_Oracle layer 를 만듭니다.

임의 Amazon Linux 로 실행되는 EC2 를 생성하여 ssh 로 접속한 합니다.


sudo yum update -y && sudo yum install python3 -y

아래와 같이 폴더를 생성합니다.


mkdir ~/cx-oracle-layer && cd ~/cx-oracle-layer && mkdir python/ lib/

그리고 패지키를 설치합니다.


pip3 install cx_Oracle -t python/

오라클 클라이언트를 다운 받고, 압축을 풀어 lib 폴더에 넣습니다.


wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip -O oracle.zip
unzip -j oracle.zip -d lib/

이후에 python 폴더와 lib 폴더를 압축하여 s3에 업로드 합니다.


zip -r -y cx-oracle-layer.zip python/ lib/
aws s3 cp cx-oracle-layer.zip s3://MY-S3-BUCKET-NAME/cx-oracle-layer.zip

이제 AWS 콘솔 화면에서 oracle 접속이 필요한 lambda 함수에 layer를 만들어 넣습니다.

이제 python lambda 를 아래와 같이 샘플 테스트 합니다. 에러가 없으면 정상적으로 커넥션이 일어난 것입니다.


import cx_Oracle

def lambda_handler(event, context):
    url = 'XXXXX.XXXXX.ap-northeast-2.rds.amazonaws.com:1521/SID'
    user = 'username'
    pwd = 'password'

    con = cx_Oracle.connect(user + '/' + pwd + '@' + url)
    cur = con.cursor()
    cur.execute("select 1 from dual")
    cur.close()
    con.close()

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }