Serverless Framework: how to start and some tips
Serverless Framework allows to build serverless apps on AWS using Lambda, API Gateway and S3. In this tutorial you’ll learn the basics to start using the Serverless Framework.
Table of Contents
- Installation
- Initial configuration
- serverless.yml
- Deploy your project
- Update a function configuration
Installation
You can install Serverless Framework tools with npm
(Node).
npm install -g serverless
Initial configuration
First you need to specify your AWS credentials (access keys). There are several ways to do this:
- If AWS CLI is installed on your system (and configured with credentials after running
aws configure
), you don’t need to do anything, because Serverless will get the credentials from$HOME/.aws
. - You can also specify the credentials with
serverless config credentials
:serverless config credentials --provider aws --key <aws_access_key_id> --secret <aws_secret_access_key>
After that, run serverless
and follow the prompts to create a new Serverless project on your working directory (Serverless will create a new folder for the project).
serverless.yml
Basic structure
This is the main file for a Serverless project: here you will define all functions, events, roles, etc. We are going to analyze the file syntax (line identation is important, be consistent using tabs or spaces):
service: my-project
- First, specify the project name with the
service
property.
frameworkVersion: '3'
- Define the Framework version you are using. Run
serverless --version
if you are unsure. CheckFramework Core
version number (e.g.:3.22.0
) and type only the first number (3
in this case).
provider:
- Under
provider
section there are several properties:name: aws
.runtime: <runtime>
: specify the runtime your functions will use.lambdaHashingVersion: 20201221
.stage: prod
.region: <region>
. type the region where the functions will reside.iam:
here you will specify the IAM roles, for example: ``` iam: role: statements:- Effect: Allow
Action:
- ‘s3:’ Resource: ‘arn:aws:s3:::mybucket/’ ```
- Inside
statements:
you type the IAM roles: the effect (Allow
,Deny
), the action and the resource (use the ARN for the resouce).
- Effect: Allow
Action:
functions:
here you define your function name, memory size, events, etc,myfunction:
first, type your function name (replacemyfunction
). Inside this parameter, there are some properties:handler: <handler method path>
: type the path (relative to ‘serverless.yml’) to the function ‘exports.handler’ method (e.g.:lambda/myfunction/index.handler
).memorySize: <number>
: type the memory size, in megabytes (e.g.:128
).timeout: <seconds>
: add a timeout in seconds (e.g.:5
).events:
: here you define the events that trigger the function.httpApi:
: create an API listener, with a path and a HTTP method (get, post, etc.)path: /myfunction
method: post
This is an example of a complete ‘serverless.yml’ file:
service: my-project
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs16.x
lambdaHashingVersion: 20201221
stage: prod
region: eu-west-1
iam:
role:
statements:
- Effect: Allow
Action:
- 's3:*'
Resource: 'arn:aws:s3:::my-bucket/*'
functions:
login:
handler: lambda/login/index.handler
memorySize: 128
timeout: 10
events:
- httpApi:
path: /login
method: post
Advanced tips
Tags
You can add a tag for all the assets of your project, this property go inside provider
section:
tags:
project: my-tag
- If you use an API and you want to tag it as well, add (after
project:
line):httpApi: useProviderTags: true
Roles
Grant getItem
permission to a DynamoDB table:
- Effect: Allow
Action:
- 'dynamodb:getItem'
Resource: 'arn:aws:dynamodb:eu-west-1:12345678:tablemy-table'
Events
Add an S3 event:
- s3:
bucket: my-bucket
event: s3:ObjectCreated:*
rules:
- prefix: path/to/folder/
existing: true
- The
rules
property is optional, use it when you want to limit the event to some folder path. existing: true
means the bucket already exists.
Add a DynamoDB stream event:
- stream:
type: dynamodb
arn: 'arn:aws:dynamodb:eu-west-1:12345678:table/my-table/stream/2022-01-01T18:26:33.939'
Layers
Inside the function section, you can specify Lambda layers the function will use (type their ARN):
layers:
- arn:aws:lambda:eu-west-1:12345678:layer:my-layer:1
On the Web there are a lot of resources about how to create or import Lambda layers (using AWS Serverless Application Repository or manually) but this is an example of adding a useful Node package (‘sharp’) as a layer:
- On a empty folder called
nodejs
, install the desired NPM package:npm install sharp
- Create a ZIP file of the ‘nodejs’ folder. The compressed file need to have this structure:
nodejs/ node_modules/ package-lock.json package.json
- You can optionally upload the file to S3 (this is the recommended practice if the file is bigger than 30MB).
- Go to AWS page,
Lambda -> Layers
and create a new layer. Upload the file or checkUpload from S3
and paste the S3 URL. - Define a recommended architecture (optional) and runtime and click on
Create layer
. - Copy the layer ARN (version number included) and paste it on your ‘serverless.yml’.
Deploy your project
To deploy (and update) a project, run:
serverless deploy
When the process finishes, you’ll see the resources created (also the API URL).
Update a function configuration
To update a function configuration (or its content), run:
serverless deploy function --function <function name>
If you have any suggestion, feel free to contact me via social media or email.
Latest tutorials and articles:
Featured content: