Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to automatically delete old Google App Engine version instances?

I'm experimenting with more cost effective ways to deploy my Rails apps, and went through the Ruby Starter Projects to get a feel for Google Cloud Platform.

It's almost perfect, and certainly competitive on price, but I can't figure out how to automatically delete old deployed version instances after redeploying.

ie: let's say I have one version of each instance running:

Compute Engine -> VM Instances

And then I make a change to my app and redeploy with:

$ gcloud preview app deploy app.yaml worker.yaml --promote 

So now I have two versions of each instance deployed (as Google switches between them intelligently, I'd assume):

Compute Engine -> VM Instances have doubled

But now what? Will these instances ever turn off by themselves? The best way I've found of getting rid of them so far is from the tutorial's Deleting the project page:

Deleting app versions

You can find the list of your app versions in the Versions page. To delete the non-default versions, select the check boxes and then click Delete.

appengine/versions

Is everyone on Google App Engine just manually deleting the old deployments of their apps?

like image 889
cgenco Avatar asked Dec 28 '15 19:12

cgenco


People also ask

How do I uninstall App Engine versions?

You can find the list of your app versions in the Versions page. To delete the non-default versions, select the check boxes and then click Delete.

What is Google App Engine instance?

Instances are the basic building blocks of App Engine, providing all the resources needed to successfully host your application. At any given time, your application can be running on one or many instances with requests being spread across all of them.

Is App Engine always running?

App Engine attempts to keep manual and basic scaling instances running indefinitely. However, at this time there is no guaranteed uptime for manual and basic scaling instances.


2 Answers

To stop all instances of all non-default versions of all modules (independently of what languages those modules are in), you could add a small control module, written in Python, using the modules API:

from google.appengine.api.modules import modules  # core logic (inside a cron or other handler) for m in modules.get_modules():     dv = modules.get_default_version(m)     for v in modules.get_versions(m):         if v != dv: modules.stop_version(m, v) 

This doesn't delete the non-default versions (the modules API does not appear to currently support deletion), but does ensure that none of their instances are running (so no charges would be incurred for them).

This core logic is meant for you to wrap it inside a handler, so you can trigger it as required, for example in a cron job, or in a "regular" handler that you trigger from the outside (with appropriate auth) e.g. via wget or curl within your bash scripts.

I don't believe there's a Ruby version of Python's google.appengine.api.modules.modules , but, I could be wrong... I just couldn't find one. However, a simple Python-coded module should let you control modules coded in whatever other App Engine language (since App Engine lets you mix and match modules coded in different languages).

like image 56
Alex Martelli Avatar answered Sep 20 '22 20:09

Alex Martelli


We deploy an App Engine instance from Cloud Build, which is a common deployment pattern. At the end of the cloudbuild.yaml, we specify the following commands as the last build step, which deletes every version except the last 5 versions:

versions=$(gcloud app versions list \   --service default \   --sort-by '~VERSION.ID' \   --format 'value(VERSION.ID)' | sed 1,5d) for version in $versions; do   gcloud app versions delete "$version" \     --service default \     --quiet done 
like image 30
Nebulastic Avatar answered Sep 18 '22 20:09

Nebulastic