In previous partof this series, we know how to set
environment variables inside our Lambda.
In this part, I will talk about how we can use Apigateway StageVariables, Lambda Version, Alias, Environment variable all together.
We have to understand how the whole process work first, then only we can create this easily using CDK code.
Let's imagine this scenario
- You have an API that will use Lambda function
- You make a Lambda function
- This function will in production which used by real world user
- But you also want to edit this Lambda or continuously develop new stuff for this Lambda
- Now what if you have some error when editing the Lambda code?
Then this will effect you Real world user right? The app will crash, then user leave, give you some nasty feedback.
Can you imagine how painful and stressful when developing stuff like this?
Then this is why Lambda Version and Alias come in handy.
Lambda version work?
- You make a Lambda function
- By default, every Lambda function have a
$Latestversion, this is where you keep editing/developing your code, this only use by you.
- When everything ok, you publish a new
Versionfor the function, let say
version:1. The real world user will access to this
- We will keep repeating the process which is edit code in
$Latest, publish a new
versionevery time when everything ok for production.
By doing this, you keep editing code in
$Latest, any changes in
$Latest will not affect to
version:1, so any error will not annoy your real world user.
Now you have 2
version for your Lambda,
version:1, then how we can set the production user will access
version:1 and developer(us) will access
This is why
Lambda Alias come in handy.
The process of
version look like this:
- Now we need to create 2
aliasfor our Lambda named
devalias -> point to ->
prodalias -> point to ->
version:1(or 2,3,4,5, depends)
Alias is done, but now your frontend application still don't know which Lambda
version to access.
This is why APIGateway
StageVariables come in play.
Now we can create 2
Stage for your API named
This will give us 2 URL which look like this:
Now set a
Stage Variables for each API stage like:
Then the whole process will look like this:
API dev stage -> Lambda dev alias -> Lambda `$Latest` version API prod stage -> Lambda prod alias -> Lambda `version:1`
Then inside the Lambda function we get back the
StageVariables and use it with the
environment variables that we set in previous part:
import boto3 import os def MyFirstLambdaHandler(event, context): client = boto3.client('dynamodb') # Get the stageVariable lambdaAlias stage = event['stageVariables']['lambdaAlias'] # Get the environment variable depends on stage variable if stage == 'prod': tableName = os.environ['production_db_url'] if stage == 'dev': tableName = os.environ['development_db_url'] # Then here you can access different table depends on environment
Now we connecting the dots:
API dev -> Lambda dev alias -> Lambda version:$Latest -> environment variables API prod -> Lambda prod alias -> Lambda version:1 -> environment variables
TLDR, everything in development stay in development, which wont affect anything in production.
Now you have some basic concept for Lambda
stage variables and environment variables.
You now know how to continuously develop your Lambda, but at the same time wont fu**ked up your whole production app when some error happened when developing.
In next part of the series, I will talk about:
- How to create Lambda Version using CDK
- How to create Lambda Alias and hit different Lambda Version using CDK
- How to create different Deployment stage of API gateway and set stage variables using CDK
In case you cant wait that long, here is my previous work on this topic:
Before you go, if you like this series or find this useful consider to buy me a coffee 😊🤞 for 5 USD or more.
I will prepare a GitHub repo for this whole tutorial series and arrange into separate commit for each part.
This will only available for my supporter cause I spent a lot of time to prepare this. Anyway, I appreciate you here. Have a good day.
Shout out to me on Twitter: @upupkenchoong