5 min read

[GCP] Compute Engine 자동 시작&중지 와 부팅시 파이썬 파일 실행

이번에는 GCP의 Compute Engine을 일정에 맞춰서 자동으로 시작 & 중지를 진행 해보자. 추가로 리눅스 서버가 부팅이 되면 자동으로 파이썬으로 만든 데이터 수집 및 전처리 파일이 실행 되도록 진행 해보려 한다. 주가 데이터를 자동으로 수집하는데 airflow에 대한 블로그를 썼었고, 이후에 Serverless 관점에서 cloud function 을 썼다. 더 나아가서 cloud run에 대한 글을 작성하고 테스트 도중에 이번 글을 쓰게 되었다. cloud function과 cloud run 모두 시간제한이 3600초(1시간) 이기 때문에 1시간이 넘는 작업이 필요한 경우가 있다. 예를 들어 30일 또는 6개월 마다 30시간이 넘어 가는 모델링이 자동으로 돌아가야 하는 작업이 생기는 경우가 대표적이다. 물론 물리서버가 존재 해서 airflow를 사용하면 되지만 GCP를 사용하는 요즘에 serverless를 최대한 활용 해보고자 한다.

1. VM 인스턴스 시작 및 중지 일정 관리

GCP의 Compute Engine을 자동으로 시작, 중지를 진행 해보자. 공식 문서는 다음과 같다.

방법은 아주 간단해 보이지만, 함정이 꽤나 많다. 무턱대고 GCP에서 친절하게 표시된 대로 클릭하고 진행 했다간 종잡을 수 없는 에러를 볼 수가 있는데 중요하게 참고 해야 할 사항은 다음과 같다.

  • IAM 권한 부여 하기:
    • service-xxxxxxxxxxxx@compute-system.iam.gserviceaccount.com이 들어간 권한을 찾아줘야 한다.
    • 위 에러 문구를 대충 보고 기존에 사용하던 IAM 권한을 설정 해주다 원인도 모른채 실패 하는 경우가 있다.
  • 인스턴스 자동 시작 테스트 할때 15분 전에 진행:
    • 테스트를 진행 할때 공식 문서를 읽지 않고 진행 하게 되면 한국인의 성향상 3분 5분, 빠르면 1분 후에 서버가 켜지고 10분 후에 서버가 종료되는걸 확인하려고 할 때가 있다.
    • 그러나 예약된 VM 인스턴스는 시작 또는 중지 작업 시작까지 최대 15분이 걸릴 수 있다고 한다. 따라서, 최소 15분 전에 예약을 걸어 두어야 한다.
  • 시작 및 중지 사이의 간격을 15분 이상 설정:
    • 이 역시 테스트를 위해 잠깐 5분만 켜놨다가 종료하게 설정하는 경우가 있다.
    • 그러나 공식문서에 따르면 시작과 중지 사이의 시간간격은 15분 이상을 권장 하고 있다.

그럼 하나씩 그림을 보면서 알아보자. 위의 함정만 조심하면 매우 쉽다.

1-1.

우선 GCP Compute Engine로 들어가자. 그리고 나서 ‘인스턴스 일정’ 탭을 클릭 해주자. 물론 기본 으로 만들어져 있는 VM 인스턴스는 있어야 한다.

1-2.

‘인스턴스 일정’으로 넘어가면 ’일정 만들기’ 버튼이 보이게 된다. 클릭 해주자.

1-3.

아직까지는 아주 쉽다. 우리가 원하는 일정 정보를 입력 해주자. 이름을 입력 해주고, 리전, 시작 시간 중지 시간, 시간대, 빈도 등등 원하는 조건에 맞추어서 입력 해주고 제출 버튼을 클릭 해주면 된다.

1-4.

이제 일정이 생성되었다. 이제 이렇게 생성된 일정을 우리가 만들어 두었던 VM 인스턴스에 연결 해주기만 하면 끝. 자 그럼 생성된 일정을 클릭 해보자.

1-5.

일정을 클릭하면 다음과 같이 일정에 인스턴스 추가 화면이 보이게 된다. 여기에 우리의 VM 체크박스를 클릭해주고 추가 버튼을 눌러주면 끝. 아주 쉬워 보인다.

1-6.

….이 아니다. 다음과 같은 에러를 볼 수 있다. AWS든 GCP든 모두 사용하게 되면 꾸준히 봐야할 IAM 에러. 각 서비스에 필요한 권한을 알아야 하기 때문에 권한을 미리 설정 하지 않고 에러를 보면서 작성하려고 하고 있다.

service-xxxxxxxxxxxx@compute-system.iam.gserviceaccount.com 계정의 IAM 권한을 부여 하라는 에러 메시지이다. IAM에 아주 조금만 익숙한 사람이라면 별게 아닌줄 알고 IAM으로 넘어가서 익숙한대로 권한을 주게 되는데…

1-7.

무턱대고 IAM 화면으로 넘어가서 무의식적으로 기존에 쓰던 계정에 권한을 주고 다시 테스트하는 불상사가 발생한다.

1-8.

그러면 안되고, 우측에 ‘Google 제공 역할 부여 포함’ 체크박스를 꼭 꼭 클릭 해주어야 한다. 그러면 숨은 권한들이 노출되게 된다. (과거 게임중에 젤다의 전설과 매우 비슷)

1-9.

그렇게 조금씩 내려보다가 service-xxxxxxxxxxxx@compute-system.iam.gserviceaccount.com 이 보이게 되는데 이 계정에 대한 권한에 ’Compute 인스턴스 관리자(v1)’을 부여 해주어야 한다.

1-10.

그리고 나서 다시 일정에 인스턴스 추가를 해주면 끝.

최종적으로 일정에 인스턴스가 추가된 모습이다.

이렇게 이제 우리가 원하는 시간에 따라 VM을 자동으로 실행 하고 중지 시킬수 있다. 그럼 이제 서버가 자동으로 시작 되었으니, 우리가 원하는 파이썬 파일을 자동으로 실행시켜 보자

2. 리눅스 부팅시 파이썬 파일 자동 실행

이번에는 리눅스 부팅시 파이썬 파일을 자동으로 실행 하게 해주자. 이 비슷한 내용을 지난번에 ‘GCP ubuntu에 아나콘다 설치 및 jupyter 자동 실행’ 이라는 내용의 블로그를 작성 했었는데, 이를 참고 해도 좋다.

우선 우리가 원하는 서비스를 만들어 주자. 저녁 6시에 시작하는 pykrx의 모든 주가와 인덱스를 수집하는 내용과 전처리에 대한 내용이 담겨져 있는 파이썬 파일을 실행 하는 서비스이다. 다음의 커맨드를 입력 해준다.

$ sudo vi /etc/systemd/system/pykrx.service

그리고 나서 부팅시 실행해야할 명령어를 하나씩 입력 해준다. 우선 예시를 먼저 보자. 구체적으로 필요한 정보만 설명 하고 나머지는 찾아보면 된다.

[Unit]
Description= 서비스에 대한 설명을 적어 준다.

[Service]
Type= pykrx_service
PIDFile=/run/pykrx.pid
User= {계정명}
ExecStart=실행할 명령어를 적어 준다. 이때 절대 경로를 넣어 주어야 한다.
WorkingDirectory= 실행이 되는 경로를 적어 준다. 절대 경로를 넣어 준다.

[Install]
WantedBy=multi-user.target

위 정보를 토대로 적으면 다음과 같다.

[Unit]
Description=pykrx Server # 서비스에 대한 설명을 적어 준다.

[Service]
Type= pykrx_service
PIDFile=/run/pykrx.pid
User= {계정명} 
ExecStart=/home/{계정명}/anaconda3/bin/python3  /home/{계정명}/finance_mlops/python_file/scheduler.py
WorkingDirectory=/home/{계정명}/finance_mlops/python_file/

[Install]
WantedBy=multi-user.target

그리고 나서 권한을 수정 해주자.

$ sudo chmod 755 /etc/systemd/system/pykrx.service

이제 이 서비스 파일을 등록 해주자. 다음의 커맨드를 입력 해주면 된다.

$ sudo systemctl enable pykrx.service

이제 서비스를 다음과 같이 실행 하면 된다.

$ sudo systemctl start pykrx.service

서비스 확인은 다음과 같다. 이걸로 리눅스가 부팅이 되었을때 파이썬 파일을 실행 시키는 pykrx.service 완성.

$ sudo systemctl status pykrx.service

3. Google Compute Engine에서 파이썬 자동 실행

직전에 리눅스 부팅시 파이썬 파일을 자동실행을 알아 보았다. 그러나 Google Compute Engine 에서는 이와 동일한 기능을 제공한다. 하나씩 알아보자.

3-1.

우선 우리가 생성산 VM 인스턴스를 클릭 해준다.

3-2.

그리고 나서 수정 버튼을 클릭해준다.

3-3.

이제 내려가다보면 자동화-시작 스크립트 부분이 보이게 된다. 이곳에서 우리가 원하는대로 부팅시 실행해야할 스크립트를 넣어 주면 된다.

총평

airflow 부터 시작해서 cloud function, cloud run을 진행 했었다. pykrx함수의 경우에 하나의 종목은 cloud function, cloud run에서 잘 작동을 하는데, 전체 종목에서 PORT=8080에러가 난다. 이를 어떻게 해결하면 좋을까 여러 방면으로 에러를 찾던 도중에 문득 Compute Engine 자체를 주기적으로 실행하는 방법을 알게 되었다. 더구나 이를 알아두면 cloud function, cloud run의 제한시간 3600초(1시간)을 넘어서는 작업을 추후에 진행할때 유용하기 때문에 기록으로 남겨 둔다.