본문 바로가기

Cloud/Oracle Cloud Infrastructure (OCI)

OCI Python Function 디버그하는 방법

Python으로 작성된 OCI Function을 실행할 때 아래처럼 에러가 발생했을 때 디버그하는 방법입니다.

 

OCI Function을 디버그하기 위해서는 OCI Function Logs를 켜고, Function 코드에 print/log 구문을 넣어서 디버그를 수행 합니다. 이러한 OCI Function Logs를 Enable하는데는 세가지 옵션이 있습니다.

  • Fn Project CLI 명령으로 syslog URL을 지정하는 방법
  • 오브젝트 스토리지 버킷에 로그를 보내는 방법
  • OCI 웹 콘솔을 통해 OCI Logging에서 Function Logs를 Enable하고 조회하는 방법

 

이 중에서 세번째 OCI 웹 콘솔을 이용해서 Function Logs를 켜고 조회하는 방법에 대해 살펴보겠습니다. OCI Logging 서비스는 Function 로그에 접근하고, 검색하고, 저장하기 위한 기본값이자 오라클 권고사항으로, 이를 활성화하면 어플리케이션의 Funtion이 호출될 때마다 로그가 생성됩니다.

 

참고로 코드에 디버그를 위해 Python 코드 내에서 출력을 할 때 아래와 같이 버퍼를 flush 해야 합니다.

print("Inside demo function", flush=True)

 

OCI Function Logs를 켜는 방법입니다.

OCI 웹 콘솔에서 Developer Services > Functions > Applications 화면으로 이동하여 로그를 생성, Enable, 조회할 어플리케이션을 선택합니다. 그리고 왼쪽 하단의 Resources 아래 Logs를 클릭합니다.

 

Logs 섹션에서 특정 로그의 오른쪽 Actions 아이콘을 클릭한 다음, Enable Log를 클릭합니다.

 

Compartment, Log Group, Log Name, Log Retention 등을 입력/설정하고 Enable Log를 클릭하여 로그를 생성합니다. 여기에서는 모두 기본값을 사용했습니다.

 

로그가 활성화되었습니다.

 

로그를 조회하기 위해서는 해당 로그 이름을 클릭하면 됩니다. 현재는 로그가 쌓여있지 않습니다.

 

이제 Function을 호출했을 때 아래와 같이 에러가 발생하면 웹 콘솔에서 로그가 생성된 것을 알 수 있습니다.

young_kyun@cloudshell:demo-hr (us-ashburn-1)$ fn invoke demo-app demo-hr
Error invoking function. status: 502 message: function failed

 

에러 로그를 살펴보면 아래와 같이 특정 Python 모듈이 없어서 발생하는 에러임을 알 수 있습니다.

“01G2Y90DAF1BT0H50ZJ003GZ6D - fn - ERROR - No module named 'pymysql': ... 이하 생략

 

아래는 에러 수정 후, Function이 정상 호출되었을 때의 로그입니다. Function 코드(Python)에서 "logger.info("SUCCESS: Fetching data succeeded")" 와 같이 로그를 찍었던 내용대로 보여주는 것을 알 수 있습니다.

 

<END>