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