created: 2020-02-18T00:09:40.000Z
cloudrun/cloudscheduler入門
毎日決まった時間にスクリプトを実行したい要求があったので、マネージドの環境で実行できるcloudrun/cloudschedulerを試してみた
ちなみに、シェルスクリプトを動かしたいだけだったのだがcloudrunはhttpサーバとしてしかデプロイできない。なのでnodejsのexpressサーバが、リクエストを受け取ったら子プロセスでスクリプトを実行するようなやつを用意した
子プロセスでシェルスクリプトを起動する
コードはこんなようなもの
今回GCPにやってほしいのは以下の2つ
- cloudrunでコンテナをホスティング
- そのコンテナを決まった時間にcloudschedulerでキックする
docker build
環境変数を.envrcでセットしてbuild
docker build . --tag gcr.io/$GOOGLE_PROJECT_ID/$IMAGE_NAME:$IMAGE_TAG
ローカルで動作確認
PORT=8080 && docker run \
-p 8080:${PORT} \
-e PORT=${PORT} \
gcr.io/$GOOGLE_PROJECT_ID/$IMAGE_NAME:$IMAGE_TAG
ローカルで実行するやりかたについては公式のドキュメントが参考になった
GOOGLE_APPLICATION_CREDENTIALS
を --volume
でマウントする扱いも参考になる
docker push
認証をしてから
gcloud auth configure-docker
GoogleContainerRegistryにpushする
docker push gcr.io/$GOOGLE_PROJECT_ID/$IMAGE_NAME:$IMAGE_TAG
gcloud run
以下のコマンドでcloudrunにてコンテナがホストされるようになる
gcloud beta run deploy $IMAGE_NAME \
--image gcr.io/$GOOGLE_PROJECT_ID/$IMAGE_NAME:$IMAGE_TAG \
--platform managed \
--region asia-northeast1
gcloud scheduler
serviceアカウントの権限でコンテナをキックするよう設定
gcloud beta scheduler jobs create http subcommandtesting-sleep-job \
--schedule "0 */6 * * *" \
--http-method=GET \
--uri='https://subcommandtesting-xxxxxx-an.a.run.app/subcommand/sleep' \
--oidc-service-account-email='sakamoto@pjt-123456.iam.gserviceaccount.com'
同じコンテナに対してURLのパスを変えて違うサブコマンドを実行させてみる
gcloud beta scheduler jobs create http subcommandtesting-die-job \
--schedule "15 * * * *" \
--http-method=GET \
--uri='https://subcommandtesting-xxxxxx-an.a.run.app/subcommand/die' \
--oidc-service-account-email='sakamoto@pjt-123456.iam.gserviceaccount.com'
ログの確認
しばらくしてきちんと動作しているかログを確認した
stackdriverのログをクエリ
logName="projects/xxxxx/logs/run.googleapis.com%2Fstdout"
# `:` はLIKE検索になる
textPayload:"sleep"
timestamp>="2020-02-18T00:00:00+09:00"
期待通り子プロセスのログがstackdriverに出ていた
$ gcloud logging read "$(cat ~/develop/cloudrun.logquery)" --format json | jq -r '.[] | "\(.timestamp) - \(.textPayload)"'
2020-02-17T18:00:00.350374Z - sleep...