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...