Does GAE support me having unlimited subdomains? - google-app-engine

If I want to run my service on google app engine (python), do they all me to create my own custom subdomains easily and without any limit?
For example, my service will run on my custom domain:
www.example.com
For each customer I will create their own custom domain like:
customer1.example.com
I may have 1000's of customers, so this would have to be easily done using an API call or they allow wildcards.
My application will analyze the subdomain and lookup the customer.
This will be a single application that will handle all subdomains.

Sure, have the wildcard (*) CNAME record of your domain (i.e. *.example.com) point to ghs.googlehosted.com in your DNS panel and all requests to any subdomain of your main domain will go to your app (and make sure this is also reflected on the GAE's Custom Domains Settings Page as shown on the screenshot below):
Then have one of your first webapp2 routes as something similar to:
# match all subdomains BUT www
DomainRoute(r'<:(?!www\.)[^.]+>.example.com', [
Route('/', handler=CustomSubDomainHandler)
])
which will match requests to any subdomains but the www one (since you might want to serve your actual app via that one).
And your CustomSubDomainHandler could look simmilar to:
class CustomSubDomainHandler(webapp2.RequestHandler):
def get(self):
subdomain = self.request.host.split('.')[0]
# code to look up the customer by analyzing the `subdomain` goes here...

Related

Google cloud DNS: point naked domain to www?

I maintain the owon.ro domain which uses a simple App engine app.
I also we use google cloud dns.
These are the dns records:
A record with IP addresses:
owon.ro. ->
216.239.32.21
216.239.34.21
216.239.36.21
216.239.38.21
CNAME
www.owon.ro. -> ghs.googlehosted.com.
And also some MX records.
The problem is that the app is reachable from the www subdomain and the help section states that those IP addresses should be in the A record for the naked domain to redirect to www, but it doesn't work.
I also tried to use # wildcard for the A record but that doesn't work also.
If you go to owon.ro you will see a 404 page but the www subdomain works.
Am I missing something?
Thank you
Found the answer in the end thanks to Dan Cornilescu.
If you use Google Apps you can set up to redirect the naked domain to www.
If not, you will need to follow the steps by going to
Console > App engine > Settings > Custom Domain.
In here, at the second step, you will have to point www to the app (by using the second option) and clicking Add.
And then also point the naked domain to it by choosing the first option and clicking Add again.
So if I understand correctly you will server the app using www subdomain and the naked domain in contrast to redirecting the naked domain to www as in the Google apps case.
In the end, my custom domain tab looked like this.
And my DNS records looked like this
The DNS operations suggested in step 5c (documentation here) are not enough, you also need to actually add the naked domain to the GAE config (in addition to the www one) - step 5d.
5. Continue to the next step the Add new custom domain form, selecting the custom domain you want to point to your App Engine app:
a. Refresh the console domain page so it will list the domains properly.
b. If you want to use a subdomain, such as www, use the second option (http://www.example.com);
c. If you want to use a naked domain, use the first option to specify a naked domain (such as http://example.com).
d. Click Add to create the desired mapping.
To link the naked domain so it points to the www when you are NOT using appengine you simply add both the 'A' record and a '#' record pointing to the Google ips which are and look like this:
A 300
35.232.62.127
# A 300
216.239.32.21
216.239.34.21
216.239.36.21
216.239.38.21

Setting up custom domain with www on appengine

I've set up a custom domain with Appengine.
The domain currently works as http://example.com (naked domain) but it throws a "This webpage is not available" error with http://www.example.com
Any idea how could I get the 'www' subdomain working? Would it be possible to fix it by adding/changing the DNS records (CNAME, TXT)?
The procedure is as follows:
Navigate to
https://console.developers.google.com/project/yourapp/appengine/settings/domains,
having replaced "yourapp" with your project name.
Click "Add custom Domain"
Go to the 2nd section (it will say "Select the domain you want to point to yourapp").
In that section, select the 2nd field, fill in "www" and select the domain in the dropdown.
Log in to your DNS management dashboard (this could be godaddy.com, namecheap.com, etc).
Add a CNAME record with your DNS host, as follows: alias: "www", address (canonical name): ghs.googlehosted.com, and save.
Give it a few minutes, and www.yoursite.com should now take you to your app (should be the same that can be found at yourapp.appspot.com).
Assumptions I made:
That you wish to point the DNS record to the default module of your AppEngine project. Please leave a comment if you wish 'www' to point to a different module.
That you have already registered your domain with Google and have a TXT DNS record there, proving your ownership of the domain to Google.

How to forward domain requests to gae url

I have different customers who own each their own hosted saas page on my gae app. for example:
myapp.appspot.com/customer/123
myapp.appspot.com/customer/456
each of the customers may want his domain name for example theBigDomain.com to "invisibilly" forward to myapp.appspot.com/customer/123
Please notice I want theBigDomain.com/myservlet?id=theId#aBookmarkUrl to be transmitted to the target url as myapp.appspot.com/customer/123/myservlet?id=theId#aBookmarkUrl
I searched for the google documentation and I can't find a way to do that.
Note: I don't want a redirect where the person who types theBigDomain.com finds he's not there anymore, and I don't want a frame to include my url in the theBigDomain.com since I want the user to be able to click on the back button.
In short, I want the domains to work as proxies, knowing that from what I know, proxies are not good for some content, for exampe, if my target link has a youtube video, this might not work. So I'm asking if there is a way to do a dns redirect for a url and not a domain???
Using subdomains is also limited: creating a subdomain for each customer will be a tedious work...
Using subdomains is also limited: creating a subdomain for each customer will be a tedious work...
How so? This could actually be a lot easier for you/your customers since your customers wouldn't have to deal with domain verification/DNS settings and all you would need to do is add one * (wildcard) host to your main domain pointing to ghs.googlehosted.com and adding *.yourdomain.com in your GAE apps's settings. In your app, in your framework of choice you would then see what subdomain the request came to and and handle it as the customer's unique id (instead of 123/456). See here how you would determine the subdomain on python/webapp2. If you're using a different combination of language/framework - there are alternatives functions as well.
If you still want the customers to use their own domains then it gets a little more complicated. First, they need to provide the full domain name to you, you then add it to your GAE app's settings. Next, you and your customers need to follow one of the verifications steps listed on this page: https://support.google.com/a/answer/60216?hl=en and once that is complete you would need to ask your customers to create a CNAME record on their domains/subdomains pointing to ghs.googlehosted.com. Once the CNAME record is created, you would handle this just like the if these were subdomains on your own domain, i.e. in your framework determine what domain the request came to and handle it as a customer's unique ID to serve that customer's app.

One domain, one codebase, unlimited sub-domains and databases

I want to host a marketing site and a demo app using GAE.
http://mysite.com => Marketing site
http://demo.mysite.com => Demo site
http://client.mysite.com => Client site
...
Each time a client signs up I need to be able to dynamically add a datastore for said client.
Is this something doable using GAE??? Do the Cloud SQL instances have an API I can call to add a DB and beging installing a client account???
Regards,
Alex
You can set up *.mysite.com to point to your app, by setting your CNAME records accordingly. See App Engine's Using a Custom Domain documentation for details on how to set this up properly.
Then, within your servlet/request handler, filter the domain in the request URI to find out what the subdomain is. After that, many of the services (datastore, memcache, etc.) have "multitenancy" support, where you can specify what namespace you're doing operations in. You can set that to the subdomain.
I don't know what language you're using, but here are the docs for multitenancy:
https://developers.google.com/appengine/docs/go/multitenancy/multitenancy
https://developers.google.com/appengine/docs/java/multitenancy/multitenancy
https://developers.google.com/appengine/docs/python/multitenancy/multitenancy

How to handle 3rd-level domains in Google App Engine?

I develop Google App Engine application and want to provide separate 3rd-level domain for each registered user (e.g. username.example.com).What is the best way to handle such kind of features in App Engine?
Currently I see the only one way - set wildcard DNS A-record CNAME-record to point to the application's main address, handle all requests in the central request handler, then parse request's URL, fetch username from URL, and then apply logic neccessary for specified user. But it looks like error-prone approach since it involves manual work and assumptions.
You can't use an wildcard A record wildcard to point to the app; A records point to a single IP address and App Engine apps don't have a single IP address.
You need to use a wildcard CNAME record pointing to ghs.google.com.
Then, in your application, parse the hostname and act appropriately. I'm not sure what you mean by "manual work and assumptions"; it's fairly trivial to split the hostname on . and lookup whether there's a user registered with the first part of the hostname in your database.

Resources