Code Monkey home page Code Monkey logo

cloud-run-python's Introduction

Cloud Run Template Microservice

A template repository for a Cloud Run microservice, written in Python

Run on Google Cloud

Prerequisite

  • Enable the Cloud Run API via the console or CLI:
gcloud services enable run.googleapis.com

Features

  • Flask: Web server framework
  • Buildpack support Tooling to build production-ready container images from source code and without a Dockerfile
  • Dockerfile: Container build instructions, if needed to replace buildpack for custom build
  • SIGTERM handler: Catch termination signal for cleanup before Cloud Run stops the container
  • Service metadata: Access service metadata, project ID and region, at runtime
  • Local development utilities: Auto-restart with changes and prettify logs
  • Structured logging w/ Log Correlation JSON formatted logger, parsable by Cloud Logging, with automatic correlation of container logs to a request log.
  • Unit and System tests: Basic unit and system tests setup for the microservice
  • Task definition and execution: Uses invoke to execute defined tasks in tasks.py.

Local Development

Cloud Code

This template works with Cloud Code, an IDE extension to let you rapidly iterate, debug, and run code on Kubernetes and Cloud Run.

Learn how to use Cloud Code for:

CLI tooling

To run the invoke commands below, install invoke system wide:

pip install invoke

Invoke will handle establishing local virtual environments, etc. Task definitions can be found in tasks.py.

Local development

  1. Set Project Id:
    export GOOGLE_CLOUD_PROJECT=<GCP_PROJECT_ID>
  2. Start the server with hot reload:
    invoke dev

Deploying a Cloud Run service

  1. Set Project Id:

    export GOOGLE_CLOUD_PROJECT=<GCP_PROJECT_ID>
  2. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  3. Create an Artifact Registry repo:

    export REPOSITORY="samples"
    export REGION=us-central1
    gcloud artifacts repositories create $REPOSITORY --location $REGION --repository-format "docker"
    export REPOSITORY_URL=`$REGION-docker.pkg.dev`
  4. Use the gcloud credential helper to authorize Docker to push to your Artifact Registry:

    gcloud auth configure-docker
  5. Build the container using a buildpack:

    invoke build
  6. Deploy to Cloud Run:

    invoke deploy

Run sample tests

  1. Pass credentials via GOOGLE_APPLICATION_CREDENTIALS env var:

    export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
  2. Set Project Id:

    export GOOGLE_CLOUD_PROJECT=<GCP_PROJECT_ID>
  3. Run unit tests

    invoke test
  4. Run system tests

    gcloud builds submit \
        --config test/advance.cloudbuild.yaml \
        --substitutions 'COMMIT_SHA=manual,REPO_NAME=manual'

    The Cloud Build configuration file will build and deploy the containerized service to Cloud Run, run tests managed by pytest, then clean up testing resources. This configuration restricts public access to the test service. Therefore, service accounts need to have the permission to issue ID tokens for request authorization:

    • Enable Cloud Run, Cloud Build, Artifact Registry, and IAM APIs:

      gcloud services enable run.googleapis.com cloudbuild.googleapis.com iamcredentials.googleapis.com artifactregistry.googleapis.com
    • Set environment variables.

      export PROJECT_ID="$(gcloud config get-value project)"
      export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')"
    • Create an Artifact Registry repo (or use another already created repo):

      export REPOSITORY="samples"
      export REGION=us-central1
      gcloud artifacts repositories create $REPOSITORY --location $REGION --repository-format "docker"
    • Create service account token-creator with Service Account Token Creator and Cloud Run Invoker roles.

      gcloud iam service-accounts create token-creator
      
      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:token-creator@$PROJECT_ID.iam.gserviceaccount.com" \
          --role="roles/iam.serviceAccountTokenCreator"
      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:token-creator@$PROJECT_ID.iam.gserviceaccount.com" \
          --role="roles/run.invoker"
    • Add Service Account Token Creator role to the Cloud Build service account.

      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com" \
          --role="roles/iam.serviceAccountTokenCreator"
    • Cloud Build also requires permission to deploy Cloud Run services and administer artifacts:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com" \
          --role="roles/run.admin"
      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com" \
          --role="roles/iam.serviceAccountUser"
      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com" \
          --role="roles/artifactregistry.repoAdmin"

Maintenance & Support

This repo performs basic periodic testing for maintenance. Please use the issue tracker for bug reports, features requests and submitting pull requests.

Contributions

Please see the contributing guidelines

License

This library is licensed under Apache 2.0. Full license text is available in LICENSE.

cloud-run-python's People

Contributors

mks0ff avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.