やりたいこと
Pythonプログラムを定期実行させる必要がありました。
が、cronだとPCを起動していないといけない。。。ちょっときついので、GCPにやってもらうことにします。
GCPのCloudFunctions、PubSub、CloudSchedulerを使用します。
各種サービスやジョブはコンソールからぽちぽちと作成します、ご了承ください。(terraform勉強中なので、いつかtfファイルで書き直したいです。。)
設計
CloudSchedulerで、定期的にPubSubトピックにメッセージをpublishさせる。
そのPubSubトピックにメッセージがpublishされることをトリガーに、CloudFunctionsの関数が実行される。
CloudFunctionsの実行結果はCloudLoggingに出力される。
手順
最後にも注意書きしましたが、定期実行は実験が終了したら止めるようにしましょう!課金が進みます
PubSubトピックを作成する
CloudFunctionsの関数を作成する
トリガーのタイプをPubSubに変更し、先ほど作ったトピックを選択します。
これで、このトピックにmessageがpublishされたら、この関数が動くようになります。
外部からのアクセスを今回は行う必要がないため、ネットワークの設定のうち、上り(内向き)設定を「内部トラフィックのみを許可する」に変更しました。
今回はひとまずこんな関数にしました。
Cloud Loggingクライアントライブラリを使って、CloudLoggingにログを出力しています。
import base64
import datetime
import google.cloud.logging
from logging import getLogger, DEBUG
logging_client = google.cloud.logging.Client()
logging_client.setup_logging()
logger = getLogger(__name__)
logger.setLevel(DEBUG)
def hello_pubsub(event, context):
pubsub_message = base64.b64decode(event['data']).decode('utf-8')
now = datetime.datetime.now()
logger.info("PubSubメッセージ: {}".format(pubsub_message))
logger.info("now: {}".format(now))
CloudLoggingクライアントライブラリのバージョンをrequirements.txt
に記載しておきます。
google.cloud.logging>=3.0.0
CloudSchedulerのジョブを作成する
ターゲットタイプをPubSubにし、トピックを選択します。
定期的に、PubSubトピックに対してmessageを送るよということですね。
トピックに送信するメッセージを設定します。今回は
定期実行のサンプルです。
This is sample of automation.
というメッセージをPubSubトピックに送るようにしました。
オプションは特にいじってないです。
CloudSchedulerのジョブが問題なく作成されたら、(今回は毎分の設定なので)次の0分のタイミングで、CloudFunctionsがPubSubにメッセージをパブリッシュします。
ログを確認する
CloudLoggingを確認してみると
問題なくログが出力されていました。
このあとも、1分おきに実行されログが出ていたのが確認できました。
注意事項
動作確認が終わったら、CloudSchedulerのジョブを一時停止or削除するのを忘れずに!!
今回は毎分でcronを設定しているので、放置すると順調に課金がすすんでしまいます。
CloudSchedulerのジョブ一覧の画面から該当のジョブを選択し、一時停止/削除を行ってください。