Introduction

In the previous post, we completed a few basic things like - creating a free tier GCP account, a new project, service role, launched an instance etc.

Today, let’s look at creating a cloud function. These are similar to what AWS refers as Lambda functions.

Exercise

We will keep this fairly simple. It will involve

  • Enable required googleapis to work with - like cloudfunctions, iam etc.
  • Set up additional permissions for service-account
  • Create a sample function
  • Create the terraform config necessary to deploy the function
  • Make the function endpoint public, to allow unauthenticated users to invoke it.
  • Cleanup - delete all resources.

Steps

Let’s go through the steps to complete the aforementioned tasks.

1. Enable necessary APIs

As last time, the first step of working with any service in GCP is to enable it’s APIs.

1$ gcloud services enable cloudfunctions.googleapis.com
2$ gcloud services enable cloudbuild.googleapis.com

In case, you are not sure of the exact name of the api, use this command to fetch the entire list

1$ gcloud services list --available

2. Attach permissions to the service account

Allow access on cloudfunctions and iam by attaching roles to the service account

1$ gcloud projects add-iam-policy-binding tools-202011 --member serviceAccount:tools-service-account@tools-202011.iam.gserviceaccount.com --role roles/iam.serviceAccountUser
2
3$ gcloud projects add-iam-policy-binding tools-202011 --member serviceAccount:tools-service-account@tools-202011.iam.gserviceaccount.com --role roles/cloudfunctions.admin

3. Sample function

We will deploy a python3.7 function, which will return either “Hello World!” or “Hello (arg)!” depending on the request.

Source code is here

3. Terraform Config

Creating the terraform config is pretty similar to how you’d do it for AWS Lambda. We need a function resource, a bucket object resource which contains the source code and a zip resource which generates the zip at runtime.

For GCP, an additional config item is creating a new user and allowing it to invoke the function. This is necessary to allow unautheticated requests to invoke the function.

The terraform template is here

8. Run terraform

With all the prerequisites completed, we can now setup terraform to work with GCP.

As last time, we need to provide credentials to terraform. Export the environment variable GOOGLE_APPLICATION_CREDENTIALS=tools-service-account.json.

Now we can run the terraform commands to deploy our function.

1$ terraform init
2
3$ terraform apply

Type Yes when prompted. The function is deployed and the url to access it is displayed as output.

Next, validate the function.

9. Validate

We can validate what resources have been creating either from the console or gcloud cli. Use these command to verify the resources are created as expected -

Cloud Function created

1$ gcloud functions list
2NAME   STATUS  TRIGGER       REGION
3greet  ACTIVE  HTTP Trigger  us-central1

Storage bucket contains zip and terraform state file

1gsutil ls -r gs://tools-202011/*
2gs://tools-202011/fsource/:
3gs://tools-202011/fsource/greet_2011192345.zip
4
5gs://tools-202011/terraform/:
6
7gs://tools-202011/terraform/day1-state/:
8gs://tools-202011/terraform/day1-state/default.tfstate

Finally, let’s access the function endpoint to validate functionality.

Using Curl (curl cheatsheet)

1$ curl https://us-central1-tools-202011.cloudfunctions.net/greet?name=sam
2Hello Sam!
3
4$ curl https://us-central1-tools-202011.cloudfunctions.net/greet
5Hello World!
6
7$ curl https://us-central1-tools-202011.cloudfunctions.net/greet?demo=1
8Hello World!

Using Browser cloud-functions

10. Cleanup

Remove all the resources created so far.

1$ terraform destroy --auto-approve

Conclusion

Serverless architectures are incredibly efficient and relatively maintenance free. Due to some of their inherent benefits, they have become extremely common, popular and even preffered for a lot of solutions.

Thus, a good understanding of services like “Cloud Functions” is crucial. Hope this post proves useful, and sets you on the path to exploring more. 👍

Note:  Code mentioned above is here 

References (4)

  1. Functions 
  2. Http 
  3. 5889 
  4. 1938