AWS GLUE STUDIO – CX_ORACLE 연결 삽질기

회사에서 맡은 일 중에 오라클에 있는 디비의 내용을 AWS의 dynamoDB로 옮겨야 하는 일이 있었다.

작은 내용은 람다 – 스텝펑션 조합으로 가능했지만

엄청 많은 양의 데이터를 람다 – 스텝펑션 조합으로는 불가능했다.

그래서 AWS 글루 스튜디오를 쓰기로 결정하면서 결국엔 CX_ORACLE과 연동을 한 삽질기를 기록해본다.

우선 CX_ORACLE을 붙인 이유는 단 한가지이다.

글루 스튜디오에서 oracle을 직접 붙였을 때는 인코딩이 되지 않는다.

회사에서 쓰고 있는 디비는 오라클 + 인코딩은 us-ascii

한글이 필연적으로 깨져서 들어올 수 밖에 없다.

람다에서 오라클 디비의 한글 내용을 가져올 때 cx_oracle 라이브러리를 애용해서

글루에서도 cx_oracle을 쓸 수 밖에 없었다.

우선 제가 작성해 놓은 오라클 인스턴스 19.17파일을 받아서 s3에 올려서 글루에 cx_oracle에 적용해보면 잘 적용이 되는 것을 확인할 수 있다.

https://minshu.duckdns.org/owncloud/index.php/s/jrkUysCEZsbHID0

(워드프레스 파일 용량제한으로 인해 개인 클라우드 공유 링크로 대채합니다.)

우선 오라클을 12c이상을 쓰고 있다면 cx_oracle 의 다음 버전인 python-oracledb에서

별도의 oracle 인스턴스 필요없이 thin모드로 연결이 가능하다고 한다.

회사에서 쓰고 있는 오라클 db가 12c 이하 버전이라

무조건 thick 모드로 연결할 수 밖에 없었다.

글루 스튜디오에서 cx_oracle을 초기화 할 때 아래와 같이 추가 셋팅을 해줘야 한다.

def initCxOracle():
    filename = 'oracle_instance_19_17.zip'
    oracle_archive = next(Path('/tmp').glob(f'**/{filename}'))
    with zipfile.ZipFile(oracle_archive, 'r') as f:
        f.extractall('/home/spark/.local/')

    cx_Oracle.init_oracle_client(lib_dir=f'/home/spark/.local/lib')

위 사진과 같이 cx_oracle 과 s3에 제가 공유한 파일을 올려서 바라보게 하면 된다.

아래서 부터는 저 zip 파일을 어떻게 만들었는지에 대해 말해보려 한다.

https://stackoverflow.com/questions/70972408/unable-to-connect-oracle-database-using-cx-oracle-from-aws-glue?noredirect=1#comment125501425_70972408

모든 해답은 위 스텍오버플로우 링크에 있다.

우선 AWS GLUE STUDIO에서는 라이브러리를 따로 셋팅할 수 있는 방법이 없다.

그래서 오라클 인스턴스를 다운 받고 위 스텍오버플로우 가이드대로

patchelf로 심링크를 재정의 해주는 것이다.

몇번의 시행착오를 겪었는데 …

cannot open shared object file: No such file or directory

글루를 실행시키면 이런 오류들을 많이 볼 텐데

위 파일을 ldd 명령어를 통해서 라이브러리 의존성을 검색해서

링크 깨진 부분을 patchelf로 다시 재연결해주는 과정을 거쳐서 위의 zip 파일이 생성이 되었다.