【Cloud Scheduler】コンテナを動かすために必要なgcloudコマンドをシェル関数化する
はじまり


Cloud Schedulerでコンテナを操作する
Google Cloud Schedulerは、スケジュールに基づいてジョブを実行するサービスです。特にコンテナと組み合わせると、定期的なバッチ処理やメンテナンス作業を自動化するのに最適です。
例えば以下のようなユースケースがあります。
- 毎日深夜にデータベースのバックアップを取る
- 1時間ごとにデータを集計する
- 週次でレポートを生成する
- 特定のタイミングでコンテナを起動し、処理が終わったら停止する
Cloud Schedulerでコンテナを操作する際には、主に以下のgcloudコマンドを使用します。
gcloud scheduler jobs resume- 一時停止中のジョブを再開するgcloud scheduler jobs run- ジョブを即時実行するgcloud scheduler jobs pause- 実行中のジョブを一時停止する
これらのコマンドを毎回手動で入力するのは面倒ですし、ミスも発生しやすいです。そこで、これらのコマンドをシェル関数化して、より簡単かつ安全に使えるようにしましょう。
シェル関数化する利点
gcloudコマンドをシェル関数化することで、以下のような利点があります。
- コマンドの簡略化 - 長いコマンドを短い関数名で呼び出せる
- パラメータのバリデーション - 必須パラメータの有無をチェックできる
- エラーハンドリング - コマンド実行時のエラーを適切に処理できる
- ヘルプ機能の追加 -
helpオプションでコマンドの使い方を表示できる - 通知機能の統合 - Discordなどに実行結果を通知できる
- 複数コマンドの連携 - 複数のコマンドを組み合わせた処理を1つの関数にまとめられる
- スニペットとしての利用 - 今後似たような処理を作る時の見本になる
それでは、実際にシェル関数を実装していきましょう。
基本的なgcloudコマンドの紹介
まず、Cloud Schedulerを操作する基本的なgcloudコマンドを見てみましょう。 それぞれのコマンドは以下の公式ページでも確認できます。
ジョブの再開(resume)
gcloud scheduler jobs resume JOB_NAME --location=LOCATIONジョブの即時実行(run)
gcloud scheduler jobs run JOB_NAME --location=LOCATIONジョブの一時停止(pause)
gcloud scheduler jobs pause JOB_NAME --location=LOCATIONこれらのコマンドは単純ですが、毎回ジョブ名やロケーションを指定する必要があります。また、エラーが発生した場合の処理も自分で書く必要があります。
シェル関数の実装
それでは、これらのコマンドをシェル関数化していきましょう。まずは、ジョブを再開する関数から実装します。
ジョブを再開する関数
function resume_gcloud_scheduler_job() { # 関数名をローカル変数に格納 local func_name="${FUNCNAME[0]}" send_discord_notification "ジョブを再開するよ!"
# 初期値 local job_name="" local location=""
# パラメータ解析 if [ $# -eq 0 ]; then echo "[INFO] ${func_name}: パラメータが指定されなかったため、デフォルト設定で実行します。" fi
local usage="[INFO] Usage: ${func_name} --job-name <JOB_NAME> --location <LOCATION> --job-name 対象のジョブ名を指定します。 --location 対象のロケーションを指定します。
[INFO] Example: ${func_name} --job-name my-job --location us-central1[INFO] Detail of gcloud is here: <https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/resume>"
while [ $# -gt 0 ]; do case "$1" in --help) echo "$usage" return 0 ;; --job-name) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --job-name の引数が指定されていません。" return 1 fi job_name="$1" ;; --location) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --location の引数が指定されていません。" return 1 fi location="$1" ;; *) echo "[ERROR] ${func_name}: 不明なパラメータ '$1' です。" return 1 ;; esac shift done
# 必須パラメータのチェック if [ -z "${job_name}" ]; then echo "[ERROR] ${func_name}: --job-name は必須パラメータです。" return 1 fi if [ -z "${location}" ]; then echo "[ERROR] ${func_name}: --location は必須パラメータです。" return 1 fi
# コマンド組み立て local cmd="gcloud scheduler jobs resume ${job_name} --location=${location}" echo "[INFO] ${func_name}: 実行するコマンド: ${cmd}"
# コマンド実行とエラーハンドリング eval "${cmd}" if [ $? -ne 0 ]; then send_discord_notification_about_gcscheduler "失敗…" "ジョブを再開できなかったよ…" "red" echo "[ERROR] ${func_name}: コマンド実行中にエラーが発生しました。" return 1 fi send_discord_notification_about_gcscheduler "再開したよ!" "ジョブを再開したよ!" "green" echo "[INFO] ${func_name}: Scheduler job '${job_name}' updated successfully."}この関数では、以下のような工夫をしています。
- 関数名の取得 -
${FUNCNAME[0]}で現在の関数名を取得し、エラーメッセージなどに使用 - Discord通知 - 処理の開始と結果をDiscordに通知
- パラメータ解析 -
job-nameやlocationなどのパラメータを解析 - ヘルプ機能 -
helpオプションで使い方を表示 - パラメータのバリデーション - 必須パラメータが指定されているかチェック
- コマンドの組み立て - パラメータを使ってgcloudコマンドを組み立て
- エラーハンドリング - コマンド実行結果をチェックし、実行完了時もしくはエラー発生時に通知
ジョブを即時実行する関数
次に、ジョブを即時実行する関数を実装します。
function run_gcloud_scheduler_job() { # 関数名をローカル変数に格納 local func_name="${FUNCNAME[0]}" send_discord_notification "ジョブを強制実行するよ!"
# 初期値 local job_name="" local location=""
# パラメータ解析 if [ $# -eq 0 ]; then echo "[INFO] ${func_name}: パラメータが指定されなかったため、デフォルト設定で実行します。" fi
local usage="[INFO] Usage: ${func_name} --job-name <JOB_NAME> --location <LOCATION> --job-name 実行対象のジョブ名を指定します。 --location 対象のロケーションを指定します。
[INFO] Example: ${func_name} --job-name my-job --location us-central1[INFO] Detail of gcloud is here: <https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/run>"
while [ $# -gt 0 ]; do case "$1" in --help) echo "$usage" return 0 ;; --job-name) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --job-name の引数が指定されていません。" return 1 fi job_name="$1" ;; --location) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --location の引数が指定されていません。" return 1 fi location="$1" ;; *) echo "[ERROR] ${func_name}: 不明なパラメータ '$1' です。" return 1 ;; esac shift done
# 必須パラメータのチェック if [ -z "${job_name}" ]; then echo "[ERROR] ${func_name}: --job-name は必須パラメータです。" return 1 fi if [ -z "${location}" ]; then echo "[ERROR] ${func_name}: --location は必須パラメータです。" return 1 fi
# コマンド組み立て local cmd="gcloud scheduler jobs run ${job_name} --location=${location}" echo "[INFO] ${func_name}: 実行するコマンド: ${cmd}"
# コマンド実行とエラーハンドリング eval "${cmd}" if [ $? -ne 0 ]; then send_discord_notification_about_gcscheduler "失敗…" "ジョブを強制実行できなかったよ…" "red" echo "[ERROR] ${func_name}: コマンド実行中にエラーが発生しました。" return 1 fi send_discord_notification_about_gcscheduler "強制実行したよ!" "ジョブを強制実行したよ!" "green" echo "[INFO] ${func_name}: Scheduler job '${job_name}' executed successfully."}ジョブを一時停止する関数
最後に、ジョブを一時停止する関数を実装します。
function pause_gcloud_scheduler_job() { # 関数名をローカル変数に格納 local func_name="${FUNCNAME[0]}" send_discord_notification "ジョブを一時停止するよ!"
# 初期値 local job_name="" local location=""
# パラメータ解析 if [ $# -eq 0 ]; then echo "[INFO] ${func_name}: パラメータが指定されなかったため、デフォルト設定で実行します。" fi
local usage="[INFO] Usage: ${func_name} --job-name <JOB_NAME> --location <LOCATION> --job-name 対象のジョブ名を指定します。 --location 対象のロケーションを指定します。
[INFO] Example: ${func_name} --job-name my-job --location us-central1[INFO] Detail of gcloud is here: <https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/pause>"
while [ $# -gt 0 ]; do case "$1" in --help) echo "$usage" return 0 ;; --job-name) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --job-name の引数が指定されていません。" return 1 fi job_name="$1" ;; --location) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --location の引数が指定されていません。" return 1 fi location="$1" ;; *) echo "[ERROR] ${func_name}: 不明なパラメータ '$1' です。" return 1 ;; esac shift done
# 必須パラメータのチェック if [ -z "${job_name}" ]; then echo "[ERROR] ${func_name}: --job-name は必須パラメータです。" return 1 fi if [ -z "${location}" ]; then echo "[ERROR] ${func_name}: --location は必須パラメータです。" return 1 fi
# コマンド組み立て local cmd="gcloud scheduler jobs pause ${job_name} --location=${location}" echo "[INFO] ${func_name}: 実行するコマンド: ${cmd}"
# コマンド実行とエラーハンドリング eval "${cmd}" if [ $? -ne 0 ]; then send_discord_notification_about_gcscheduler "失敗…" "ジョブを一時停止できなかったよ…" "red" echo "[ERROR] ${func_name}: コマンド実行中にエラーが発生しました。" return 1 fi send_discord_notification_about_gcscheduler "一時停止したよ!" "ジョブを一時停止したよ!" "green" echo "[INFO] ${func_name}: Scheduler job '${job_name}' paused successfully."}実際の使用例
これらの関数を組み合わせて、実際のユースケースに応用してみましょう。以下は、テスト用コンテナを順番に起動するための関数です。
function setup_test_container_container_image() { resume_gcloud_scheduler_job --job-name 'setup_test_container_container_image_boot_db' --location 'us-central1' run_gcloud_scheduler_job --job-name 'setup_test_container_container_image_boot_db' --location 'us-central1' pause_gcloud_scheduler_job --job-name 'setup_test_container_container_image_boot_db' --location 'us-central1' run_gcloud_scheduler_job --job-name 'setup_test_container_container_image_job_1' --location 'us-central1' run_gcloud_scheduler_job --job-name 'setup_test_container_container_image_job_2' --location 'us-central1' run_gcloud_scheduler_job --job-name 'setup_test_container_container_image_job_3' --location 'us-central1'}この関数では、以下のような処理を行っています。
- データベースコンテナを起動するジョブを再開
- データベースコンテナを即時実行
- データベースコンテナのジョブを一時停止(次回のスケジュール実行を防止)
- ジョブ1を実行
- ジョブ2を実行
- ジョブ3を実行
このように、複数のジョブを順番に実行することで、コンテナ間の依存関係を考慮した起動シーケンスを実現できます。例えば、データベースコンテナが起動してから他のジョブを実行するといった順序制御が可能です。
シェル関数のエラーハンドリングとDiscord通知
これらの関数には、エラーハンドリングとDiscord通知の機能が組み込まれています。これにより、ジョブの実行状況をリアルタイムで監視できます。
Discord通知の例
send_discord_notification "ジョブを再開するよ!"エラー発生時の通知
if [ $? -ne 0 ]; then send_discord_notification_about_gcscheduler "失敗…" "ジョブを再開できなかったよ…" "red" echo "[ERROR] ${func_name}: コマンド実行中にエラーが発生しました。" return 1fi成功時の通知
send_discord_notification_about_gcscheduler "再開したよ!" "ジョブを再開したよ!" "green"これらの通知機能により、ジョブの実行状況を常に把握できるため、問題が発生した場合にも迅速に対応できます。
シェル関数のパラメータ解析
これらの関数では、パラメータ解析にwhileループとcase文を使用しています。これにより、--job-nameや--locationなどのパラメータを柔軟に処理できます。
while [ $# -gt 0 ]; do case "$1" in --help) echo "$usage" return 0 ;; --job-name) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --job-name の引数が指定されていません。" return 1 fi job_name="$1" ;; --location) shift if [ -z "$1" ]; then echo "[ERROR] ${func_name}: --location の引数が指定されていません。" return 1 fi location="$1" ;; *) echo "[ERROR] ${func_name}: 不明なパラメータ '$1' です。" return 1 ;; esac shiftdoneまた、必須パラメータのチェックも行っています。
if [ -z "${job_name}" ]; then echo "[ERROR] ${func_name}: --job-name は必須パラメータです。" return 1fiif [ -z "${location}" ]; then echo "[ERROR] ${func_name}: --location は必須パラメータです。" return 1fiこれにより、パラメータの不足や誤りを早期に検出し、エラーメッセージを表示できます。
まとめ
今回は、Google Cloud Schedulerのジョブを操作するgcloudコマンドをシェル関数化する方法を紹介しました。シェル関数化することで、以下のようなメリットがあります。
- コマンドの簡略化 - 長いコマンドを短い関数名で呼び出せる
- パラメータのバリデーション - 必須パラメータの有無をチェックできる
- エラーハンドリング - コマンド実行時のエラーを適切に処理できる
- ヘルプ機能の追加 -
helpオプションでコマンドの使い方を表示できる - 通知機能の統合 - Discordなどに実行結果を通知できる
- 複数コマンドの連携 - 複数のコマンドを組み合わせた処理を1つの関数にまとめられる
これらの関数を使うことで、Cloud Schedulerを使ったコンテナの操作がより簡単かつ安全になります。特に、複数のコンテナを順番に起動するような複雑なシナリオでも、シンプルな関数呼び出しで実現できます。
また、これらの関数はテンプレートとして利用できるため、他のgcloudコマンドをシェル関数化する際にも参考になるでしょう。
おしまい


以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!