serverless-components / express

⚡ Take existing Express.js apps and host them easily on cheap, auto-scaling, serverless infrastructure (AWS Lambda and AWS HTTP API).
https://serverless.com/components
Apache License 2.0
375 stars 34 forks source link

Can't set base path mapping for domain stage #33

Open kueckermann opened 4 years ago

kueckermann commented 4 years ago

It doesnt seem to be possible to define a base path for a domain in serverless.yml. This would be great since currently, I need to do it manually.

eahefnawy commented 4 years ago

Not sure what you mean @kueckermann 🤔 ... could you clarify? How would that domain look like in serverless.yml?

kueckermann commented 4 years ago

@eahefnawy before using the serverless express component we were using the standard serverless framework with functions. On that we used to use the serverless-domain-manager plugin, which allowed for defining a base path for API gateway. This was valuable because we could with the same domain and point the base path "api.example.com/dev" to our dev stage API, "api.example.com/staging" to our staging API, etc.

I could imagine it would look something like this in serverless.yml, dynamically setting the base path to the stage:

inputs:
  src: ./                        
  description: My Express App    
  domain: api.serverless.com   
  basePath: ${opt:stage}
eahefnawy commented 4 years ago

@kueckermann wouldn't it be the same if you change the subdomain according to the stage?

stage: dev # you can change this to set the stage

inputs:
  domain: ${stage}.api.serverless.com

So you'd get https://dev.api.serverless.com in dev, and https://staging.api.serverless.com in staging.

You could also set the entire domain as an env variable, and have its value stored differently for each stage .env file. So the yml file would be:


inputs:
  domain: ${env:DOMAIN}
# .env.dev

DOMAIN=dev.api.serverless.com
# .env.prod

DOMAIN=api.serverless.com

Does that help?

kueckermann commented 4 years ago

Thanks @eahefnawy but it's unfortunately not the same thing. It depends on how a platform has chosen to set up their API Gateway on AWS. On API Gateway you need to define custom domain mappings for each domain, this includes for each subdomain. If your team has many stages for your API this can make a mess of API Gateway custom domains. AWS has a solution for this, base paths. On every API Gateway cusom domain you can specify to route the first portion of your URL string to a separate API Gateway. For example: api.serverless.com/dev goes to your dev stage. api.serverless.com/qa goes to your quality assurance stage.