GCPクソザコが2日考えた末実現できた実装
前提 / 要件
- 遊び
- 動けばいい
- 金なし
- インスタンス起動時間を指定時間帯だけに絞りたい
- 無料で実装したい
- 暇なし
- 手運用なし
- 知識なし
- GCE と最低限の gcloud コマンドだけ使う(しか使えない)
方針
- 無料枠で f1-micro インスタンスを立て、常時起動のスケジューラとする
- gcloud コマンドで指定インスタンスの起動停止を制御する
- crond で gloud コマンドの実行をスケジューリングする
環境
- スケジューラ用インスタンス
- マシンタイプ: f1-micro(無料枠)
- OS: Ubuntu 16.04(crond があればなんでもいい)
- 起動停止対象インスタンス
- 何でも良い
実装
スケジューラ用インスタンス作成
とりあえずUbuntuにした
crondとgcloudコマンドが使えればなんでもいい
gcloud コマンドはデフォで入っている
IAM 設定
gcloud コマンド実行用のサービスアカウントを作る
クソザコなのですべてGUIでポチポチやりました
役割作成
起動停止に必要な権限を持つ役割をつくる
ここで与える権限は今回の環境をもとに検証した最低限のものです
- [IAMと管理] > [役割] から役割を新規作成
- 名前: 起動停止制御(なんでもいい)
- 説明: なんでもいい
- 権限の追加:
compute.instances.get
compute.instances.start
compute.instances.stop
compute.zoneOperations.get
サービスアカウント作成
gcloud コマンドを実行するサービスアカウントをつくり、役割を割り当てる
- [IAMと管理] > [サービスアカウント] からサービスアカウントを新規作成
- サービスアカウント名: cron01(適当)
- サービスアカウントID: cron01@<projectID>.iam.gserviceaccount.com(勝手に入る)
- 役割: 起動停止制御(上でつくったもの)
- 新しい秘密鍵を提供
- 作成後、秘密鍵[<projectName>-xxxxxxxxxxxx.json]がダウンロードされる
gcloud 環境設定
作ったサービスアカウントをgcloud実行環境で認証する必要がある
- 上でダウンロードした秘密鍵[<projectName>-xxxxxxxxxxxx.json]をスケジューラ用インスタンス上にアップロードする(どうやってでもいい)
- スケジューラ用インスタンスのOSにcron実行ユーザでログインする
- 以下のコマンドを実行して作成したサービスアカウントを認証させる
gcloud auth activate-service-account --key-file "\<projectName>-xxxxxxxxxxxx.json"
- 以下のコマンドを実行して作ったサービスアカウントがACTIVEになってることを確認する
gcloud auth list
cron 設定
起動停止用のgcloudコマンドをcronに登録してスケジュール実行させる
スクリプト作成
gcloudのコマンドだけ書いた最低限のもの
cron実行ユーザに実行権限を与える
エラー制御やログ出力などしたければ適宜加えてください
instance_start
gcloud --account=<作ったサービスアカウントID> compute instances start <起動停止対象インスタンス名> --project <対象プロジェクトID> --zone <対象ゾーン名>
instance_stop
gcloud --account=<作ったサービスアカウントID compute instances stop <起動停止対象インスタンス名> --project <対象プロジェクトID> --zone <対象ゾーン名>
cron登録
とりあえず0時起動12時停止で登録する
crontab -e # cron実行ユーザで打つ
crontab
0 0 * * * /<path>/instance_start
0 12 * * * /<path>/instance_stop
確認
/var/log/syslog
スケジューラ用インスタンス上でcronの実行ログを見る
cat /var/log/syslog | grep <起動スクリプト名>
cat /var/log/syslog | grep <停止スクリプト名>
gcpのログ
クソザコなのでGUIからみる
- [Logging] > [ログ]
- 検索フィルタ:
- GCE VM インスタンス, <起動停止対象インスタンス>
compute.instances.start
compute.instances.stop
- 検索フィルタ:
以上、よろしくお願いいいたします
参照
- Google Compute Engineでcronを使って日次バッチ処理を実行する:
https://www.marketechlabo.com/batch-processing-on-gce/