Serverless applications are increasingly popular due to their scalability and cost-effectiveness, and Amazon Web Services (AWS) offers an ideal tool to streamline the process: the AWS Serverless Application Model (SAM).
In this guide, we’ll walk through deploying an Express.js application using AWS SAM, making it easy to build, deploy, and manage your application on AWS.
Whether you’re new to serverless deployments or experienced with AWS, this guide will help you understand how to take advantage of AWS SAM’s benefits for Express.js. Let’s dive in!
Table of contents
Open Table of contents
Prerequisites
Before you start, make sure you have:
- AWS CLI: Download and install the AWS CLI. This tool will allow you to access various aws services.
- AWS SAM CLI: Download and install the AWS SAM CLI if you haven’t already. This tool will allow you to build, test, and deploy your application.
- AWS Account: You’ll need access to an AWS account with permissions to create and manage AWS resources.
- Node.js: Ensure Node.js and npm are installed to run and test your Express.js application.
- Code Files: You can find the codefiles in the following GitHub repo
With these in place, let’s get started!
What is AWS SAM?
AWS SAM is an open-source framework that simplifies the building and deployment of serverless applications on AWS. It extends AWS CloudFormation and offers several additional features:
- Simplified syntax for defining serverless applications.
- Local testing capabilities, allowing you to test AWS Lambda functions and API Gateway endpoints.
- Built-in integration with AWS Lambda, API Gateway, DynamoDB, and more.
With SAM, you define your resources in a template.yaml file, specifying how AWS should provision and configure them.
Why Deploy Express.js on AWS Lambda?
Traditionally, Express.js applications are hosted on dedicated servers or containers. However, deploying Express.js on AWS Lambda offers several advantages:
- Cost-Effectiveness: Pay only for what you use, as AWS Lambda only charges when your code runs.
- Automatic Scaling: AWS Lambda automatically scales based on demand, handling any amount of traffic.
- Reduced Server Maintenance: Offload server maintenance to AWS, allowing you to focus more on development.
By using AWS SAM, we make it easy to deploy Express.js as a Lambda-based API.
Key Components in SAM Deployment
The SAM template (template.yaml) is the heart of your serverless application. This templates decides what and how the resources are goint to get deployed in your aws account.
Components deployed using the YAML file
- API Gateway configuration
- Lambda function specifications
- Other AWS resources needed by your application
Key Considerations
-
Cold Starts: Be aware of potential cold start times for Lambda functions.
-
Statelessness: Design your application to be stateless as Lambda functions are ephemeral.
-
Monitoring: Utilize AWS CloudWatch for monitoring and logging.
Project Structure
- template.yaml: The main SAM template file containing definitions for the Lambda function and API Gateway.
- express/: Directory containing the Express application code.
- src/server.js: Main file for the Express application, handling routing and server logic.
Template Breakdown
The SAM template (template.yaml) includes:
AWSTemplateFormatVersion: "2010-09-09" # Specifies the version of the AWS CloudFormation template format being used.
Transform: AWS::Serverless-2016-10-31 # This applies the AWS SAM (Serverless Application Model) transform for serverless functions and APIs.
Description: >
sam-app
Sample SAM Template for sam-app # Brief description of the template, used for identification and documentation.
# Globals block defines common properties that are applied to serverless resources (e.g., functions).
Globals:
Function:
Timeout: 3 # Sets a timeout of 3 seconds for all Lambda functions in this template.
Resources:
MyCustomApi:
Type: AWS::Serverless::Api # Defines an API Gateway for the serverless application.
Properties:
Name: sam-app # Name of the API Gateway.
StageName: Prod # Defines the deployment stage name as 'Prod'.
# Domain:
# DomainName: "" # Optional. Specify a custom domain for the API if desired.
# CertificateArn: "" # Optional. Specify the ARN of the SSL certificate if using a custom domain.
# EndpointConfiguration: REGIONAL # Sets the endpoint configuration as regional.
GetUserFunction:
Type: AWS::Serverless::Function # Defines a Lambda function in a serverless application.
Properties:
CodeUri: express/ # Directory path where the function code is stored.
Handler: src/server.handler # Entry point for the Lambda function.
Runtime: nodejs18.x # Specifies the runtime for the function, Node.js 18.x in this case.
Architectures:
- x86_64 # Architecture for the Lambda function, here set to x86_64.
Events:
HelloWorld:
Type: Api # Sets up API Gateway as the trigger for the Lambda function.
Properties:
RestApiId: !Ref MyCustomApi # Links the function to the previously defined API Gateway.
Path: /{proxy+} # Specifies a catch-all proxy path, allowing the API to handle any subpath.
Method: ANY # Allows any HTTP method (e.g., GET, POST) for the API requests.
Setup AWS Access
Use the AWS CLI to configure your AWS Access Keys.
aws configure
Note: If you don’t watn to use access keys, you can use an EC2 instance, attach a role to it and then deploy your application using the ec2 instance.
Deploy Application
Step 1: Build the Application
Use the SAM CLI to build the application:
sam build
Step 2: Validate the SAM Template
Use the SAM CLI to build the application:
sam validate
Step 3: Deploy the Application
Use the SAM CLI to build the application:
sam deploy --guided
Conclusion
Deploying Express.js applications using AWS SAM offers a powerful, scalable, and cost-effective solution for modern web applications.
By embracing serverless architecture, developers can focus more on writing code and less on managing infrastructure.
Remember, while serverless deployment simplifies many aspects of application management, it also introduces new concepts and best practices. Continuously learning and adapting to serverless paradigms will help you make the most of this innovative approach to web application deployment.