How to remove stage from URLs for AWS Lambda functions + Serverless framework?
Solution 1
This is an API Gateway feature/convention NOT from Serverless Framework so serverless
can't do anything about it.
API Gateway requires you with a stage and it is appended at the end of your endpoint.
API Gateway endpoints are meant for developers though so it is not meant to be user-friendly.
If you want it to be user-friendly, you can add a custom domain for it. Different stages can have different custom subdomains.
Solution 2
One thing you can do is use a custom domain that you own (e.g. mycompany.com
) and map that to your API Gateway. This way, rather than making a request to https://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/
, you would make a request to https://api.mycompany.com/
.
There's a plugin called serverless-domain-manager
that makes it much easier to set up this custom domains. Check out this blog post for a full walkthrough on how to use it.
Solution 3
In the local environment, we may use the flag --noPrependStageInUrl when running the dev server: sls offline start --noPrependStageInUrl
when using serverless offline. Online, we may set up a CloudFront or custom domain.
Solution 4
Triggered by @dashnug's answer "API Gateway requires you with a stage and it is appended at the end of your endpoint" and another reply that I read elsewhere, I 'solved' the problem by making the stage specification a bit less telling (about which stage environment was referred to) by using v1
as a stage. That also suggests some sort of API versioning, which is acceptable in my case as well.
So, my serverless.yml
section now contains:
provider:
name: aws
runtime: python3.6
memorySize: 512
region: ${opt:region, 'eu-west-1'}
profile: ${opt:profile, 'default'}
stage: ${opt:stage, 'v1'} # A trick to don't end up with "production" or "staging" as stage.
Solution 5
This can be solved by using the httpApi
instead of the http
. Instead of
functions:
index:
handler: handler.index
events:
- http:
path: /
method: get
use this
functions:
index:
handler: handler.index
events:
- httpApi:
path: /
method: get
If you do not rely on the REST protocol which is used with the http
and the HTTP protocol is fine for you, this should do the trick. For reading about the differences this is a good start I think:
https://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/http-api-vs-rest.html
Jochem Schulenklopper
Husband, father of three girls, thinker, tinkerer, intronerd, software, technology, visualizations, coffee, food (esp. desserts), snowboarding, music, Dutch.
Updated on August 09, 2022Comments
-
Jochem Schulenklopper almost 2 years
I'm using Serverless Framework to deploy functions in AWS Lambda, but I can't find where/how I can remove the stage specifier from the URL endpoints created. The documentation does not seem to cover this part.
For example, this is my
serverless.yml
(with irrelevant parts omitted):service: cd-mock provider: name: aws runtime: python3.6 region: eu-west-1 package: include: - handler.py functions: index: handler: handler.index events: - http: path: / method: get
After a
serverless deploy
, the following service information is returned:service: cd-mock stage: dev region: eu-west-1 stack: cd-mock-dev api keys: None endpoints: GET - https://ab1cd2ef3g.execute-api.eu-west-1.amazonaws.com/dev/ functions: index: cd-mock-dev-index
Notice the
/dev
part in the URL endpoint, and also in the function. Thatdev
is the default value for thestage
parameter in the configuration file.Specifying
stage: something
in theserverless.yml
file will have that/something
as suffix in the URL, and as part of the function.Question: how can I remove the stage specification from the generated URL endpoints, or: how can I prevent that stage specification to become part of the generated URLs?
(That the stage is part of the function, is fine. That will be easy to separate
staging
andproduction
functions in the AWS Lambda dashboard.)