Skip to content

Commit 38ea919

Browse files
committed
add a serverless VPC example
1 parent 7f61bd4 commit 38ea919

File tree

6 files changed

+105
-1
lines changed

6 files changed

+105
-1
lines changed

common/functions.sh

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# Check if gcloud is installed and on the path
2+
command -v gcloud >/dev/null 2>&1 || \
3+
{ echo >&2 "I require gcloud but it's not installed. Aborting.";exit 1; }
4+
5+
16
# Check if all required variables are non-null
27
# Globals:
38
# None
@@ -34,4 +39,15 @@ dependency_installed () {
3439
# None
3540
enable_project_api() {
3641
gcloud services enable "${2}" --project "${1}"
37-
}
42+
}
43+
44+
45+
# set PROJECT_ID
46+
PROJECT_ID=$(gcloud config list project --format 'value(core.project)')
47+
if [ -z "${PROJECT_ID}" ]
48+
then echo >&2 "I require default project is set but it's not. Aborting."; exit 1;
49+
fi
50+
51+
# set PROJECT_NUMBER
52+
PROJECT_NUMER=$(gcloud projects describe ${PROJECT_ID} \
53+
--format="value(projectNumber)")

serverless-vpc/cleanup.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env bash
2+
set -o errexit
3+
set -o nounset
4+
set -o pipefail
5+
6+
PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
7+
source "$PROJECT_ROOT"/env
8+
source "$PROJECT_ROOT/../"/common/functions.sh
9+
10+
gcloud functions delete random-cache
11+
gcloud beta compute networks vpc-access connectors delete cache-connector --region us-central1
12+
gcloud compute instances delete redis-cache --zone ${ZONE}
13+
gcloud compute firewall-rules delete allow-redis

serverless-vpc/create.sh

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env bash
2+
set -o errexit
3+
set -o nounset
4+
set -o pipefail
5+
set -x
6+
7+
# Reference
8+
# https://cloud.google.com/functions/docs/connecting-vpc
9+
# https://medium.com/google-cloud/connecting-cloud-functions-with-compute-engine-using-serverless-vpc-access-79c5cd7420c7
10+
11+
PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
12+
source "$PROJECT_ROOT"/env
13+
source "$PROJECT_ROOT/../"/common/functions.sh
14+
15+
16+
enable_project_api ${PROJECT_ID} vpcaccess.googleapis.com
17+
18+
gcloud compute firewall-rules create allow-redis --network ${NETWORK} --allow tcp:6379
19+
gcloud compute instances create-with-container redis-cache \
20+
--machine-type=f1-micro \
21+
--container-image=marketplace.gcr.io/google/redis4 \
22+
--tags=allow-redis \
23+
--zone=${ZONE} \
24+
--network-interface=network=${NETWORK},subnet=${SUBNET},\
25+
no-address,private-network-ip=10.0.50.9
26+
27+
gcloud beta compute networks vpc-access connectors create \
28+
cache-connector \
29+
--network ${NETWORK} \
30+
--region us-central1 \
31+
--range 172.16.16.240/28
32+
33+
34+
35+
gcloud projects add-iam-policy-binding $PROJECT_ID \
36+
--member=serviceAccount:service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
37+
--role=roles/viewer
38+
39+
gcloud projects add-iam-policy-binding $PROJECT_ID \
40+
--member=serviceAccount:service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
41+
--role=roles/compute.networkUser
42+
43+
VPC_CONNECTOR=projects/${PROJECT_ID}/locations/us-central1/connectors/cache-connector
44+
45+
gcloud beta functions deploy random-cache --entry-point main \
46+
--runtime python37 \
47+
--trigger-http \
48+
--region us-central1 \
49+
--vpc-connector $VPC_CONNECTOR \
50+
--set-env-vars REDIS_HOST=10.0.50.9

serverless-vpc/env

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
REGION=us-west1
2+
ZONE=us-west1-b
3+
NETWORK=custom-vpc-1
4+
SUBNET=subnet-oregon

serverless-vpc/main.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import os
2+
import datetime
3+
import random
4+
5+
import redis
6+
7+
r = redis.StrictRedis(host=os.environ['REDIS_HOST'], decode_responses=True)
8+
9+
10+
def main(request=None):
11+
cache_key = datetime.datetime.now().minute
12+
val = r.get(cache_key)
13+
if not val:
14+
val = random.random()
15+
out = f'set value: {val}'
16+
r.set(cache_key, val)
17+
else:
18+
out = f'value from cache: {val}'
19+
#r.delete(cache_key)
20+
return out

serverless-vpc/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
redis==3.3.6

0 commit comments

Comments
 (0)