現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

GCPのCloud Functions + Cloud Scheduler + Cloud Source Repositoriesで任意のPythonを定期実行させる仕組みをつくる

データ分析でPythonを使っているのですが、データを加工して〜みたいな処理を毎日やるタスクが地味にあったりするので自動化したいです。
最近はGCPも触っているので、GCPのサービスだけでそれを実現できないかなと考えました。いわゆるサーバレスな構成になっています。
試しにこの記事ではSlackに時報を打ってくれるbotを作成してみました。

構成

  • Cloud Source Repositories: ソースコード置き場
  • Cloud Functions: 実行する関数の定義
  • Cloud Scheduler: 関数を定期的に実行するジョブの作成

お試し: Slack時報botの作成

リポジトリの作成

GUIで作成します。

f:id:kazuki_hykw:20181206175833p:plain
Cloud Source Repositories でリポジトリの作成

プロジェクトを作成してリポジトリにpush

リポジトリをcloneします。

gcloud source repos clone sample --project=[YOUR_GCP_PROJECT]

プロジェクト構成は以下の通り。

sample
├ cloudfunctiontest
│ ├ requirements.txt
│ ├ util.py
│ └ main.py
└ README.md

それぞれ内容は以下の通りです。 ※ README.md は適当に書いておいてください

requirements.txt は以下

slackweb

util.py は以下

import slackweb
from datetime import datetime, timedelta, timezone

slack_webhook_url = 'YOUR_SLACK_WEBHOOK_URL'

def slackpost():
    JST = timezone(timedelta(hours=+9), 'JST')
    nowtime = datetime.now(JST).strftime("%Y年%m月%d日 %H時%M分")
    text = "【時報】現在時刻 " + nowtime + " をお知らせするよ。(cloud functions運用テスト用)"

    slack = slackweb.Slack(url=slack_webhook_url)
    slack.notify(text=text, channel='#YOUR_CHANNEL')

main.py は以下

# -*- coding: utf-8 -*-
from util import slackpost

def main(request):
    slackpost()

ここまでの編集をコミットしたらpushします。

git add -A
git commit -m 'fix'
git push --all google

Cloud Functions の設定

f:id:kazuki_hykw:20181206180101p:plain
cloud functions の設定

  • トリガーはHTTP
  • ランタイムはPython 3.7
  • Cloud Source Repositories を選択し、リポジトリ、コードのあるディレクトリを金融
  • 実行する関数を記入

作成できた関数はGUIgcloud functions list, gcloud functions describe [FUNCTION_NAME] コマンドで確認できます。

Cloud Scheduler の設定

f:id:kazuki_hykw:20181206180557p:plain
Cloud Scheduler の設定

  • 頻度は crontab と同じ書き方で書ける
  • ターゲットはHTTP
  • URLにfunctionのurlを記入

作成されたジョブはGUIgcloud beta scheduler jobs list コマンドで確認できます。

実際にこんな感じで時報を打ってくれています。(3分おきに設定したからちょっとうるさいw)

f:id:kazuki_hykw:20181206182024p:plain
実際の時報の様子

これで各種タスクの自動化がサーバレスで現代的な感じでできました!
エンジニアじゃなくてもいい感じに定期実行ジョブをサクサク作れて感動です。