Serverless: Deploy to AWS with two easy commands - Come Zappa
Tags: serverless, python, aws, flask
Published: 2020-08-20 03:13:01

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/alqewmisygzs799qt116.gif)

Deploy a Flask/Django application to a serverless environment with just commands and an Amazon Web Services account.

The requests are handled by the API Gateway and proxied to your application running on a Lambda environment.

From Zappa's website:

> Zappa makes it super easy to build and deploy server-less, event-driven Python applications (including, but not limited to, WSGI web apps) on AWS Lambda + API Gateway. Think of it as "serverless" web hosting for your Python apps. That means infinite scaling, zero downtime, zero maintenance - and at a fraction of the cost of your current deployments!

Keep asking why? Apart from being ultra-cheap (almost always much cheaper than an EC2 or a Docker ECS or Kubernetes cluster), it is by default completely hands-free: takes care of everything and just runs your app in the cloud. But it's customizable so you can completely manage your infrastructure while using Zappa to be between your app and the API Gateway.

# Supported frameworks

    TL;DR: Flask, Django

If you are into Python you're probably interested in this article. More so if you're into frameworks.

A good friend of mine once told me about frameworks:

    It doesn't matter which one you pick. But pick ONE.

Those were the days I was more junior and bold. I basically wrote my own framework.

If you don't know what framework is, [wikipedia](https://en.wikipedia.org/wiki/Software_framework) says that a framework

> provides a standard way to build and deploy applications and is a universal, reusable software environment that provides particular functionality as part of a larger software platform to facilitate the development of software applications, products, and solutions

Back in the day, I was coding everything myself. Great learning experience, for sure.

But, if you really want to make it, it is a good strategy to stand in the shoulder of giants. Do not invent the wheel: improve on the car.

Anyway, this little intro is just to say that if you are into the two most popular Python frameworks (otherwise, just bear with me), [Flask](https://flask.palletsprojects.com/en/1.1.x/) and/or [Django](https://www.djangoproject.com/), then, my friend, you are in for a treat.


# Hello, Flask World

I'm more of a Flask kind of guy. Flask is

> a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to complex applications.

As the quote says, Flask makes it really easy to start a new application, and it's proven to scale and grow with you.

Flask has many plugins you can use to extend the framework.

Remember to be lazy and avoid coding as the plague -- in a good way. What I mean is that if you can find a plugin that adapts to your needs then it is almost most certainly better than coding it yourself. On the one hand, it is very difficult to think all the details that other dozens of develops haven't already thought and resolved. On the other hand, you can even only extend an existing plugin to better suit your needs and at the same time help the community grow.

It is my opinion that at this day and age lonely wolves are less likely to thrive than more socially sharing packs. We can all grow faster together since our collective experience and abilities enhance us. No matter who you are you can always benefit from the interaction.

---

Remember to set up your virtual environment and installing Flask (if don't know what I mean by `virtual environments` click [here](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/))

Flask's website shows how to do a Hello, World web app::

```python
from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "Flask world")
    return f'Hello, {escape(name)}!'
```

And then to execute in the shell

In Linux, in the shell:

```bash
$ env FLASK_APP=hello.py flask run
 * Serving Flask app "hello"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

In Windows' CMD (have you tried [WSL2](https://docs.microsoft.com/en-us/windows/wsl/)? it's awesome), you can do:

```cmd
(venv) C:\Users\an\example>set FLASK_APP=hello.py

(venv) C:\Users\an\example>flask run
 * Serving Flask app "hello.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

Now open your browser to `http://127.0.0.1:5000/` and check the Hello, Flask world.

# Come Zappa

Install Zappa in your virtual environment.

Now the two promised commands:

    zappa init
    ... answer a few questions ...

    zappa deploy

That's it! Hello, Serverless.

# Next Steps

I'd like to write a follow-up article on the myriad of configuration options you have with Zappa:

- Keeping the server _warm_ (faster response)
- CORS
- Use Zappa while managing yourself the infrastructure 
- Using custom IAM
- Much more ...

If you are interested in a next article, comment/like/clap/react to this article to let me know.


Happy Serverless!