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

Code

はじまり

リサちゃん
リサちゃん

あー、また強制実行しなければ・・・

135ml
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コマンドを見てみましょう。 それぞれのコマンドは以下の公式ページでも確認できます。

gcloud scheduler jobs resume  |  Google Cloud CLI Documentation

ジョブの再開(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."
}

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

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

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

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

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

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

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

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

Discord通知の例

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

エラー発生時の通知

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

成功時の通知

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

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

まとめ

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

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

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

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

おしまい

リサちゃん
リサちゃん

通知も出来て楽だなぁ

135ml
135ml

他のgcloudコマンドもまとめたいですね。

以上になります!

コメント

タイトルとURLをコピーしました