오류 해결 과정

험난했던 원격 실행 도전기(PsExec,WinRMOperator)

필만이 2024. 7. 15. 19:06

배경

airflow(리눅스)에서 로컬(윈도우)에 있는 스크립트를 실행하고자 했다.
그 이유는 window에서 많은 자동화 작업이(hwp_pdf 변환, LLM 변환, 카톡자동보내기) 이루어질 예정이었고, window 에서만 사용가능한 파이썬 모듈도 사용해야 했다.
왜 굳이 윈도우에서 실행시키느냐는 질문도 있었지만 하고자 하는 모든게 깔끔하게 API로 갖춰진 상황은 아니였다.
또한 크론탭을 통해 airflow를 사용하지 않아도 됐지만, 내가 평생 구축하고 운영하고자 하는 파이프라인이 수백개는 넘는다.
이를 관리할수 있는 툴은 왠만하면 한개로 제한하고 싶다.

airflow는 리눅스 하에서만 사용이 가능하기 때문에, 스케줄러 및 파이프라인 관리용으로만 쓰고,
스크립트(코드)를 윈도우에 두고 윈도우 환경에서 실행 했다.

실행하고자 했던 스크립트

  1. 크롤링 스크립트
  2. 한글파일 pdf 변환 스크립트
  3. 파워쉘 스크립트(파워쉘 입력 명령어 모음)

작업과정 요약

  1. SSHOperator로 처음 시작을 했고, 1번 스크립트는 동작 2번은 동작하지 않았다.
    https://makenow90.tistory.com/19

  2. WinRMOperator을 통해 윈도우로 원격접속을 해서 스크립트를 실행하는 방식으로 바꿨다.

    • WinRM 동작 오류로 크롬드라이버 옵션을 추가했다.(https://makenow90.tistory.com/25)
    • WinRM을 사용하기 위한 네트워크 설정을 했다
    • WinRM을 사용하기 위한 권한설정(원격권한, 관리자 권한)을 부여했고, airflow 서버 호스트 주소의 접근을 허용시켰다.
    • 방화벽에 예외를 등록했다.
  3. WinRM으로 1번은 동작했지만 2번 스크립트는 여전히 동작하지 않았다.(정확히는 오류도 안나고 무한 실행대기 timeout)

  4. 스크립트 실행 명령어 변경 (https://makenow90.tistory.com/27)

  5. 로그에서 가상 환경 실행이 확인됐고, 경로가 일치하는것도 확인됐지만 안됨

  6. 자세한 내용을 보기 위해 곳곳에 로그 추가.

  7. 로그 확인결과 win32com 모듈 실행 부분에서 동작하지 않고 코드 동작이 멈춤

  8. 똑같은 코드가 로컬에서 실행할땐 동작했다. 둘다 win32com 설정을 통해 GUI가 나오지 않게 적용시킨 상황이었다.

  9. 동작은 백그라운드 실행을 할지라도 win32com 코드가 윈도우 GUI 환경과 상호작용하는 부분이 있어서 안된다는 가설을 세웠다.

  10. 윈도우에서 직접 실행하는 것 같이 환경을 맞출수 있는 PsExec 툴을 도입

  11. PsExec의 설정을 보고 동작시켰지만 똑같은 부분에서 동작하지 않음.

  12. 생각해보니 PsExec는 윈도우에 설치되있지 airflow 쪽에는 설치 안되있음.

  13. 어떻게 설치할지 고민하다가. 그냥 윈도우에 파워쉘 스크립트를 두고 그걸 실행시키는 방식으로 적용

  14. 파워쉘 스크립트 내용

    1. 사용법을 보고 아래 스크립트 작성 
    & $PsExecPath -i -d -accepteula cmd /c "C:\\Users\\weare\\pro-ollama\\pdf-rag.venv\\Scripts\\python.exe $PythonScriptPath" 
    실패 로그를 보니 스크립트 실행이 아예 안됐음 
    
    2. i/o 장치와 교신하려면 관리자 모드여야하나? 생각하고 -s 추가해서 관리자 모드로 실행 
    & $PsExecPath -s -i -d -accepteula cmd /c "C:\\Users\\weare\\pro-ollama\\pdf-rag.venv\\Scripts\\python.exe $PythonScriptPath" 
    동작은 하는데, win32com 실행하는 부분에서 동작이 멈춤.
    
    3. GPT 말이 시스템 계정은 매우 높은 권한을 갖지만, 사용자 인터페이스와 관련된 작업이나 특정 사용자 디렉토리에 접근하는 데 제한됨.
    다시 사용법을 보니까, 결국 처음 방법이 맞았음. 다만 첫 번째 로그인된 사용자의 세션 ID인 1을 넣어야 했다. 
    & $PsExecPath -i 1 -d -accepteula cmd /c "C:\\Users\\weare\\pro-ollama\\pdf-rag.venv\\Scripts\\python.exe $PythonScriptPath"
  15. 동작 성공

회고 및 배운점

  1. PsExecPath을 이용해 실행하는 방식으로 해결 했다. 그러나 결국 외부에서 접근을 허용하고 관리자 권한까지 줘야 사용가능한 툴이다. 보안문제가 있어보인다.
  2. WinRM 사용법(https://makenow90.tistory.com/21)
  3. 결과론적으로 win 내의 파워쉘 스크립트를 PsExec를 이용해 실행한 방식으로, 결국 돌이켜 생각해보면 WinRMOperator를 쓰지 않고 SSHOperator를 사용해도 되는 거였음.
  4. 아무튼 OS의 네트워크설정(https://makenow90.tistory.com/22), 네트워크 차단(https://makenow90.tistory.com/24), 권한부여에 대한 설정들을 직접 만져볼 수 있었다,
  5. 웹(GPT포함)에 winrm, PsExec을 airflow 에서 사용하는것에 대한 자료가 아주 많이 부족했다. 철처히 연역적 추론에 의해, 되는것에서 뻗어나가 원인을 찾고 하나씩 해결해 나갔다.
  6. 물론 win32com을 쓰지 않고 우회하는 방식도 가능했다. hwp-pdf 변환은 지원하는 플랫폼이 많이 있기 때문에, 작업은 클라우드에 맡기고 저장은 s3나 로컬에 하는 방식도 가능했다.
  7. 그러나 이를 해결하는 과정에서 컴퓨터와 컴퓨터를 연결하는 과정에서 해결해야할 관문들을 알수있었다.
  8. 또한 윈도우 설정을 만지는 과정에서 운영체제 내에 저장되는 로그가 생각보다 많은 것을 봤는데, 이를 활용한 몇가지 제작할 앱에대한 아이디어를 얻을수 있었다.

간접적으로 배운것

의존성 관리를 위한 도커내 poetry 사용(https://makenow90.tistory.com/3), poetry 적용 도커파일 제작하며 리눅스 파일구조(https://makenow90.tistory.com/26)