GCP で Compute Engine を定期的に停止する方法

Google Cloud Platform

GCP で Compute Engine インスタンスを定期的に停止する方法についてです。

記事執筆時点で次の 2 つの方法がありますが、 A の「インスタンススケジュール」の方がかんたんでお手軽です。

  • A. Compute Engine の「インスタンススケジュール」機能を使う
  • B. Cloud Scheduler と Pub/Sub と Cloud Functions を使う

A の方法があるのに、より複雑で手間のかかる B を選ぶ理由があるだろうか。

B は複雑すぎます。 B はいわば、コンビニでジュースを書いたいときに「ジュースを買うにはお金が必要です。お金を持ち運ぶには財布が必要ですよね。まずは財布を作りましょう!」と誘導されている気持ちになります。 B の方法については昔取り上げました: GCP で処理を定期実する方法

今回は A の「インスタンススケジュール」機能を使ってコンテナの停止を定期的に行う手順を以下かんたんに説明します。

1. 必要な権限を付与する

インスタンススケジュールを使用するには「 Compute Engine サービスエージェント」というプリンシパルが次の 2 つの権限を持っている必要があります。

  • compute.instances.start
  • compute.instances.stop

おそらくデフォルトでは持っていないため、プリンシパルにロール roles/compute.instanceAdmin を付与してこれらの権限を追加する必要があります。

  1. GCP の Cloud Console の「 IAM と管理」 → 「 IAM 」ページを開く
  2. 「権限」タブが選択された状態で「 Google 提供のロール付与を含める」にチェック
  3. プロジェクトの Compute Engine サービスエージェントがリストに表示されるのでペンアイコンをクリック
  4. 役割「 Compute インスタンス管理者 v1 」を追加して保存

ステップ 2 の「 Google 提供のロール付与を含める」:

Google 提供のロール付与を含める

この権限の付与を行っておかないと、後述の「インスタンススケジュール」をインスタンスに接続するステップでエラーが出て接続ができません。

2. インスタンススケジュールを作成する

  1. Cloud Console の「 Compute Engine 」 → 「 VM インスタンス」ページを開く
  2. 「インスタンススケジュール」タブをクリック
  3. 「スケジュールを作成」をクリック
  4. 「新しいスケジュールの作成」のモーダルダイアログが開くのでフォームに入力して「送信」
    • 「終了時間」フィールドにインスタンスを停止したい時間を設定
    • 「タイムゾーン」は「日本標準時(JST)」などに設定
    • 「頻度」は「毎日繰り返します」などを設定
    • もし頻度をもっと細かく設定したければ「 CRON 式を使用」のチェックを入れて設定する
  5. インスタンススケジュールが作成できたらその詳細ページを開く
  6. 「接続されたインスタンス」の「スケジュールにインスタンスを追加」をクリック
  7. 対象のインスタンスにチェックを入れて「追加」をクリック

ステップ 4 のフォーム:

新しいスケジュールの作成

以上です。

確認

実際に停止処理が行われるまで待つのでもよいですが、 gcloud コマンドで次回の実行予定時刻を確認できます。

インスタンススケジュールをリスト表示:

gcloud compute resource-policies list --project='プロジェクト'

特定のインスタンススケジュールの詳細を表示:

gcloud compute resource-policies describe --project='プロジェクト' \
  --region='リージョン' 'スケジュール名'

私の場合は次のような出力が表示されました。

creationTimestamp: '2024-mm-ddT...'
description: ...
id: '...'
instanceSchedulePolicy:
  timeZone: Asia/Tokyo
  vmStopSchedule:
    schedule: 0 0 * * *
kind: compute#resourcePolicy
name: <name>
region: https://www.googleapis.com/compute/v1/projects/<project>/regions/<region>
resourceStatus:
  instanceSchedulePolicy:
    nextRunStartTime: '2024-mm-ddT...'
selfLink: https://www.googleapis.com/compute/v1/projects/<project>/regions/<region>/resourcePolicies/<name>
status: READY

resourceStatus.instanceSchedulePolicy.nextRunStartTime のところが次回の実行予定時刻のようです。

確認時のバージョン

❯ gcloud --version
Google Cloud SDK 464.0.0
bq 2.0.101
core 2024.02.09
gcloud-crc32c 1.0.0
gsutil 5.27

参考


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら