This Google AppEngine application will start and stop Google Compute Engine instances on demand.
Load will be tested per group.
TODO: Currently, instances are started in any random zone within the zone group, but we would like to do this with regard to scheduled downtime.
In each zone group, one server instance will be designated active instance. That is an instance that currently can handle new incoming connections without hitting the thresholds.
When the active instance in a zone group is changed, you may announce this to other servers (announce URLs).
You can add any number of measure points and call them anything you like, for example connections
, traffic
, messages
or cpu
.
For each measure point, you must set:
max
= The maximum allowed number. When an active instance hits this number, another instance will become active.slope
= If this server previously has themax
and stopped being active, it must go down to this percentage ofmax
until it can become the active instance again.start
= When the least loaded instance hits this percentage ofmax
, then start a new instance. This new instance will not become active immediately, it is just started at this point to be prepared when the previously active server hitsmax
.stop
= If any instance has less than this percentage ofmax
, inactive instances should be shut down.
Compute Engine instances should report their current load to computeengineondemand. That can be made just using Curl in a cronjob.
For example:
curl -F action=report -F connections=1800 -F messages=9000 -F traffic=90000000 http://APPENGINE_ID.appspot.com/report
Computeengineondemand will know which instance is reporting by the IP address.
What HTTP POST variables to report (the load) is defined by the measure poins configuration in the admin.
Active instances may push arbitrary data to the announce servers. When reporting load, instances could add a POST variable called data
. That information would then be sent to all announce URL if this instance is the active instance in it's zone group.
curl -F action=report -F connections=1800 -F messages=9000 -F traffic=90000000 -F data="some data that is important" http://APPENGINE_ID.appspot.com/report
Clone the git repository for this project to your computer:
$ git clone REPOSITORY-URL
You will need to make three configuration changes before deploying:
app.yaml
: Change the value ofapplication:
to your App Engine application ID.main.py
: Change the value ofPROJECT_ID
to your project id which has GCE enabled.
Give your App Engine application's service account edit
access to your GCE project:
- Log into the App Engine Admin Console.
- Click on the application you want to authorize.
- Click on Application Settings under the Administration section on the left-hand side.
- Copy the value under Service Account Name. This is the service account name of your application, in the format application-id@appspot.gserviceaccount.com. If you are using an App Engine Premier Account, the service account name for your application is in the format application-id.example.com@appspot.gserviceaccount.com.
- Use the Google APIs Console to add the service account name of the app as a team member to the project. Give the account
edit
permission.
Deploy the application to App Engine:
$ appcfg.py update .
Note: Because this application is using GAE app identity for authentication to GCE, it will not work on the local development server.