Create Serverless API With Zeit Now
Tags: serverless, api
Published: 2019-09-01 20:52:43


For my side project, tracking of favourite TV shows, I created a simple API, that response with the list of data from RSS feed. To make it enjoyable and learn something new on away, I did a serverless infrastructure and wrote some thoughts on what I found out.

If the concept of a serverless application is new to you, in a nutshell, it is a serverless Lambdas (functions) per entry point, stored in a third-party cloud infrastructure provider and executed on-demand — each function stored as a separate package. When you request to a specific endpoint, Lambda function boots up, executes the code and sends back a response.

## Pros and Cons

Consider the advantages and disadvantages of choosing serverless architecture over running a server yourself:
-  Pros
    - Maintainance - service provider is taking care of the server updates, patches, hardware
    - Cost - you pay for what you use; for a number of invocations or computational value
    - Security - each function is stored as a separate package per entry-point
    - Scaling - scales automatically

- Cons
    - Dependance from 3rd party vendor
    - Latency - functions need time to boot up
    - Not suitable for long-time running because of price
    - Hard to test and debug - challenging to replicate a serverless environment

## Choosing provider

As serverless architectures become more popular, more vendors offer their services. To mention popular ones: Amazon AWS Lambda, Google Cloud Function, Cloudflare Workers, Azure Functions.
I looked into AWS and Google services and got lost in the documentation and sign up processes. It looked like too much of a set up for a quick test project.
I've picked Zeit Now Serverless Functions for quick and easy setup, no need for configuration or optimization management.
It supports React, Node.js, Go and many more. You write and push the code with Now, everything else managed automatically, and you receive an entry point to execute your function. Also, it has a free tier, that will probably cover your small project requirements.

## Bootstrap project

Zeit Now CLI offers quick templates to bootstrap your projects. If you still don't have Now installed, you can do that by running following command in a terminal:

```javascript
npm i now -g
```
To list templates, run:

```javascript
now init
```

From the list, select the language or framework that you fancy.
For my project, I use `vanilla-functions` template.

## Create a Function For an Entry Point

For `Now` to create an entry point and function to be valid, it must be placed under `/api` directory in the `root` of a project and exported as a default.
A simple example of a function that sends back a greeting message as a response would be so:

```javascript
// api/greet.js
module.exports = (req, res) => {
  res.send('Welcome!');
}
```

If you create a Node.js application, you will have access to some helpers, that is very similar to `express.js`:
- request.query
- request.cookies
- request.body
- response.status()
- response.json()
- response.send()

## Deployment

Deployment with `Now` is a breeze. Just run a command in a terminal from your project `root` directory:

```javascript
now
```
And see how everything is done for you. After a successful build you will get a deployed application address, similar to this:
`https://vanilla-functions-bcb58vyrs.now.sh`

To send a request for a greeting message, add `/api/greet` suffix to the deployed address:
`https://vanilla-functions-bcb58vyrs.now.sh/api/greet`
That's it. We created a stupid simple API with a meaningful message.

## Conclusion

Serverless infrastructure can be easy to set up, and provider like Zeit Now makes this process friendly for developers. The majority of work is automated and can be done in just a few steps.

Now it's up to you, what's going to happen inside the serverless functions.
If you got interested, see more information about [Now Serverless Functions](https://zeit.co/docs/v2/serverless-functions/introduction/).