Tools that shutdown GCP Instance on your schedule.
- Shutdown target
- GCE, GKE, SQL
- The label
state-scheduler: true
is required to stop / restart the instance. - In order to be processed, it is necessary to assign a label to Instance, InstanceGroup or Cluster. If a label is assigned to Cluster or InstanceGroup, this tool will reduce the size of InstanceGroup to 0.
- Architecture
- Cloud Scheduler --> Pub/Sub --> CloudFunction
- nothing special
Shutdown instances with CLI command.
go get -u github.com/future-architect/gcp-instance-scheduler/cmd/scheduler
Need to set GOOGLE_APPLICATION_CREDENTIALS
in environment variables before cli execution. See setup
And then you set label to gcp resource
gcloud compute instances create <insntance-name> --zone us-central1-a gcloud compute instances update <insntance-name> --project <project-id> --update-labels state-scheduler=true
Then you can do below commands.
# stop $ scheduler stop --project <your gcp project> # restart $ scheduler restart --project <your gcp project>
You can designate project id and timeout length by using flags. If you use slack notification, you have to enable slack notification by adding the flag --slackNotifyEnable
.
>scheduler stop --help stop is execution command that shutdown gcp resources that assigned target label. Usage: scheduler stop [flags] Flags: -h, --help help for stop -p, --project string project id (default $GCP_PROJECT) -c, --slackChannel string Slack Channel name (should enable slack notify) (default SLACK_CHANNEL) -s, --slackNotifyEnable Enable slack notification -t, --slackToken string SlackAPI token (should enable slack notify) (default $SLACK_API_TOKEN) --timeout int set timeout seconds (default 60) >scheduler restart --help restart is launch shutdown gcp resource. Usage: scheduler restart [flags] Flags: -h, --help help for restart -p, --project string project id (default $GCP_PROJECT) -c, --slackChannel string Slack Channel name (should enable slack notify) (default SLACK_CHANNEL) -s, --slackNotifyEnable Enable slack notification -t, --slackToken string SlackAPI token (should enable slack notify) (default $SLACK_API_TOKEN) --timeout int set timeout seconds (default 60)
Following variables are used when you did not designate these flags.
# | flags | variables |
---|---|---|
1 | project(p) | GCP_PROJECT |
2 | slackToken | SLACK_API_TOKEN |
3 | slackChannel | SLACK_CHANNEL |
Set label for target instance
# GCE gcloud compute instances update <insntance-name> \ --project <project-id> \ --update-labels state-scheduler=true # Instance Group gcloud compute instance-templates create <tmeplate-name> ... \ --project <project-id> \ --labels state-scheduler=true # Cloud SQL (master must be running) gcloud beta sql instances patch <insntance-name> \ --project <project-id> \ --update-labels state-scheduler=true # GKE gcloud container clusters update <cluster-name> \ --project <project-id> \ --zone <cluster-master-node-zone> \ --update-labels state-scheduler=true,restore-size-<node-pool-name>=<node-size>
- install gcloud
When you want to get slack notification, please set these environment variables. You can get slack notification if and only if these three variables are set.
# | variables | Note |
---|---|---|
1 | SLACK_ENABLE | Slack notification enable ("true") |
2 | SLACK_API_TOKEN | Slack api token |
3 | SLACK_CHANNEL | Slack channel name |
As an example, start an instance between 9 and 22:00 on weekdays.
# Deploy Cloud Function: slack notification enable gcloud functions deploy switchInstanceState --project <project-id> \ --entry-point SwitchInstanceState --runtime go111 \ --trigger-topic instance-scheduler-event \ --set-env-vars SLACK_ENABLE=false # Create Cloud Scheduler Job(Stop) gcloud beta scheduler jobs create pubsub shutdown-workday \ --project <project-id> \ --schedule '0 22 * * 1-5' \ --topic instance-scheduler-event \ --message-body '{"command":"stop"}' \ --time-zone 'Asia/Tokyo' \ --description 'automatically stop instances' # Create Cloud Scheduler Job(Start) gcloud beta scheduler jobs create pubsub restart-workday \ --project <project-id> \ --schedule '0 9 * * 1-5' \ --topic instance-scheduler-event \ --message-body '{"command":"start"}' \ --time-zone 'Asia/Tokyo' \ --description 'automatically restart instances'
- publish message to pub/sub
gcloud pubsub topics publish stop-instance-event --project <project-id> --message "{"command":"stop"}"
- confirm Functions log
gcloud functions logs read --project <project-id> --limit 50
- manual launch for job of scheduler
gcloud beta scheduler jobs run shutdown-workday-instance
This project is licensed under the Apache License 2.0 License - see the LICENSE file for details