Skip to content

Commit

Permalink
add a serverless VPC example
Browse files Browse the repository at this point in the history
  • Loading branch information
pydevops committed Aug 7, 2019
1 parent 7f61bd4 commit 38ea919
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 1 deletion.
18 changes: 17 additions & 1 deletion common/functions.sh
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# Check if gcloud is installed and on the path
command -v gcloud >/dev/null 2>&1 || \
{ echo >&2 "I require gcloud but it's not installed. Aborting.";exit 1; }


# Check if all required variables are non-null
# Globals:
# None
Expand Down Expand Up @@ -34,4 +39,15 @@ dependency_installed () {
# None
enable_project_api() {
gcloud services enable "${2}" --project "${1}"
}
}


# set PROJECT_ID
PROJECT_ID=$(gcloud config list project --format 'value(core.project)')
if [ -z "${PROJECT_ID}" ]
then echo >&2 "I require default project is set but it's not. Aborting."; exit 1;
fi

# set PROJECT_NUMBER
PROJECT_NUMER=$(gcloud projects describe ${PROJECT_ID} \
--format="value(projectNumber)")
13 changes: 13 additions & 0 deletions serverless-vpc/cleanup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail

PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$PROJECT_ROOT"/env
source "$PROJECT_ROOT/../"/common/functions.sh

gcloud functions delete random-cache
gcloud beta compute networks vpc-access connectors delete cache-connector --region us-central1
gcloud compute instances delete redis-cache --zone ${ZONE}
gcloud compute firewall-rules delete allow-redis
50 changes: 50 additions & 0 deletions serverless-vpc/create.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
set -x

# Reference
# https://cloud.google.com/functions/docs/connecting-vpc
# https://medium.com/google-cloud/connecting-cloud-functions-with-compute-engine-using-serverless-vpc-access-79c5cd7420c7

PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$PROJECT_ROOT"/env
source "$PROJECT_ROOT/../"/common/functions.sh


enable_project_api ${PROJECT_ID} vpcaccess.googleapis.com

gcloud compute firewall-rules create allow-redis --network ${NETWORK} --allow tcp:6379
gcloud compute instances create-with-container redis-cache \
--machine-type=f1-micro \
--container-image=marketplace.gcr.io/google/redis4 \
--tags=allow-redis \
--zone=${ZONE} \
--network-interface=network=${NETWORK},subnet=${SUBNET},\
no-address,private-network-ip=10.0.50.9

gcloud beta compute networks vpc-access connectors create \
cache-connector \
--network ${NETWORK} \
--region us-central1 \
--range 172.16.16.240/28



gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
--role=roles/viewer

gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
--role=roles/compute.networkUser

VPC_CONNECTOR=projects/${PROJECT_ID}/locations/us-central1/connectors/cache-connector

gcloud beta functions deploy random-cache --entry-point main \
--runtime python37 \
--trigger-http \
--region us-central1 \
--vpc-connector $VPC_CONNECTOR \
--set-env-vars REDIS_HOST=10.0.50.9
4 changes: 4 additions & 0 deletions serverless-vpc/env
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
REGION=us-west1
ZONE=us-west1-b
NETWORK=custom-vpc-1
SUBNET=subnet-oregon
20 changes: 20 additions & 0 deletions serverless-vpc/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import os
import datetime
import random

import redis

r = redis.StrictRedis(host=os.environ['REDIS_HOST'], decode_responses=True)


def main(request=None):
cache_key = datetime.datetime.now().minute
val = r.get(cache_key)
if not val:
val = random.random()
out = f'set value: {val}'
r.set(cache_key, val)
else:
out = f'value from cache: {val}'
#r.delete(cache_key)
return out
1 change: 1 addition & 0 deletions serverless-vpc/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
redis==3.3.6

0 comments on commit 38ea919

Please sign in to comment.