Google Cloud Functions과 Cloud Scheduler를 사용해 Python 스크립트 주기적으로 실행하기


  • Google Cloud Functions과 Cloud Scheduler를 사용해 Python 스크립트를 주기적으로 실행하는 방법에 대해 설명한 글입니다
  • Google Cloud SDK를 설치한 후 아래 글을 읽어주세요

사용할 도구

  • Cloud Functions으로 함수를 클라우드에 올리고, 그 함수를 Cloud Scheduler로 주기적으로 돌릴 예정
  • Google Cloud Functions
    • 클라우드에서 코드를 간단히 실행할 수 있음
    • AWS의 Lambda와 유사함
    • 과거엔 자바스크립트(Node.js 런타임)만 있었으나, 최근에 Go(1.11), Python(3.7)도 추가됨 : 2019년 7월 6일 기준
    • HTTP 함수백그라운드 함수로 나뉨
      • 전자는 HTTP를 통해 함수를 직접 호출
      • 후자는 Google Cloud Pub/Sub의 메세지 또는 Google Cloud Storage 버킷의 변경 사항을 통해 Cloud Functions를 간접적으로 호출
    • 가격은 호출 횟수, 코드가 실행되는 컴퓨팅 리소스 사용 시간, 네트워크 사용량에 따라 결정되며 무료 사용량은 월 200만회까지 무료, 리소스 사용은 메모리는 400,000GB-seconds, 컴퓨팅 시간은 200,000 GHz까지 무료이며 자세한 내용은 Pricing 문서 참고
    • Reference 코드를 보고싶은 경우엔 python-docs-samples 참고
    • 용도
  • Cloud Scheduler
    • App Engine 트리거, Pub/Sub을 통해 메세지 보내기, Compute Engine에 HTTP 엔드포인트 호출 등 다양하게 가능
    • crontab보다 쉽게 사용 가능
    • AWS의 클라우드 워치와 유사
    • 월 3개의 Job까지 무료(횟수가 아니고 Job의 개수에 비용 부과 : Job이 20번 돌아도 상관 없음)
    • 단, 기본적으로 1분에 최대 60개의 Cron이 가능하고 하루 최대 만건의 CronJob 실행이 가능한데 더 필요할 경우 Quota Request를 해두면 됨

작업 흐름

  • Cloud Functions 포맷에 맞게 Python으로 함수를 만든다
  • Cloud Functions에 배포한다
  • Cloud Scheduler에서 주기적으로 Cloud Functions의 함수를 실행시킨다

Hello World

  • 우선 아무것도 모르는 상태에서 Hello World를 찍어보며 진행하겠습니다
  • main.py 작성

      def hello_world(request):
          return 'Hello, World!\n'
    
  • 배포

      gcloud beta functions deploy hello_world --runtime python37 --trigger-http
    
  • 배포시 아래 메세지가 나타남
  • Cloud Functions Console에서 확인해보면 아래와 같이 배포된 것을 알 수 있음
  • 최근 배포 시간 우측의 세로로 3개의 점을 클릭한 후, 함수 테스트 클릭하면 아래와 같이 나옴
    • 함수 테스트 버튼을 통해 테스트 가능
    • 위에서 배포를 한번 더 진행해서 버전: 2로 나옴

Python으로 Cloud Functions 만들기

  • 간단하게 로컬에서 파이썬 스크립트를 만든 후, gcloud functions를 사용해서 올리면 끝!
  • Python에서 함수를 만들 경우엔 아래와 같은 구조로 생성

      folder/
      ├── main.py : main.py 아래에 있는 함수를 Cloud Functions에서 사용 가능
      └── requirements.txt : 설치할 패키지
    
  • 만약 개인이 만든 패키지도 같이 올리고 싶은 경우

      folder/
      ├── main.py
      ├── requirements.txt 	
      └── mypackage/
          ├── __init__.py
          └── myscript.py
    
  • Cloud Functions의 Python 3 Runtime에 설치된 시스템 패키지는 링크를 참고하면 알 수 있음 : git, wget 등이 설치되어 있음

Cloud Functions 배포하기

  • 배포는 다양한 방식이 존재하는데 크게 아래와 같이 나눌 수 있음
    • 1) 로컬에서 파일을 업로드한 후, 배포하는 경우
    • 2) Github나 Bitbucket 같은 소스 저장소의 코드를 배포하는 경우
    • 두 방법 모두 gcloud 도구를 사용할 예정이며, 콘솔에서 진행하고 싶으면 Console 문서 참고
  • 여기선 1) 위주로 진행
  • gcloud 명령어 구조

      gcloud beta functions deploy <NAME> <TRIGGER> --stage-bucket <STORAGE_BUCKET> --entry-point <FUNCTION_NAME>
    
    • : Cloud Functions의 이름으로 문자, 숫자, 밑줄, 하이프만 포함할 수 있음. entry-point 옵션을 지정하지 않는한 모듈에서 같은 이름의 함수를 내보내야 함
    • : 트리거의 종류로, 자세한 내용은 [링크](https://cloud.google.com/functions/docs/calling/?hl=ko) 참고. `--trigger-http`, `--trigger-topic`, `--trigger-bucket`, `--trigger-event`, `--trigger-resource` 등이 있음
    • --stage-bucket--entry-point는 선택적 인자! (없어도 상관 없음)
      • –stage-bucket : 함수의 코드를 저장하는 Google Storage 버킷. 이 인자를 생략할 경우 별도의 storage에 저장해서 활용
      • –entry-point : 배포시 사용하는 과 다른 이름을 가지는 경우 사용
    • 그 외에도 --allow-unauthenticated 등의 인자도 있음
    • 더 자세한 명령어는 gcloud beta functions deploy 링크 참고
  • 예시
    • 위에서 처음 진행할 때 사용한 코드
      gcloud beta functions deploy helloworld --trigger-http
    
    • entry point를 지정한 경우
      • Cloud Functions의 이름은 hello고, 함수 사용시엔 helloworld라는 이름으로 사용함
          gcloud beta functions deploy hello --entry-point helloworld --trigger-http
        

Cloud Scheduler로 주기적으로 실행하기

  • 콘솔에서 Cloud Scheduler로 이동
  • 작업 만들기 클릭
    • 지역 설정. Cloud Functions에서 만든 Region과 동일하게 설정
    • 작업 만들기
      • 빈도는 crontab 형식으로 작성
      • 시간대는 기준 시간대를 설정. 대한민국도 존재
      • 대상에 HTTP를 설정
      • Cloud Functions에서 나온 URL을 입력
        • 예시 : https://us-central1-{project}.cloudfunctions.net/{entry_point}
      • Body가 필요하면 작성한 후, 만들기
  • 생성한 후, Cloud Scheduler 화면을 보면 아래와 같이 스케쥴 Job들이 나타남
  • gcloud로도 가능한데, gcloud beta scheduler jobs create http를 참고하면 볼 수 있음

      gcloud beta scheduler jobs create http
    

앞으로 고민할 내용들

  • 앞에서 진행한 Cloud Functions는 앞에 인증하는 과정이 없기 때문에 아무나 request할 수 있음. 이 점은 실제 서비스엔 치명적이기 때문에 보안을 신경써야 함
    • AWS에선 GATEWAY를 사용해 API_KEY 값을 같이 물고 들어가는 방식으로 사용했는데, 아직 Cloud Functions는 그런 작업이 잘 발달하지 않고, 레퍼런스도 적은 느낌(제가 잘못 알고있다면 제보 부탁드립니다!)
    • Firebase를 사용하는 예시가 있긴한데, 굳이? 라는 생각이 들고, Cloud Endpoints 를 사용한다는 말도 있는데, Python 예제는 거의 없음
    • Wrapping Google Cloud Functions HTTP Triggers in Endpoints
  • CloudSQL를 어떻게 연결할 수 있는지?
  • Terraform을 사용해 인프라를 코드로 관리

Reference


카일스쿨 유튜브 채널을 만들었습니다. 데이터 분석, 커리어에 대한 내용을 공유드릴 예정입니다.

PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다

이 글이 도움이 되셨거나 의견이 있으시면 댓글 남겨주셔요.

Buy me a coffeeBuy me a coffee