GCP で Compute Engine を定期的に停止する方法
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
を付与してこれらの権限を追加する必要があります。
- GCP の Cloud Console の「 IAM と管理」 → 「 IAM 」ページを開く
- 「権限」タブが選択された状態で「 Google 提供のロール付与を含める」にチェック
- プロジェクトの Compute Engine サービスエージェントがリストに表示されるのでペンアイコンをクリック
- 役割「 Compute インスタンス管理者 v1 」を追加して保存
ステップ 2 の「 Google 提供のロール付与を含める」:
この権限の付与を行っておかないと、後述の「インスタンススケジュール」をインスタンスに接続するステップでエラーが出て接続ができません。
2. インスタンススケジュールを作成する
- Cloud Console の「 Compute Engine 」 → 「 VM インスタンス」ページを開く
- 「インスタンススケジュール」タブをクリック
- 「スケジュールを作成」をクリック
- 「新しいスケジュールの作成」のモーダルダイアログが開くのでフォームに入力して「送信」
- 「終了時間」フィールドにインスタンスを停止したい時間を設定
- 「タイムゾーン」は「日本標準時(JST)」などに設定
- 「頻度」は「毎日繰り返します」などを設定
- もし頻度をもっと細かく設定したければ「 CRON 式を使用」のチェックを入れて設定する
- インスタンススケジュールが作成できたらその詳細ページを開く
- 「接続されたインスタンス」の「スケジュールにインスタンスを追加」をクリック
- 対象のインスタンスにチェックを入れて「追加」をクリック
ステップ 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