BigQueryで定期的な集計処理を行うときにスケジュールドクエリを利用することがあります。
Cloud ComposerなどのWorkflow Engineを使用するのと比較すると機能が貧弱ですが、気軽につかえるというメリットがあります。
例えば、1時間毎にクエリを実行したい場合は、以下のようなtfファイルをapplyすれば作成できます。
resource "google_bigquery_data_transfer_config" "scheduled_query" {
display_name = "<表示名>"
project = "<プロジェクトID>"
location = "<処理を行うリージョン>"
data_source_id = "scheduled_query"
schedule = "every 1 hour"
params = {
"query" = "SELECT ..."
}
}
しかし、この方法で作成したスケジュールクエリは1時間毎に実行されますが、cronの 0 * * * *
のようには動いてくれません。
以下の実行ログから分かるように、毎時04分から処理が動きます。
なおかつ、この04分はterraform applyしたタイミングによって変化し、例えば12:34にapplyした場合は毎時34分に実行されます。
every 1 hourという意味では間違っていないですが、cronのように毎時0分に動いて欲しいケースもあります。
どのようにすればapplyタイミングに依らずに毎時0分に稼働されることができるのでしょうか?
答え
synchronized
を追記する。
every 1 hour synchronized
と記載すると、毎時0分に実行されるようになります。
スケジュールクエリのscheduleを指定するときのフォーマットはAppEngineのものと同じなので、AppEngineのcron.yamlのドキュメントを確認します。
上記のドキュメントによると、 synchronized
は from 00:00 to 23:59
を指定するのと同じであることが分かります。
つまり、 every 1 hour
を指定するだけでは曖昧だったスケジュール実行の始点となる時刻を00:00に設定しています。これによって、毎時0分に実行されるようになります。
また、ドキュメントにも書かれている通り、 synchronized
を指定する場合には、 every N hour
のNは24の約数である必要がある点には注意が必要です。