{"id":13258,"date":"2021-04-25T09:10:37","date_gmt":"2021-04-25T16:10:37","guid":{"rendered":"https:\/\/www.seedcode.com\/?p=13258"},"modified":"2021-04-25T09:10:37","modified_gmt":"2021-04-25T16:10:37","slug":"google-cloud-functions","status":"publish","type":"post","link":"https:\/\/seedcode.com\/google-cloud-functions\/","title":{"rendered":"Why We Use Cloud Functions"},"content":{"rendered":"<p>Over the past year, we\u2019ve been building some web apps in React that talk to our customers&#8217; FileMaker servers and to Google&#8217;s Cloud Firestore database. As part of that, we&#8217;ve begun working with Google\u2019s flavor of FaaS (Function as a Service), <a href=\"https:\/\/firebase.google.com\/products\/functions\" target=\"_blank\" rel=\"noreferrer noopener\">Firebase Cloud Functions<\/a>. Cloud Functions, along with AWS Lamba and Microsoft\u2019s Azure Functions, are part of a growing trend towards serverless architecture. The commonly cited advantages to utilizing Cloud Functions over server-based functions are typically:<\/p>\n<ul>\n<li>Zero maintenance: No servers to spin up, no infrastructure to deploy<\/li>\n<li>Scalable: Google will handle scaling up automatically<\/li>\n<li>Pay as you go: You will be billed only when the function runs, rather than having to maintain a server at all times<\/li>\n<\/ul>\n<p>In addition, you\u2019ll often hear that Cloud Functions have the advantage of being \u201cevent-driven,\u201d meaning they can subscribe to events across a suite of cloud services and trigger based on those changes. This is true, but it\u2019s not unique to Cloud Functions. One web app we&#8217;re building here,\u00a0<a href=\"http:\/\/www.datapage.com\" target=\"_blank\" rel=\"noreferrer noopener\">Datapage<\/a>, relies on server-based, event-triggered functions to send updates to a FileMaker server based on changes in Firestore, and those functions are working just fine.<\/p>\n<p>If these were the only advantages of Cloud Functions, there isn\u2019t much of a case for us to use them. We already operate and maintain a server for Datapage, and we aren\u2019t receiving so many peak requests (yet) that we\u2019d be in danger of overwhelming that server. So why have we begun a foray into FaaS? There are subtle, less discussed advantages to Cloud Functions that were central to our decision to give them a try.<\/p>\n<p><a href=\"https:\/\/firebase.google.com\/products\/functions\" target=\"_blank\" rel=\"noopener\"><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter wp-image-13265\" src=\"https:\/\/www.seedcode.com\/wp-content\/uploads\/2021\/04\/gcf-300x147.png\" alt=\"Firebase Cloud Functions\" width=\"600\" height=\"293\" srcset=\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf-300x147.png 300w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf-1024x501.png 1024w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf-768x376.png 768w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf-1536x751.png 1536w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf-2048x1001.png 2048w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<h3>Less Configuration<\/h3>\n<p>Our first candidate problem for Cloud Functions was making regular backups of our production <a href=\"https:\/\/firebase.google.com\/docs\/firestore\" target=\"_blank\" rel=\"noopener\">Cloud Firestore<\/a> database. Google provides functions to export all of the database&#8217;s collections to a Cloud Storage bucket, insuring us against overwriting production data. We could handle this with the Google Cloud SDK and a cron job on our server, but that would require configuring credentials, environment variables, and maintaining the job.<!--more--><\/p>\n<p>At SeedCode, we aim to have new servers up and running within 10 minutes should our currently running production server encounter an unresolvable issue. If we were maintaining a cron job using the Google Cloud SDK, we\u2019d have to install, initialize, configure, and authorize the SDK every time we spin up a new production server. This would significantly increase the complexity of our server initialization process, which we aim to keep as simple as possible. The last time you want to be debugging your init script is during a server outage.<\/p>\n<p>Instead, we used a Cloud Function for this job. We have only one configuration step: our default GCP (Google Cloud Projects) user needs the right role to access our backup bucket. After that, we can deploy a function that utilizes Cloud Scheduler to run once every 24 hours, exporting our collections to Cloud Storage. If you weren\u2019t counting, that\u2019s four separate cloud services: Firestore, Storage, Functions, and Scheduler, all working together in harmony with a single configuration step which we will only have to make once.<\/p>\n<h3>Fewer Links in the Chain<\/h3>\n<p>We had another excellent candidate for Cloud Functions arise shortly after we began utilizing them for automated backups. As part of the in-app notifications we built for Datapage, we gave users the ability to mark subsets of their unread notifications as read. This is a potentially expensive operation: it requires first querying for unread notifications within the specified timeframe, then updating all of them with a new status. We could do this client-side with Firestore, but what if a user has hundreds or even thousands of unread notifications?<\/p>\n<figure id=\"attachment_13280\" aria-describedby=\"caption-attachment-13280\" style=\"width: 1547px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.seedcode.com\/wp-content\/uploads\/2021\/04\/NotificationsScreenshot.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"wp-image-13280 size-full\" src=\"https:\/\/www.seedcode.com\/wp-content\/uploads\/2021\/04\/NotificationsScreenshot.png\" alt=\"FileMaker and Cloud Functions\" width=\"1547\" height=\"1155\" srcset=\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/NotificationsScreenshot.png 1547w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/NotificationsScreenshot-300x224.png 300w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/NotificationsScreenshot-1024x765.png 1024w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/NotificationsScreenshot-768x573.png 768w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/NotificationsScreenshot-1536x1147.png 1536w\" sizes=\"(max-width: 1547px) 100vw, 1547px\" \/><\/a><figcaption id=\"caption-attachment-13280\" class=\"wp-caption-text\">Unread notifications in Datapage.<\/figcaption><\/figure>\n<p>Instead of handling this client-side, we can do it in a Cloud Function. The user\u2019s device won\u2019t have to send out dozens of batched updates. The client will only send a single request to the callable Cloud Function, and the function will handle the rest, reading and writing within Google\u2019s platform, with its superior networking. Since we are designing this app with plans to take it mobile in the future, we\u2019re doing ourselves a favor by limiting expensive operations client-side.<\/p>\n<p>Additionally, by not executing this function on our server, we are limiting links in the chain. Our database and function will run together on Google\u2019s infrastructure, so we won\u2019t need to pull down a large query onto our server and then send our updates back up. Instead of client -&gt; Google -&gt; server -&gt; Google, we\u2019re going client -&gt; Google. Are the performance gains real? Maybe, but that\u2019s a discussion for another article. For now, it\u2019s enough to appreciate the reduced complexity.<\/p>\n<h3>Logging Google Cloud Functions<\/h3>\n<figure id=\"attachment_13263\" aria-describedby=\"caption-attachment-13263\" style=\"width: 1117px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.seedcode.com\/wp-content\/uploads\/2021\/04\/CloudFunctionLogging.png\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"wp-image-13263 size-full\" src=\"https:\/\/www.seedcode.com\/wp-content\/uploads\/2021\/04\/CloudFunctionLogging.png\" alt=\"Google Cloud Function Monitoring\" width=\"1117\" height=\"897\" srcset=\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/CloudFunctionLogging.png 1117w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/CloudFunctionLogging-300x241.png 300w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/CloudFunctionLogging-1024x822.png 1024w, https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/CloudFunctionLogging-768x617.png 768w\" sizes=\"(max-width: 1117px) 100vw, 1117px\" \/><\/a><figcaption id=\"caption-attachment-13263\" class=\"wp-caption-text\">Is your server providing you with a visualization of memory usage for each function?<\/figcaption><\/figure>\n<p>A severely underrated feature of Cloud Functions is Google\u2019s excellent suite of logging tools. Want to know if the execution time of your function is going up? Want to use full-text search to find a specific error by timeframe? Don\u2019t want to cross-reference your version control with your error log and wish you could just see which function invocation happened on which version of your app? It\u2019s all here, and it\u2019s all accessible through a secure web UI. Third-party server logging libraries with parity with these features do exist, but Google&#8217;s requires zero setup.<\/p>\n<h3>Beyond Our Use Cases<\/h3>\n<p>There\u2019s a lot more here that we simply don\u2019t yet have a use for: leveraging Google\u2019s machine learning APIs, handling exceptionally CPU-intensive tasks, and integrating with 3rd party APIs. However, we have found that there\u2019s enough of an argument to deploy some of our functions into the cloud anyway. We have no plans to move to a completely serverless architecture. Still, some aspects of serverless make sense, even if you\u2019re already going to the trouble to maintain a server yourself.<\/p>\n<h3>Postscript: Vendor Lock-In<\/h3>\n<p>Dependence on a single company\u2019s products and infrastructure is a major commitment. But when it comes to Cloud Functions, Google has taken steps to mitigate that concern by introducing the <a href=\"https:\/\/cloud.google.com\/functions\/docs\/functions-framework\" target=\"_blank\" rel=\"noopener noreferrer\">Functions Framework<\/a>. FF allows Cloud Functions to become portable using containers and a set of open-source libraries. Moving your functions from the cloud down onto a server you manage yourself is now possible and will go a long way towards making the jump to Google&#8217;s Cloud Functions more inviting.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Over the past year, we\u2019ve been building some web apps in React that talk to our customers&#8217; FileMaker servers and to Google&#8217;s Cloud Firestore database. As part of that, we&#8217;ve begun working with Google\u2019s flavor of FaaS (Function as a Service), Firebase Cloud Functions. Cloud Functions, along with AWS Lamba and Microsoft\u2019s Azure Functions, are part of a growing trend towards serverless architecture. The commonly cited advantages to utilizing Cloud Functions over server-based functions are typically: Zero maintenance: No servers to spin up, no infrastructure to deploy Scalable: Google will handle scaling up automatically Pay as you go: You will be billed only when the function runs, rather than having to maintain a server at all times In addition, you\u2019ll often hear that Cloud Functions have the advantage of being \u201cevent-driven,\u201d meaning they can subscribe to events across a suite of cloud services and trigger based on those changes. This is true, but it\u2019s not unique to Cloud Functions. One web app we&#8217;re building here,\u00a0Datapage, relies on server-based, event-triggered functions to send updates to a FileMaker server based on changes in Firestore, and those functions are working just fine. If these were the only advantages of Cloud Functions, there isn\u2019t much of a case for us to use them. We already operate and maintain a server for Datapage, and we aren\u2019t receiving so many peak requests (yet) that we\u2019d be in danger of overwhelming that server. So why have we begun a foray into FaaS? There are subtle, less discussed advantages to Cloud Functions that were central to our decision to give them a try. Less Configuration Our first candidate problem for Cloud Functions was making regular backups of our production Cloud Firestore database. Google provides functions to export all of the database&#8217;s collections to a Cloud Storage bucket, insuring us against overwriting production data. We could handle this with the Google Cloud SDK and a cron job on our server, but that would require configuring credentials, environment variables, and maintaining the job.<\/p>\n","protected":false},"author":9,"featured_media":13268,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[23],"class_list":["post-13258","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Why We Use Cloud Functions - SeedCode<\/title>\n<meta name=\"description\" content=\"We&#039;re offloading work to Google\u2019s flavor of FaaS (Function as a Service), Firebase Cloud Functions, so our servers require less config and are more resilient.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/seedcode.com\/google-cloud-functions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Why We Use Cloud Functions - SeedCode\" \/>\n<meta property=\"og:description\" content=\"We&#039;re offloading work to Google\u2019s flavor of FaaS (Function as a Service), Firebase Cloud Functions, so our servers require less config and are more resilient.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/seedcode.com\/google-cloud-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"SeedCode\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/seedcoder\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-25T16:10:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2667\" \/>\n\t<meta property=\"og:image:height\" content=\"1304\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"eettensohn\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf.png\" \/>\n<meta name=\"twitter:creator\" content=\"@dayback\" \/>\n<meta name=\"twitter:site\" content=\"@dayback\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"eettensohn\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/\"},\"author\":{\"name\":\"eettensohn\",\"@id\":\"https:\/\/seedcode.com\/#\/schema\/person\/27d3830545a6ad815aedf9e4fd813a9c\"},\"headline\":\"Why We Use Cloud Functions\",\"datePublished\":\"2021-04-25T16:10:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/\"},\"wordCount\":1105,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/seedcode.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png\",\"keywords\":[\"javascript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/seedcode.com\/google-cloud-functions\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/\",\"url\":\"https:\/\/seedcode.com\/google-cloud-functions\/\",\"name\":\"Why We Use Cloud Functions - SeedCode\",\"isPartOf\":{\"@id\":\"https:\/\/seedcode.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png\",\"datePublished\":\"2021-04-25T16:10:37+00:00\",\"description\":\"We're offloading work to Google\u2019s flavor of FaaS (Function as a Service), Firebase Cloud Functions, so our servers require less config and are more resilient.\",\"breadcrumb\":{\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/seedcode.com\/google-cloud-functions\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage\",\"url\":\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png\",\"contentUrl\":\"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png\",\"width\":319,\"height\":325},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/seedcode.com\/google-cloud-functions\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/seedcode.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Why We Use Cloud Functions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/seedcode.com\/#website\",\"url\":\"https:\/\/seedcode.com\/\",\"name\":\"SeedCode\",\"description\":\"Build the Software You&#039;ve Always Wanted\",\"publisher\":{\"@id\":\"https:\/\/seedcode.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/seedcode.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/seedcode.com\/#organization\",\"name\":\"SeedCode\",\"url\":\"https:\/\/seedcode.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/seedcode.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/seedcode.com\/wp-content\/uploads\/2022\/12\/SeedCodeLogo.png\",\"contentUrl\":\"https:\/\/seedcode.com\/wp-content\/uploads\/2022\/12\/SeedCodeLogo.png\",\"width\":595,\"height\":189,\"caption\":\"SeedCode\"},\"image\":{\"@id\":\"https:\/\/seedcode.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/seedcoder\",\"https:\/\/x.com\/dayback\",\"https:\/\/www.linkedin.com\/company\/seedcode\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/seedcode.com\/#\/schema\/person\/27d3830545a6ad815aedf9e4fd813a9c\",\"name\":\"eettensohn\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/seedcode.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"caption\":\"eettensohn\"},\"url\":\"https:\/\/seedcode.com\/author\/eettensohn\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Why We Use Cloud Functions - SeedCode","description":"We're offloading work to Google\u2019s flavor of FaaS (Function as a Service), Firebase Cloud Functions, so our servers require less config and are more resilient.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/seedcode.com\/google-cloud-functions\/","og_locale":"en_US","og_type":"article","og_title":"Why We Use Cloud Functions - SeedCode","og_description":"We're offloading work to Google\u2019s flavor of FaaS (Function as a Service), Firebase Cloud Functions, so our servers require less config and are more resilient.","og_url":"https:\/\/seedcode.com\/google-cloud-functions\/","og_site_name":"SeedCode","article_publisher":"https:\/\/www.facebook.com\/seedcoder","article_published_time":"2021-04-25T16:10:37+00:00","og_image":[{"width":2667,"height":1304,"url":"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf.png","type":"image\/png"}],"author":"eettensohn","twitter_card":"summary_large_image","twitter_image":"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcf.png","twitter_creator":"@dayback","twitter_site":"@dayback","twitter_misc":{"Written by":"eettensohn","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/seedcode.com\/google-cloud-functions\/#article","isPartOf":{"@id":"https:\/\/seedcode.com\/google-cloud-functions\/"},"author":{"name":"eettensohn","@id":"https:\/\/seedcode.com\/#\/schema\/person\/27d3830545a6ad815aedf9e4fd813a9c"},"headline":"Why We Use Cloud Functions","datePublished":"2021-04-25T16:10:37+00:00","mainEntityOfPage":{"@id":"https:\/\/seedcode.com\/google-cloud-functions\/"},"wordCount":1105,"commentCount":1,"publisher":{"@id":"https:\/\/seedcode.com\/#organization"},"image":{"@id":"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png","keywords":["javascript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/seedcode.com\/google-cloud-functions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/seedcode.com\/google-cloud-functions\/","url":"https:\/\/seedcode.com\/google-cloud-functions\/","name":"Why We Use Cloud Functions - SeedCode","isPartOf":{"@id":"https:\/\/seedcode.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage"},"image":{"@id":"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png","datePublished":"2021-04-25T16:10:37+00:00","description":"We're offloading work to Google\u2019s flavor of FaaS (Function as a Service), Firebase Cloud Functions, so our servers require less config and are more resilient.","breadcrumb":{"@id":"https:\/\/seedcode.com\/google-cloud-functions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/seedcode.com\/google-cloud-functions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/seedcode.com\/google-cloud-functions\/#primaryimage","url":"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png","contentUrl":"https:\/\/seedcode.com\/wp-content\/uploads\/2021\/04\/gcffeat.png","width":319,"height":325},{"@type":"BreadcrumbList","@id":"https:\/\/seedcode.com\/google-cloud-functions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/seedcode.com\/"},{"@type":"ListItem","position":2,"name":"Why We Use Cloud Functions"}]},{"@type":"WebSite","@id":"https:\/\/seedcode.com\/#website","url":"https:\/\/seedcode.com\/","name":"SeedCode","description":"Build the Software You&#039;ve Always Wanted","publisher":{"@id":"https:\/\/seedcode.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/seedcode.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/seedcode.com\/#organization","name":"SeedCode","url":"https:\/\/seedcode.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/seedcode.com\/#\/schema\/logo\/image\/","url":"https:\/\/seedcode.com\/wp-content\/uploads\/2022\/12\/SeedCodeLogo.png","contentUrl":"https:\/\/seedcode.com\/wp-content\/uploads\/2022\/12\/SeedCodeLogo.png","width":595,"height":189,"caption":"SeedCode"},"image":{"@id":"https:\/\/seedcode.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/seedcoder","https:\/\/x.com\/dayback","https:\/\/www.linkedin.com\/company\/seedcode\/"]},{"@type":"Person","@id":"https:\/\/seedcode.com\/#\/schema\/person\/27d3830545a6ad815aedf9e4fd813a9c","name":"eettensohn","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/seedcode.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","caption":"eettensohn"},"url":"https:\/\/seedcode.com\/author\/eettensohn\/"}]}},"_links":{"self":[{"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/posts\/13258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/comments?post=13258"}],"version-history":[{"count":0,"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/posts\/13258\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/media\/13268"}],"wp:attachment":[{"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/media?parent=13258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/categories?post=13258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/seedcode.com\/wp-json\/wp\/v2\/tags?post=13258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}