はじめに
この記事では以下のことについて話しています。
- Terraform で Cloud Scheduler を構成する方法
- Cloud Run functions と Cloud Scheduler をお得に組み合わせて使うアーキテクチャ
この記事では Cloud Schedulerの構成方法と、Cloud Run functionsと組み合わせて使うときのコツみたいなのを紹介したいと思います。Cloud Scheduler で呼び出す Cloud Run functions 関数は認証有りにしておきます。
前準備
Cloud Scheduler を初めて使う場合はAPIを有効にしておきましょう。
gcloud services enable cloudscheduler.googleapis.com
Terraform で Cloud Scheduler を構成する
まずCloud Schedulerのリソースを定義します。Cloud Scheduler は認証付きのエンドポイントを呼び出す際、メールで指定されたサービス アカウントに基づくIDトークン(OIDCトークン)をヘッダーに付与して呼び出します。
resource "google_cloud_scheduler_job" "scheduler" {
name = "functions-scheduler" # スケジューラ名
description = "7:00/13:00/17:00で定期処理を実行する" # スケジューラの説明
schedule = "0 7,13,17 * * *" # 定期実行の設定
time_zone = "Asia/Tokyo" # タイムゾーン
region = "asia-northeast1" # リージョン
attempt_deadline = "180s" # HTTP リクエストのタイムアウト
http_target {
http_method = "GET"
# Cloud Run functions のエンドポイント
uri = google_cloudfunctions2_function.default.service_config[0].uri
oidc_token {
# 認証付きのエンドポイントを呼び出せるサービスアカウントのメールアドレス
service_account_email = "${data.google_project.project.number}-compute@developer.gserviceaccount.com"
# Cloud Run functions のエンドポイント。uri と同じにする
audience = google_cloudfunctions2_function.default.service_config[0].uri
}
}
depends_on = [
google_cloudfunctions2_function.default
]
}
いざ terraform apply
します。
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Cloud Scheduler のページに移動します。特定の時間にならないと実行確認できないので「操作」の三点リーダをクリックして「強制実行」してみます。実行が成功すれば「最後の実行のステータス」のところが緑になります。
参考
Cloud Run functions と Cloud Scheduler をお得に使う
Cloud Schedulerは3つまでジョブを毎月無料で使えます。なので時間帯によって実行する処理がある場合は、関数の中で時間によって処理を分岐させると結構なコスト削減になります。
import { toZonedTime } from 'date-fns-tz'
const date = new Date()
// 東京の現在時刻
const dateTokyo = toZonedTime(date, 'Asia/Tokyo')
const hour = dateTokyo.getHours();
// 7時, 13時, 17時でロジックの呼び分け
if (hour === 7) {
// 7時に実行する処理
} else if (hour === 13) {
// 13時に実行する処理
} else if (hour === 17) {
// 17時に実行する処理
}
見た目は汚くなりますが、ドケチに使ってナンボです。クリーンアーキテクチャとかDDDとか知りません。
終わりに
Cloud Scheduler で 認証付きの Cloud Run functions 関数を呼び出す方法を紹介しました。発展編とは銘打っているものの特に発展っぽいことはしていませんが、Cloud Schedulerの毎月の無料枠を積極的に使っていきましょう(脈絡がおかしい)。