Skip to main content

Google Cloud functions wrapper

Project description

GOBLET

PyPI PyPI - Python Version Tests codecov

Goblet is a framework for writing serverless rest apis in python in google cloud. It allows you to quickly create and deploy python apis backed by Cloud Functions and Cloud Run

It provides:

  • A command line tool for creating, deploying, and managing your api
  • A decorator based API for integrating with GCP API Gateway, Storage, Cloudfunctions, PubSub, Scheduler, Cloudrun Jobs, BQ remote functions, Redis, Monitoring alerts and other GCP services.
  • Local environment for testing and running your api endpoints
  • Dynamically generated openapispec
  • Support for multiple stages

You can create Rest APIs:

from goblet import Goblet, jsonify, goblet_entrypoint

app = Goblet(function_name="goblet_example")
goblet_entrypoint(app)

@app.route('/home')
def home():
    return {"hello": "world"}

@app.route('/home/{id}', methods=["POST"])
def post_example(id: int) -> List[int]:
    return jsonify([id])

You can also create other GCP resources that are related to your REST api:

from goblet import Goblet, jsonify, goblet_entrypoint

app = Goblet(function_name="goblet_example")
goblet_entrypoint(app)

# Scheduled job
@app.schedule("5 * * * *")
def scheduled_job():
    return jsonify("success")

# Pubsub subscription
@app.pubsub_subscription("test")
def pubsub_subscription(data):
    app.log.info(data)
    return

# Example Redis Instance
app.redis("redis-test")

# Example Metric Alert for the cloudfunction metric execution_count with a threshold of 10
app.alert("metric",conditions=[MetricCondition("test", metric="cloudfunctions.googleapis.com/function/execution_count", value=10)])

Once you've written your code, you just run goblet deploy and Goblet takes care of deploying your app.

$ goblet deploy -l us-central1
...
https://api.uc.gateway.dev

$ curl https://api.uc.gateway.dev/home
{"hello": "world"}

Note: Due to breaking changes in Cloudfunctions you will need to wrap your goblet class in a function. See issue #88. In the latest goblet version (0.5.0) there is a helper function goblet_entrypoint that can be used as well.

goblet_entrypoint(app)

Resources Supported

Infrastructure

  • vpc connector
  • redis
  • alerts
  • api gateway
  • cloudtaskqueue
  • pubsub topics

Backends

  • cloudfunction
  • cloudfunction V2
  • cloudrun

Routing

  • api gateway
  • http

Handlers

  • pubsub
  • scheduler
  • storage
  • eventarc
  • cloudrun jobs
  • bq remote functions
  • cloudtasktarget

Data Typing Frameworks Supported

  • pydantic
  • marshmallow

Installation

To install goblet, open an interactive shell and run:

pip install goblet-gcp

Make sure to have the correct services enabled in your gcp project depending on what you want to deploy

api-gateway, cloudfunctions, storage, pubsub, scheduler

You will also need to install gcloud cli for authentication

QuickStart

In this tutorial, you'll use the goblet command line utility to create and deploy a basic REST API. This quickstart uses Python 3.7. You can find the latest versions of python on the Python download page.

To install Goblet, we'll first create and activate a virtual environment in python3.7:

$ python3 --version
Python 3.7.3
$ python3 -m venv venv37
$ . venv37/bin/activate

Next we'll install Goblet using pip:

python3 -m pip install goblet-gcp

You can verify you have goblet installed by running:

$ goblet --help
Usage: goblet [OPTIONS] COMMAND [ARGS]...
...

Credentials

Before you can deploy an application, be sure you have credentials configured. You should run gcloud auth application-default login and sign in to the desired project.

Creating Your Project

create your project directory, which should include an main.py and a requirements.txt. Make sure requirements.txt includes goblet-gcp

$ ls -la
drwxr-xr-x   .goblet
-rw-r--r--   main.py
-rw-r--r--   requirements.txt

You can ignore the .goblet directory for now, the two main files we'll focus on is app.py and requirements.txt.

Let's take a look at the main.py file:

from goblet import Goblet, goblet_entrypoint

app = Goblet(function_name="goblet_example")
goblet_entrypoint(app)

@app.route('/home')
def home():
    return {"hello": "world"}

This app will deploy an api with endpoint /home.

Running Locally

Running your functions locally for testing and debugging is easy to do with goblet.

from goblet import Goblet

app = Goblet(function_name="goblet_example")
goblet_entrypoint(app)

@app.route('/home')
def home():
    return {"hello": "world"}

Then run goblet local Now you can hit your functions endpoint at localhost:8080 with your routes. For example localhost:8080/home

Deploying

Let's deploy this app. Make sure you're in the app directory and run goblet deploy making sure to specify the desired location:

$ goblet deploy -l us-central1
INFO:goblet.deployer:zipping function......
INFO:goblet.deployer:uploading function zip to gs......
INFO:goblet.deployer:function code uploaded
INFO:goblet.deployer:creating cloudfunction......
INFO:goblet.deployer:deploying api......
INFO:goblet.deployer:api successfully deployed...
INFO:goblet.deployer:api endpoint is goblet-example-yol8sbt.uc.gateway.dev

You now have an API up and running using API Gateway and cloudfunctions:

$ curl https://goblet-example-yol8sbt.uc.gateway.dev/home
{"hello": "world"}

Try making a change to the returned dictionary from the home() function. You can then redeploy your changes by running golet deploy.

Next Steps

You've now created your first app using goblet. You can make modifications to your main.py file and rerun goblet deploy to redeploy your changes.

At this point, there are several next steps you can take.

Docs - Goblet Documentation

If you're done experimenting with Goblet and you'd like to cleanup, you can use the goblet destroy command making sure to specify the desired location, and Goblet will delete all the resources it created when running the goblet deploy command.

$ goblet destroy -l us-central1
INFO:goblet.deployer:destroying api gateway......
INFO:goblet.deployer:api configs destroying....
INFO:goblet.deployer:apis successfully destroyed......
INFO:goblet.deployer:deleting google cloudfunction......
INFO:goblet.deployer:deleting storage bucket......

Docs

Goblet Documentation

Blog Posts

Building Python Serverless Applications on GCP

Serverless APIs made simple on GCP with Goblet backed by Cloud Functions and Cloud Run

Tutorial: Publishing GitHub Findings to Security Command Center

Tutorial: Cost Spike Alerting

Tutorial: Setting Up Approval Processes with Slack Apps

Tutorial: API Deployments with Traffic Revisions and Centralized Artifact Registries in Google Cloud Run

Tutorial: Deploying Cloud Run Jobs

Tutorial: Connecting Cloudrun and Cloudfunctions to Redis and other Private Services using Goblet

Tutorial: Deploying BigQuery Remote Functions

GCP Alerts the Easy Way: Alerting for Cloudfunctions and Cloudrun using Goblet

Tutorial: Deploy CloudTaskQueues, enqueue CloudTasks and handle CloudTasks

Tutorial: Low Usage Alerting On Slack for Google Cloud Platform

Examples

Goblet Examples

Issues

Please file any issues, bugs or feature requests as an issue on our GitHub page.

Github Action

Goblet Github Action

Roadmap

☑ Integration Tests
Api Gateway Auth
☑ Configuration Options (function names, ...)
☑ Use checksum for updates
☑ Cloudrun Backend
Scheduler trigger
Pub Sub trigger
Cloud Storage trigger
Cloudrun Jobs trigger
Firestore trigger
Firebase trigger
CloudTask and CloudTask Queues
Cloud Endpoints trigger
EventArc trigger
Redis infrastructure
BQ Remote Functions
☑ Deploy API Gateway from existing openapi spec
☑ Deploy arbitrary Dockerfile to Cloudrun
☑ Create Deployment Service Accounts
☑ Automatically add IAM invoker bindings on the backend based on deployed handlers

Want to Contribute

If you would like to contribute to the library (e.g. by improving the documentation, solving a bug or adding a cool new feature) submit a pull request.

Want to Support

Buy Me A Coffee


Based on chalice

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

goblet-gcp-0.11.2.tar.gz (64.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

goblet_gcp-0.11.2-py3.10.egg (179.3 kB view details)

Uploaded Egg

goblet_gcp-0.11.2-py3-none-any.whl (80.1 kB view details)

Uploaded Python 3

File details

Details for the file goblet-gcp-0.11.2.tar.gz.

File metadata

  • Download URL: goblet-gcp-0.11.2.tar.gz
  • Upload date:
  • Size: 64.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for goblet-gcp-0.11.2.tar.gz
Algorithm Hash digest
SHA256 38513f8b275f0dcc6a848766e613e6bd852e86a0242e40c6399be89979ecbac6
MD5 2fe5463b9082ebd8982ee76655913670
BLAKE2b-256 42cf89997e326407b74ed6a5839c06a005ea345570420e607b9c11ef4ab7b95f

See more details on using hashes here.

File details

Details for the file goblet_gcp-0.11.2-py3.10.egg.

File metadata

  • Download URL: goblet_gcp-0.11.2-py3.10.egg
  • Upload date:
  • Size: 179.3 kB
  • Tags: Egg
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for goblet_gcp-0.11.2-py3.10.egg
Algorithm Hash digest
SHA256 fc9dce996291cd2cb2d76ffbd4ae77c864c0fee28e5cbea3e06944dcd873b388
MD5 c46d139fcbb79d5f7682d3cc3a6c8378
BLAKE2b-256 210a3eae7a9436b176e8d2b2f8369b1fb9a058f94801bf632566aadce7e0fb10

See more details on using hashes here.

File details

Details for the file goblet_gcp-0.11.2-py3-none-any.whl.

File metadata

  • Download URL: goblet_gcp-0.11.2-py3-none-any.whl
  • Upload date:
  • Size: 80.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for goblet_gcp-0.11.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f742d3383c85a17e82907d0f6adfa1ced6146445160a76210eaed9e00062b451
MD5 1f189878bb7657527ec18a669558a720
BLAKE2b-256 4cbee6fb7b26baadb6042d86e27bd2957fcb726ecc7511b39915c72c6b07ea84

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page