Boilerplate flask app that is portable between different serverless platforms (AWS, Azure, GCP).
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
app
bin
config
terraform
tests
.env.example
.gitignore
.pre-commit-config.yaml
.travis.yml
Dockerfile
LICENSE
Makefile
README.md
docker-compose.yml
requirements-to-freeze.txt
requirements.txt
run.py
run_lambda.py
template.yaml
tox.ini

README.md

Python Serverless API

Boilerplate Flask app that is portable between different serverless platforms.


Platforms

Deployment and application code adaptors are being added for the following:


Platform Deployment Status
AWS Lambda AWS SAM ✔️
AWS Lambda Terraform ✔️
Azure Functions Terraform
Google Cloud Functions Terraform
Google Kubernetes Engine gcloud & kubectl
Platform Adaptor Code/Config
Local Development None 💾
AWS Lambda Python >= 3.6 Flask-Lambda-Python36 💾
AWS Lambda Python <= 3.6 Flask-Lambda 💾
Azure Functions
Google Cloud Functions

Setup

1. Create .env file and update contents

This is used to set the environment variables required for deployment and local development.

$ cp .env.example .env
$ vim .env

2. Create a virtualenv then install requirements:

$ make env
$ source env/bin/activate
$ make deps

Example Usage

1. Set Environment

Ensure you have created your virtualenv and have the necessary environment variables set (see setup instructions above).

$ source env/bin/activate
$ source .env

2. Run server

On host
$ make server-debug
In docker
$ docker-compose up

3. Manually test development server

$ http-prompt localhost:5000
GET /artists

AWS Lambda

Terraform Deployment

Ensure you have created your virtualenv and have the necessary environment variables set (see setup instructions above).

Setup

Create terraform state bucket.

$ aws s3 mb --region eu-west-2 s3://<bucket_name>

Update bucket name in /terraform/main.tf.

terraform {
  backend "s3" {
    bucket = "<bucket_name>"
    key    = "terraform.tfstate"
    region = "eu-west-2"
  }
}

Deploy

Bundle the app into a zip and deploy it using terraform.

$ ./bin/deploy

Manually Test API

$ http-prompt $(cd terraform && terraform output api_url)
GET artists

AWS Serverless Application Model (SAM) Deployment

Unlike Terraform SAM doesn't upload the zip bundle so do this using the aws-cli tool.

$ aws s3 mb s3://<mybucket>
$ aws s3 cp terraform/dist/python-serverless-api.zip s3://<mybucket>/python-serverless-api.zip

Update the S3 bucket value in the SAM config.

# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: 'Boilerplate Python 3.6 Flask App.'
Resources:
  FlaskAPI:
    Type: 'AWS::Serverless::Function'
    Properties:
      CodeUri: s3://<mybucket>/flask-app.zip

Deploy the SAM template with Cloudformation.

$ aws cloudformation deploy \
		--template-file template.yaml \
		--stack-name python-serverless-stack-sam
		--capabilities CAPABILITY_IAM

Test

$ make test
$ make lint