Google Compute Engineの起動と停止をGUIでスケジュールする(初心者向け)

Google Compute Engine(GCE)のVMインスタンスのインスタンス スケジュールを使用して、起動と停止を自動化する。
2021.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部、池田です。
本エントリは クラスメソッド Google Cloud Advent Calendar 20215日目の記事です。

Google Cloudの仮想マシン(VM)を提供するサービスの Google Compute Engine (以下、GCE)のインスタンスの 起動と停止をスケジュールすることで自動化してみます。 探した限りだとGUIでの情報があまりなかったので、今回はコンソールからGUIで行います。

触った範囲だと、公式のガイドのうち、特に↓この辺に注意が必要そうです。
VM インスタンスの起動と停止をスケジュールする

・インスタンス スケジュールを使用するには、プロジェクトの Compute Engine サービス エージェントに次の権限が必要です。
 ・compute.instances.start: VM インスタンスの起動をスケジュールします。
 ・compute.instances.stop: VM インスタンスの停止をスケジュールします。


・インスタンス スケジュールは、インスタンス スケジュールと同じリージョンにある VM インスタンスにのみ接続できます。


・各 VM インスタンスに接続できるのは 1 つのインスタンス スケジュールのみですが、


・スケジュールされた VM インスタンスは、起動オペレーションまたは停止オペレーションを開始するスケジュール時刻よりも最大 15 分遅れることがあります。

スケジュールを設定する

↓今回は「devio-test」という名前の作成済みのGCEインスタンスに対してスケジュールを設定します。

コンソールのGCEの「VMインスタンス」のページ から、「インスタンス スケジュール」→「スケジュールを作成」に進みます。

CRONの方が書きやすそうだったので、CRON式で必要な内容を記載してみました。
インスタンスとスケジュールのリージョンは一致している必要があります。
↑画像は毎時0分に起動を、毎時30分に停止を繰り返し、それを12月4日まで繰り返すような設定です。
ここでの設定時刻より15分まで遅れて起動/停止が始まる可能性があるそうなので、 それを考慮した時刻を設定する必要があります。

作成が完了すると一覧に追加されます。

↑名前のリンクから、
↓詳細画面に遷移して、「スケジュールにインスタンスを追加」から どのインスタンスに作成したスケジュールを適用するか紐づけを行います。

前述の通り、インスタンスとスケジュールのリージョンが異なると、 インスタンスが表示されず選択できませんでした。
また、既にスケジュールが紐づいているインスタンスに2つめのスケジュールを紐づけようとすると、 エラーになりました。

上記の画像はうまく紐づけができた状態ですが、 初めてGCEをスケジュールする時などは、 compute.instances.startcompute.instances.stop の権限が不足している旨のエラーが表示されることがあります。
↓こんな感じのエラー。
Compute Engine System service account service-{PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com needs to have [compute.instances.start,compute.instances.stop] permissions applied in order to perform this operation.
※「{PROJECT_NUMBER}」の部分は実際にはプロジェクト番号が入ります

この場合の対応を次節に書きます。

権限設定

前述のエラーの原因は、 Compute Engine サービス エージェント という種類の サービスアカウント に インスタンスの起動と停止に必要な権限が無いために起きています。

権限を付与するために、IAMの画面から service-{PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com の形式のプリンシパルを探し、編集します。
「Google 提供のロール付与を含みます」を有効にしないと表示されてきません。

必要な権限はエラーメッセージにもあった通り、 compute.instances.startcompute.instances.stop なので、事前定義ロール(Google管理)であれば、「 Compute インスタンス管理者(v1) 」 などを追加します。

私は必要最小限で付与したかったので、必要な2つの権限だけのロールを作成して…
↑作成したカスタムロールを、
↓当該サービスアカウントに付与しました。

上記の権限付与をすることで、 インスタンスとスケジュールの紐づけの際の権限不足によるエラーは解消するはずです。


無事スケジュールの設定ができると、設定内容に従って起動/停止が行われます。
↓ログから確認してみるとこんな感じでした。

(設定した時刻(0分・30分)より14分くらい遅れて発火しているようですね。)

おわりに

テスト環境用などに立てたGCEの停止忘れを防止できそうです。

関連情報/参考にさせていただいたページ