Compute Engine VMインスタンスの起動と停止を自動化する

# Compute Engine VM インスタンスの起動と停止を自動化する

## はじめに
公式ドキュメント「[VM インスタンスの起動と停止をスケジュールする](https://cloud.google.com/compute/docs/instances/schedule-instance-start-stop?hl=ja)」を参考に、Compute Engine VM インスタンスの起動と停止を自動化してみました。

Compute Engine VM インスタンスはインスタンスの起動時間に応じて使用料金が発生します。（最低1分間分の使用料金が発生し、1分以降は1秒単位で課金されます）
なので、開発環境などのインスタンスを休日や夜間停止することで、コスト削減ができます。

## 手順
### 必要な権限を割り当てる
#### 要件の確認と実装方針について
公式ドキュメントの「始める前に」によると、インスタンススケジュールを使うには Compute Engine サービス エージェントに次の権限が必要になります。

 - compute.instances.start
 - compute.instances.stop

これらの権限がない場合は、 Compute インスタンス管理者（v1）ロールを付与する旨が記載されています。

サービス エージェントとは、Google が管理するサービスアカウントです。
ユーザーに代わって処理を行うためにリソースにアクセスするときなどに、サービス エージェントが使われます。
今回は Compute Engine サービス エージェントがユーザーの代わりにインスタンスの起動と停止を実施します。

https://cloud.google.com/iam/docs/service-accounts?hl=ja#google-managed
 
Compute インスタンス管理者（v1）ロールとは、Compute Engine に関わる様々なリソースにアクセスできる権限があります。
このロールだと必要以上の権限が付与されてしまします。

https://cloud.google.com/compute/docs/access/iam?hl=ja#compute.instanceAdmin.v1

なので今回はクラスメソッドさんのブログを参考に、必要な権限だけを付与したロールを作成し、Compute Engine サービス エージェントに付与します。

https://dev.classmethod.jp/articles/gce-instance-scheduling-gui/

#### 割り当て手順
IAM と管理のページの「ロール」から、「ロールの作成」ボタンをクリックします。

作成ページに移行するので、項目を入力します。
「権限を追加」ボタンから、今回必要な2つの権限を選び、「作成」をクリックします。
![ロールの作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/7e06c2a7-8cd5-6aa9-fbf8-8c29ed47c19f.png)

IAM ページに移動し、Compute Engine サービス エージェント（`service-<プロジェクト番号>@compute-system.iam.gserviceaccount.com`）の権限を編集します。

「別のロールを追加」をクリックし、プルダウンから先ほど追加したロールを選択し、保存します。
![権限追加.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/4037e899-ae7b-b51e-8f86-3407eb7724a9.png)

### インスタンススケジュールを作成する
インスタンス スケジュールは、Compute Engine のページの画面上部にあります。
タブを「インスタンス スケジュール」に切り替えると「スケジュールを作成」ボタンが表示されるのでクリックします。
![スケジュールを作成ボタン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/d7ee4b33-aa93-c552-b72c-eb6968f1460a.png)

「新しいスケジュールの作成」パネルが表示されるので、必要事項を入力します。
作成時に設定する「リージョン」は、スケジュールで起動/停止したいインスタンスと同じリージョンにする必要があります。
![新しいスケジュールの作成パネル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/bc3bc119-68ca-d862-8c1b-592284f06da7.png)

「送信」ボタンを押し、スケジュールを作成します。

### スケジュールにインスタンスを追加する
作成したインスタンススケジュールの名前をクリックし、詳細ページを表示します。
![インスタンススケジュールの詳細.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/75ae419e-8be4-3ba6-a45e-38dfc9e6e2db.png)

「スケジュールにインスタンスを追加」ボタンをクリックすると、追加できるインスタンスの一覧がパネルに表示されます。
スケジュールのリージョンを東京（asia-northeast1）にしたので、一覧には東京リージョンのインスタンスのみ表示されます。
追加するインスタンスにチェックを入れて「追加」ボタンを押します。
![インスタンスの追加.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/f97ebb08-7bd9-bfb5-1b61-325e0ab25d68.png)

「[必要な権限を割り当てる](https://qiita.com/ysmmb12/items/93f7d7c5fbe70db8d92f#%E5%BF%85%E8%A6%81%E3%81%AA%E6%A8%A9%E9%99%90%E3%82%92%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B)」を実施していなかった場合、インスタンスの追加で以下のエラーが発生します。
`Compute Engine System service account service-<プロジェクト番号>@compute-system.iam.gserviceaccount.com needs to have [compute.instances.start,compute.instances.stop] permissions applied in order to perform this operation.`
![インスタンス追加でエラー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/b35c7344-ca84-394e-c98e-5f4c5d50a5cc.png)

### 動作を確認
インスタンスの追加が完了したので、動作を確認します。
アクティビティからログを確認することができました。

停止
![vm停止.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/169c791b-5e16-9639-929d-7a035d949483.png)

起動
![vm起動.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/8ceecfdc-8823-62a0-c00a-ecfc4048eebf.png)

ドキュメントには
> スケジュールされた VM インスタンスは、起動オペレーションまたは停止オペレーションを開始するスケジュール時刻よりも最大 15 分遅れることがあります。
 
と記載があり、わたしの環境では指定した時間から2分後に起動/停止オペレーションが実行されていました。
確実に起動/停止したい時間があるなら、遅延を考慮してスケジュールの時間を決める必要があります。


以上です。
どなたかの参考になれば幸いです。