GCE インスタンスのスケジュール設定をしよう

resonite の ヘッドレスサーバ を必要な時にだけ自動起動/自動停止する手順です。

前提条件

こちらでセットアップした Google Cloud Shell を利用して Google Cloud をコマンドラインから操作します。

インフラ設定用の環境変数を設定する

環境変数を読み込みます

source ~/resonite-headless-infra/scripts/env-headless-server.bash

環境変数が設定されたことを確認します

echo -e \
    "RESONITE_HEADLESS_ENVIRONMENT\t\t=\t${RESONITE_HEADLESS_ENVIRONMENT}"\\n\
    "VPC_NAME\t\t\t\t=\t${VPC_NAME}"\\n\
    "SUBNET_NAME\t\t\t\t=\t${SUBNET_NAME}"\\n\
    "REGION\t\t\t\t\t=\t${REGION}"\\n\
    "SUBNET_RANGE\t\t\t\t=\t${SUBNET_RANGE}"\\n\
    "RESONITE_HEADLESS_SERVER_INSTANCE_NAME\t=\t${RESONITE_HEADLESS_SERVER_INSTANCE_NAME}"\\n\
    "IMAGE_PROJECT\t\t\t\t=\t${IMAGE_PROJECT}"\\n\
    "IMAGE_FAMILY_SCOPE\t\t\t=\t${IMAGE_FAMILY_SCOPE}"\\n\
    "IMAGE_FAMILY\t\t\t\t=\t${IMAGE_FAMILY}"\\n\
    "ZONE\t\t\t\t\t=\t${ZONE}"\\n\
    "SETUP_RESONITE_HEADLESS_SERVER_SCRIPT\t=\t${SETUP_RESONITE_HEADLESS_SERVER_SCRIPT}"\\n\
    "MACHINE_TYPE\t\t=\t${MACHINE_TYPE}"\\n\

gcloud CLI の構成を設定します

PROJECT_NAME=$(gcloud config list --format="value(core.project)")
gcloud config set project ${PROJECT_NAME}
gcloud config set compute/zone ${ZONE}
gcloud config set compute/region ${REGION}

インスタンスを自動起動、自動停止する

Google Cloud のリファレンス「 VM インスタンスの起動と停止をスケジュールする 」を参考にしてください。

Compute Engine サービスエージェントに、権限を付与する

Compute Engine のサービスエージェントに roles/compute.instanceAdmin.v1 を付与する必要がある

プロジェクトIDを変数にします

PROJECT_ID=$(gcloud config list --format="value(core.project)")

プロジェクトナンバーを変数にする

PROJECT_NUMBER=$(gcloud projects list --filter="projectId=${PROJECT_ID}" --format="value(projectNumber)")

Compute Engine のサービスエージェント名を変数にします

COMPUTE_ENGINE_SERVICE_AGENT=service-${PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com

ロール roles/compute.instanceAdmin.v1 を Compute Engine のサービスエージェントに付与します

gcloud projects add-iam-policy-binding ${PROJECT_ID} --member="serviceAccount:${COMPUTE_ENGINE_SERVICE_AGENT}" --role="roles/compute.instanceAdmin.v1"

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

スケジュール名を変数に入れます(任意)

SCHEDULE_NAME=kakko

スケジュールを作成します

# 例: 火曜日の 20:30 に起動して、毎日 0:00 に停止する
gcloud compute resource-policies create instance-schedule ${SCHEDULE_NAME} \
    --region=${REGION} \
    --vm-start-schedule='30 20 * * TUE' \
    --vm-stop-schedule='0 0 * * *' \
    --timezone=Japan

スケジュール一覧を出力します

gcloud compute resource-policies list

スケジュールを削除する

gcloud compute resource-policies delete ${SCHEDULE_NAME} --region=${REGION}

インスタンススケジュールをインスタンスに付与する

# インスタンス名を変数に入れる
RESONITE_HEADLESS_SERVER_INSTANCE_NAME=$(gcloud compute instances list --format="value(name)"|fzf)

# インスタンススケジュールを付与する
gcloud compute instances add-resource-policies ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} --resource-policies=${SCHEDULE_NAME}

# 外す
gcloud compute instances remove-resource-policies ${RESONITE_HEADLESS_SERVER_INSTANCE_NAME} --resource-policies=${SCHEDULE_NAME}

# インスタンス一覧(スケジュール表示)
gcloud compute instances list --format="table(name, resourcePolicies[0].basename(), zone, machineType, scheduling.preemptible, networkInterfaces[].accessConfigs[natIP], status)"

以上

明日の記事 へ続きます。