i have the same issue i want to deploy multi stages on the same api gateway like we can do from AWS dashboard without creating a new stack , have u found a solution for this ?
If you want to deploy multiple stage with same API,
You can:
Make multiple stage : dev and prod
State stageVariable for both stage
Create a new version for your Lambda, for example it is Version:1
Create 2 alias of Lambda: dev and prod
Then make dev alias point to $Latest version
Make prod alias point to Version:1 (Created at step above)
Then in your method -> Put/Get/Post-> Integration Request -> Lamba Function-> set the value to: your-lambda-arn:${stageVariables.lambdaAlias} (Note that lambaAlias is what you set at stageVariable above
Then you done. The idea here is,
prod api stage with stage variable prod point to prod lambda alias which will point to version 1
dev api stage with stage variable dev point to dev lambda alias which will always point to $Latest
So by this, prod api endpoint will always go to Version 1, which will never changed.
Then you continue the development that will always changing and test. By this, any changes only will happen in api dev stage and wont fucked up in production stage. Production will stay unchanged.
All the stuff will inside 1 stack
I done this all using CDK. You can try in console. Just my 2 cents. hope you find helpful
If you using CDK, then you integrate your Apigateway like this:
api = apigateway.LambdaRestApi(
self, "YourApiName",
#.. all other stuff
)
# The contruct define above.
my_api_integration = ApiIntegration(self, "MyApiIntegration", function="MyFunctionLambda")
# pass the constuct to the method
my_api_method = api.add_method(
"POST", integration=my_api_integration.integration)
So I think in your serverless.yaml, you need to define the API uri like I done above. So the process look like this
User make request -> hit your apigateway endpoint -> apigateway hit your lambda using the "API uri"
Why api_uri?
This is the only way you can pass the {stageVariable.lambdaAlias} value to the lambda. When you get this value inside the lambda, then you can do other crazy shit depends to this lambdaAlias value.
So you get the idea. And remember, grant the apigateway endpoint permission to invoke your lambda.
i have the same issue i want to deploy multi stages on the same api gateway like we can do from AWS dashboard without creating a new stack , have u found a solution for this ?
If you want to deploy multiple stage with same API,
You can:
dev
andprod
dev
andprod
dev
alias point to $Latest versionprod
alias point to Version:1 (Created at step above)your-lambda-arn:${stageVariables.lambdaAlias}
(Note that lambaAlias is what you set at stageVariable aboveThen you done. The idea here is,
prod
point toprod
lambda alias which will point to version 1dev
point todev
lambda alias which will always point to $LatestSo by this, prod api endpoint will always go to Version 1, which will never changed.
Then you continue the development that will always changing and test. By this, any changes only will happen in api
dev
stage and wont fucked up in production stage. Production will stay unchanged.All the stuff will inside 1 stack
I done this all using CDK. You can try in console. Just my 2 cents. hope you find helpful
Really useful, Trying to implement the same however I am struggling to pass the below configuration using serverless yaml.
Put/Get/Post-> Integration Request -> Lamba Function-> set the value to: your-lambda-arn:${stageVariables.lambdaAlias}
Can you please share your thoughts? any snippet?
I using CDK. so I share some of the snippet, then you will get the idea, not sure about Serverless yaml, never used serverless framework.
First define a API uri like this in a CDK contrust
The
api_uri
will make a endpoint to your lambda. The idea is make aURL
for your lambda, then APIgateway will call to thisURL
for integration.For the URI I define above, you can look at this example (The URI part in Open 3.0) :
docs.aws.amazon.com/apigateway/lat...
And this one, read at the 6th item
docs.aws.amazon.com/apigateway/lat...
If you using CDK, then you integrate your Apigateway like this:
So I think in your serverless.yaml, you need to define the API uri like I done above. So the process look like this
Why api_uri?
This is the only way you can pass the {stageVariable.lambdaAlias} value to the lambda. When you get this value inside the lambda, then you can do other crazy shit depends to this
lambdaAlias
value.So you get the idea. And remember, grant the apigateway endpoint permission to invoke your lambda.
Recently I answer a question about this topic in SO. If interested you can look it here. Cheers
I have create a whole tutorial series in here using CDK about this topic as well, feel free to take a look