I came across a use case, where I have to deploy a CloudFormation template which creates a lambda resource under my AWS account.
To provide Lambda function code to CFN template I have two ways:
- Use Inline lambda function inside the CFN template.
- Use the Serverless Application Model (SAM) by creating Lambda function artifacts under S3 and putting codeURI in the CFN template.
An inline function is a straightforward approach with a code limitation of 4 KB.
I will explain in this blog how to use SAM as an extension of AWS CloudFormation.
Note: Serverless application is more than just a lambda function, it can include additional resources such as APIs, databases and event source mappings.
Note: Make sure you have SAM CLI installed on your machine and I use Visual Studio Code for AWS CLI
- Download a sample application
# sam init
You can see a sample app folder structure created by the name sam_app under your current folder
- Add your application code and update CloudFormation Template
- Lambda Function – Added a folder under sam_app by the name myLambda containing my Lambda function (ssm_Lambda.py) and requirments.txt file.
- CloudFormation Template – Replaced existing template.yaml with my CFN which will create a lambda resource using a function defined under myLambda Folder (You can see CodeUri: myLambda/)
- Build your application
# sam build
The ‘sam build’ command iterates through the functions in your application, looks for a manifest file (such as requirements.txt ) that contains the dependencies and automatically creates deployment artifacts.
A new folder with all artifacts gets created with the name build under .aws-sam
- Package application
# sam package –s3-bucket abhishek-bucket-lambda –output-template-file template-with-artifacts.yaml –no-verify-ssl
Packages an AWS SAM application. It creates a ZIP file of your code and dependencies and uploads it to Amazon S3. It then returns a copy of your AWS SAM template, replacing references to local artifacts with the Amazon S3 location where the command uploaded the artifacts. (Screenshots shows the uploaded zip file using above command and the SAM template template-with-artifacts.yaml)
- Deploy Stack with SAM CLI
# sam deploy –stack-name “Sample-CFN-Stack” –s3-bucket abhishek-bucket-lambda –capabilities CAPABILITY_NAMED_IAM –template-file template-with-artifacts.yaml –region “eu-west-1” –no-verify-ssl
Or, you can also deploy your stack with CloudFormation CLI
# aws cloudformation deploy –template-file C:\Users\abhishek\sam-app\template-with-artifacts.yaml –stack-name “Sample-CFN-Stack”
The CloudFormation is deployed now and it has created the Lambda resource too.