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

2874 語
14 分
【Cloud Scheduler】コンテナを動かすために必要なgcloudコマンドをシェル関数化する

はじまり#

リサちゃん avatar
リサちゃん
あー、また強制実行しなければ・・・
135ml avatar
135ml
シェル関数にしてしまおう。

Cloud Schedulerでコンテナを操作する#

Google Cloud Schedulerは、スケジュールに基づいてジョブを実行するサービスです。特にコンテナと組み合わせると、定期的なバッチ処理やメンテナンス作業を自動化するのに最適です。

例えば以下のようなユースケースがあります。

  • 毎日深夜にデータベースのバックアップを取る
  • 1時間ごとにデータを集計する
  • 週次でレポートを生成する
  • 特定のタイミングでコンテナを起動し、処理が終わったら停止する

Cloud Schedulerでコンテナを操作する際には、主に以下のgcloudコマンドを使用します。

  • gcloud scheduler jobs resume - 一時停止中のジョブを再開する
  • gcloud scheduler jobs run - ジョブを即時実行する
  • gcloud scheduler jobs pause - 実行中のジョブを一時停止する

これらのコマンドを毎回手動で入力するのは面倒ですし、ミスも発生しやすいです。そこで、これらのコマンドをシェル関数化して、より簡単かつ安全に使えるようにしましょう。

シェル関数化する利点#

gcloudコマンドをシェル関数化することで、以下のような利点があります。

  1. コマンドの簡略化 - 長いコマンドを短い関数名で呼び出せる
  2. パラメータのバリデーション - 必須パラメータの有無をチェックできる
  3. エラーハンドリング - コマンド実行時のエラーを適切に処理できる
  4. ヘルプ機能の追加 - helpオプションでコマンドの使い方を表示できる
  5. 通知機能の統合 - Discordなどに実行結果を通知できる
  6. 複数コマンドの連携 - 複数のコマンドを組み合わせた処理を1つの関数にまとめられる
  7. スニペットとしての利用 - 今後似たような処理を作る時の見本になる

それでは、実際にシェル関数を実装していきましょう。

基本的なgcloudコマンドの紹介#

まず、Cloud Schedulerを操作する基本的なgcloudコマンドを見てみましょう。 それぞれのコマンドは以下の公式ページでも確認できます。

ジョブの再開(resume)#

Terminal window
gcloud scheduler jobs resume JOB_NAME --location=LOCATION

ジョブの即時実行(run)#

Terminal window
gcloud scheduler jobs run JOB_NAME --location=LOCATION

ジョブの一時停止(pause)#

Terminal window
gcloud scheduler jobs pause JOB_NAME --location=LOCATION

これらのコマンドは単純ですが、毎回ジョブ名やロケーションを指定する必要があります。また、エラーが発生した場合の処理も自分で書く必要があります。

シェル関数の実装#

それでは、これらのコマンドをシェル関数化していきましょう。まずは、ジョブを再開する関数から実装します。

ジョブを再開する関数#

Terminal window
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."
}

この関数では、以下のような工夫をしています。

  1. 関数名の取得 - ${FUNCNAME[0]}で現在の関数名を取得し、エラーメッセージなどに使用
  2. Discord通知 - 処理の開始と結果をDiscordに通知
  3. パラメータ解析 - job-namelocationなどのパラメータを解析
  4. ヘルプ機能 - helpオプションで使い方を表示
  5. パラメータのバリデーション - 必須パラメータが指定されているかチェック
  6. コマンドの組み立て - パラメータを使ってgcloudコマンドを組み立て
  7. エラーハンドリング - コマンド実行結果をチェックし、実行完了時もしくはエラー発生時に通知

ジョブを即時実行する関数#

次に、ジョブを即時実行する関数を実装します。

Terminal window
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."
}

ジョブを一時停止する関数#

最後に、ジョブを一時停止する関数を実装します。

Terminal window
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."
}

実際の使用例#

これらの関数を組み合わせて、実際のユースケースに応用してみましょう。以下は、テスト用コンテナを順番に起動するための関数です。

Terminal window
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. データベースコンテナのジョブを一時停止(次回のスケジュール実行を防止)
  4. ジョブ1を実行
  5. ジョブ2を実行
  6. ジョブ3を実行

このように、複数のジョブを順番に実行することで、コンテナ間の依存関係を考慮した起動シーケンスを実現できます。例えば、データベースコンテナが起動してから他のジョブを実行するといった順序制御が可能です。

シェル関数のエラーハンドリングとDiscord通知#

これらの関数には、エラーハンドリングとDiscord通知の機能が組み込まれています。これにより、ジョブの実行状況をリアルタイムで監視できます。

Discord通知の例#

Terminal window
send_discord_notification "ジョブを再開するよ!"

エラー発生時の通知#

Terminal window
if [ $? -ne 0 ]; then
send_discord_notification_about_gcscheduler "失敗…" "ジョブを再開できなかったよ…" "red"
echo "[ERROR] ${func_name}: コマンド実行中にエラーが発生しました。"
return 1
fi

成功時の通知#

Terminal window
send_discord_notification_about_gcscheduler "再開したよ!" "ジョブを再開したよ!" "green"

これらの通知機能により、ジョブの実行状況を常に把握できるため、問題が発生した場合にも迅速に対応できます。

シェル関数のパラメータ解析#

これらの関数では、パラメータ解析にwhileループとcase文を使用しています。これにより、--job-name--locationなどのパラメータを柔軟に処理できます。

Terminal window
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

また、必須パラメータのチェックも行っています。

Terminal window
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

これにより、パラメータの不足や誤りを早期に検出し、エラーメッセージを表示できます。

まとめ#

今回は、Google Cloud Schedulerのジョブを操作するgcloudコマンドをシェル関数化する方法を紹介しました。シェル関数化することで、以下のようなメリットがあります。

  1. コマンドの簡略化 - 長いコマンドを短い関数名で呼び出せる
  2. パラメータのバリデーション - 必須パラメータの有無をチェックできる
  3. エラーハンドリング - コマンド実行時のエラーを適切に処理できる
  4. ヘルプ機能の追加 - helpオプションでコマンドの使い方を表示できる
  5. 通知機能の統合 - Discordなどに実行結果を通知できる
  6. 複数コマンドの連携 - 複数のコマンドを組み合わせた処理を1つの関数にまとめられる

これらの関数を使うことで、Cloud Schedulerを使ったコンテナの操作がより簡単かつ安全になります。特に、複数のコンテナを順番に起動するような複雑なシナリオでも、シンプルな関数呼び出しで実現できます。

また、これらの関数はテンプレートとして利用できるため、他のgcloudコマンドをシェル関数化する際にも参考になるでしょう。

おしまい#

リサちゃん avatar
リサちゃん
通知も出来て楽だなぁ
135ml avatar
135ml
他のgcloudコマンドもまとめたいですね。

以上になります!

記事を共有

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

【Cloud Scheduler】コンテナを動かすために必要なgcloudコマンドをシェル関数化する
https://endorphinbath.com/posts/cloud-scheduler-gcloud-commands-shell-functions/
著者
kinkinbeer135ml
公開日
2025-04-27
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【Cloud Run】コンテナを稼働させるまでに必要なgcloudコマンドをシェル関数化する
Code Google Cloud上でコンテナをデプロイするためにシェル関数を構築します。その関数には処理が完了した時やエラー発生時に通知を行ったりヘルプ機能も実装します。
2
【Google Cloud】GitHub Actionsで認証するためのシェル関数を作る
Code Google Cloud上のリソースを使ってGitHub ActionsでCI/CDするためにシェル関数を構築します。その関数ではサービスアカウントにWorkload Identity連携をして処理の途中に通知を行ったりもします。
3
【GCP】GitHub Actionsからキーなしで認証するための設定
Code Google Cloud Platformに認証するときのIAM設定をシェル上から行い、GitHub Actionsで認証を行う作業を掲載します。この手順を踏むことで、IAMを管理しやすくなるかと思います。
4
【Google Compute Engine】SSH接続できるDebian VMを構築するシェル関数を作る
Code Google Compute Engine上にDebianのVMインスタンスを構築するためのシェル関数を紹介します。それを実行すると、Chromeリモートデスクトップからアクセス出来るVMが使えるようになります。
5
【Cloud SQL】GolangでDBインスタンスの開始停止をスケジュール実行して節約する
Code Golangで書いたCloud Run FunctionでCloud SQLインスタンスの起動と停止を行い、Cloud SchedularとPub/Subでスケジュール実行してコスト削減を図ります。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次