Google App Engine "manual_scaling" not working

google-app-engine, linux, python

Solution

Figured out my own issue...

Change the `version: 123456` in the .yaml files to be `version: v123456` and it works as expected in production.

Using an integer for a version appears not to be supported in the case of 'manual_scaling' module type. Perhaps it makes the URL for a specific instances ambiguous.

Problem

Currently my Google App Engine design have a front end talking to a resident backend via a URL fetch. The new design will use a module instead of a backend. This is the direction Google wants people to go so this shouldn't be difficult but getting this to run in production has stumped me for days. The "manual_scaling" just doesn't work for me. The "manual_scaling" work fine in the dev_appserver.py (1.8.3) just doesn't work in production. I have simplied the problem as much as possible. Here's a four files that should duplicate the issue: Source Code app.yaml ``` api_version: 1 application: myapp version: 123456 runtime: python27 threadsafe: true handlers: - url: /send_hello/.* script: send_hello.app - url: /hello/.* script: hello.app ``` hello.yaml ``` api_version: 1 application: myapp module: hello version: 123456 runtime: python27 threadsafe: true #comment out these next two lines and it works!!! manual_scaling: instances: 1 handlers: - url: /_ah/start script: hello.app - url: /hello/.* script: hello.app ``` hello.py ``` import webapp2 import logging from google.appengine.api import modules class HelloHandler(webapp2.RequestHandler): def get(self): who = modules.get_current_module_name() logging.info("Hello from the '%s' module" % who) self.response.headers['Content-Type'] = 'text/plain' self.response.out.write("Hello from the '%s' module!\n" % who) mappings = [ (r'/_ah/start', HelloHandler), (r'/hello/.*', HelloHandler) ] app = webapp2.WSGIApplication(mappings, debug=True) ``` send_hello.py ``` import logging import webapp2 from google.appengine.api import urlfetch from google.appengine.api import modules class SendHelloHandler(webapp2.RequestHandler): def get(self): url = "http://%s/hello/world" % modules.get_hostname(module="hello") logging.info('backend url: %s' % url) response = urlfetch.fetch(url=url, method=urlfetch.GET) reply = 'backend response: %d %s' % (response.status_code, response.content)) logging.info(reply) self.response.headers['Content-Type'] = 'text/plain' self.response.out.write(reply) mappings = [ (r'/send_hello/.*', SendHelloHandler) ] app = webapp2.WSGIApplication(mappings, debug=True) ``` Testing with the development server works great Launch it it runs great and you can see the manual scaling instances start up ``` $ dev_appserver.py app.yaml hello.yaml WARNING 2013-08-17 00:19:37,131 api_server.py:317] Could not initialize images API; you are likely missing the Python "PIL" module. INFO 2013-08-17 00:19:37,134 api_server.py:138] Starting API server at: http://localhost:34319 INFO 2013-08-17 00:19:37,147 dispatcher.py:164] Starting module "default" running at: http://localhost:8080 INFO 2013-08-17 00:19:37,157 dispatcher.py:164] Starting module "hello" running at: http://localhost:8081 INFO 2013-08-17 00:19:37,160 admin_server.py:117] Starting admin server at: http://localhost:8000 INFO 2013-08-17 00:19:39,575 hello.py:9] Hello from the 'hello' module INFO 2013-08-17 00:19:39,581 module.py:593] hello: "GET /_ah/start HTTP/1.1" 200 31 ``` Call the front-end that calls the module, it works as expected: ``` $ curl "http://localhost:8080/send_hello/world" backend response: 200 Hello from the 'hello' module! ``` Call the module directly, it works as expected ``` $ curl "http://localhost:8081/hello/world" Hello from the 'hello' module! ``` Testing with the production server fails Load the app into production ``` $ appcfg.py update app.yaml hello.yaml ``` Call the front-end that calls the module.. and get a 404 ``` $ curl "http://123456.myapp.appspot.com/send_hello/world" backend response: 404 <html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>404 Not Found</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Not Found</h1> <h2>The requested URL <code>/hello/world</code> was not found on this server.</h2> <h2></h2> </body></html> ``` Call the module directly and get of 503 error ``` $ curl "http://hello.myapp.appspot.com/hello/world" <html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>503 Server Error</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Server Error</h1> <h2>The service you requested is not available yet.<p>Please try again in 30 seconds. </h2> <h2></h2> </body></html> ``` Call the module with the version specifier and get a 404 error: ``` $ curl "http://123456.hello.myapp.appspot.com/hello/world" <html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>404 Not Found</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Not Found</h1> <h2>The requested URL <code>/hello/world</code> was not found on this server.</h2> <h2></h2> </body></html> ``` The Question... is why doesn't the production manual_scaling instances start up on the production server aka the actual Google server? Notice that if you comment out the manual scaling lines in "app.yaml" the app works as expected in production environment. Another clue is the Google App Engine console shows no logging for "hello" modules and doesn't show any active instances. And strangely the `appcfg.py start hello.yaml` says it already running. Another way to answer this question is point me toward a complete working example of "manual scaling" with modules (the snippets from Google are not enough).

Original source