CINXE.COM
Use Pub/Sub with Cloud Run tutorial | Cloud Run Documentation | Google Cloud
<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/webhistory"> <meta property="og:site_name" content="Google Cloud"> <meta property="og:type" content="website"><meta name="theme-color" content="#039be5"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/cloud/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500,700|Google+Sans+Text:400,400italic,500,500italic,700,700italic|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/css/app.css"> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/favicons/onecloud/favicon.ico"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/favicons/onecloud/super_cloud.png"><link rel="canonical" href="https://cloud.google.com/run/docs/tutorials/pubsub"><link rel="search" type="application/opensearchdescription+xml" title="Google Cloud" href="https://cloud.google.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://cloud.google.com/run/docs/tutorials/pubsub" /><link rel="alternate" hreflang="x-default" href="https://cloud.google.com/run/docs/tutorials/pubsub" /><link rel="alternate" hreflang="zh-Hans" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=zh-cn" /><link rel="alternate" hreflang="fr" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=fr" /><link rel="alternate" hreflang="de" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=de" /><link rel="alternate" hreflang="id" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=id" /><link rel="alternate" hreflang="it" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=it" /><link rel="alternate" hreflang="ja" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=ja" /><link rel="alternate" hreflang="ko" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=ko" /><link rel="alternate" hreflang="pt-BR" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=pt-br" /><link rel="alternate" hreflang="es-419" href="https://cloud.google.com/run/docs/tutorials/pubsub?hl=es-419" /><title>Use Pub/Sub with Cloud Run tutorial | Cloud Run Documentation | Google Cloud</title> <meta property="og:title" content="Use Pub/Sub with Cloud Run tutorial | Cloud Run Documentation | Google Cloud"><meta property="og:url" content="https://cloud.google.com/run/docs/tutorials/pubsub"><meta property="og:image" content="https://cloud.google.com/_static/cloud/images/social-icon-google-cloud-1200-630.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="630"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Use Pub/Sub with Cloud Run tutorial" } </script><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Cloud Run", "item": "https://cloud.google.com/run" },{ "@type": "ListItem", "position": 2, "name": "Documentation", "item": "https://cloud.google.com/run/docs" },{ "@type": "ListItem", "position": 3, "name": "Use Pub/Sub with Cloud Run tutorial", "item": "https://cloud.google.com/run/docs/tutorials/pubsub" }] } </script> <meta name="gtm_var" data-key="docType" data-value="tutorial"> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="cloud-theme" type="article" layout="docs" free-trial display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <a href="#main-content" class="skip-link button"> Skip to main content </a> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><cloudx-track userCountry="SG"></cloudx-track> <cloudx-utils-init></cloudx-utils-init> <devsite-header keep-tabs-visible> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="googleCloud" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <img src="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/cloud-logo.svg" class="devsite-site-logo" alt="Google Cloud"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item devsite-has-google-wordmark"> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <cloudx-tabs-nav class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab class="devsite-active"> <a href="https://cloud.google.com/docs" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/docs" track-type="nav" track-metadata-position="nav - docs-home" track-metadata-module="primary nav" aria-label="Documentation, selected" data-category="Site-Wide Custom Events" data-label="Tab: Documentation" track-name="docs-home" track-link-column-type="single-column" > Documentation </a> </tab> <tab class="devsite-dropdown devsite-clickable "> <a href="https://cloud.google.com/docs/tech-area-overviews" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/docs/tech-area-overviews" track-type="nav" track-metadata-position="nav - technology-areas" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Technology areas" track-name="technology-areas" track-link-column-type="single-column" > Technology areas </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Technology areas" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/tech-area-overviews" track-metadata-position="nav - technology-areas" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Technology areas" track-name="technology-areas" track-link-column-type="single-column" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <button class="devsite-tabs-close-button material-icons button-flat gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close dropdown menu" aria-label="Close dropdown menu" track-type="nav" track-name="close" track-metadata-eventdetail="#" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav">close</button> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/ai-ml" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/ai-ml" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> AI and ML </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/application-development" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/application-development" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Application development </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/application-hosting" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/application-hosting" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Application hosting </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/compute-area" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/compute-area" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Compute </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/data" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/data" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Data analytics and pipelines </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/databases" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/databases" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Databases </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/dhm-cloud" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/dhm-cloud" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Distributed, hybrid, and multicloud </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/generative-ai" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/generative-ai" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Generative AI </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/industry" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/industry" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Industry solutions </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/networking" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/networking" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Networking </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/observability" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/observability" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Observability and monitoring </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/security" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/security" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Security </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/storage" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/storage" track-metadata-position="nav - technology-areas" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Storage </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-clickable "> <a href="https://cloud.google.com/docs/cross-product-overviews" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/docs/cross-product-overviews" track-type="nav" track-metadata-position="nav - crossproduct" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Cross-product tools" track-name="crossproduct" track-link-column-type="single-column" > Cross-product tools </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Cross-product tools" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/cross-product-overviews" track-metadata-position="nav - crossproduct" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Cross-product tools" track-name="crossproduct" track-link-column-type="single-column" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <button class="devsite-tabs-close-button material-icons button-flat gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close dropdown menu" aria-label="Close dropdown menu" track-type="nav" track-name="close" track-metadata-eventdetail="#" track-metadata-position="nav - crossproduct" track-metadata-module="tertiary nav">close</button> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/access-resources" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/access-resources" track-metadata-position="nav - crossproduct" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Access and resources management </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/costs-usage" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/costs-usage" track-metadata-position="nav - crossproduct" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Costs and usage management </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/devtools" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/devtools" track-metadata-position="nav - crossproduct" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud SDK, languages, frameworks, and tools </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/iac" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/iac" track-metadata-position="nav - crossproduct" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Infrastructure as code </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/docs/migration" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/docs/migration" track-metadata-position="nav - crossproduct" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Migration </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-clickable "> <a href="https://cloud.google.com/" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/" track-type="nav" track-metadata-position="nav - related-sites" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Related sites" track-name="related-sites" track-link-column-type="single-column" > Related sites </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Related sites" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/" track-metadata-position="nav - related-sites" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Related sites" track-name="related-sites" track-link-column-type="single-column" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <button class="devsite-tabs-close-button material-icons button-flat gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close dropdown menu" aria-label="Close dropdown menu" track-type="nav" track-name="close" track-metadata-eventdetail="#" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav">close</button> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-item"> <a href="https://cloud.google.com/" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Home </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/free" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/free" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Free Trial and Free Tier </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/architecture" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/architecture" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Architecture Center </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/blog" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/blog" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Blog </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/contact" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/contact" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Contact Sales </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/developers" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/developers" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Developer Center </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/" track-type="nav" track-metadata-eventdetail="https://developers.google.com/" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Developer Center </div> </a> </li> <li class="devsite-nav-item"> <a href="https://console.cloud.google.com/marketplace" track-type="nav" track-metadata-eventdetail="https://console.cloud.google.com/marketplace" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Marketplace </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/marketplace/docs" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/marketplace/docs" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Marketplace Documentation </div> </a> </li> <li class="devsite-nav-item"> <a href="https://www.cloudskillsboost.google/paths" track-type="nav" track-metadata-eventdetail="https://www.cloudskillsboost.google/paths" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Skills Boost </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/solutions" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/solutions" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Solution Center </div> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/support-hub" track-type="nav" track-metadata-eventdetail="https://cloud.google.com/support-hub" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Support </div> </a> </li> <li class="devsite-nav-item"> <a href="https://www.youtube.com/@googlecloudtech" track-type="nav" track-metadata-eventdetail="https://www.youtube.com/@googlecloudtech" track-metadata-position="nav - related-sites" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Google Cloud Tech Youtube Channel </div> </a> </li> </ul> </div> </div> </div> </tab> </nav> </cloudx-tabs-nav> </div> <devsite-search enable-signin enable-search enable-suggestions project-name="Cloud Run Documentation" tenant-name="Google Cloud" project-scope="/run/docs" url-scoped="https://cloud.google.com/s/results/run/docs" > <form class="devsite-search-form" action="https://cloud.google.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <devsite-user enable-profiles fp-auth id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" hidden> <div class="devsite-product-description-row"> </div> </div> <div class="devsite-doc-set-nav-row"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://cloud.google.com/run" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Cloud Run" > Cloud Run </a> </li> </ul> <cloudx-tabs-nav class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab class="devsite-active"> <a href="https://cloud.google.com/run/docs/overview/what-is-cloud-run" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/run/docs/overview/what-is-cloud-run" track-type="nav" track-metadata-position="nav - guides" track-metadata-module="primary nav" aria-label="Guides, selected" data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" > Guides </a> </tab> <tab > <a href="https://cloud.google.com/run/docs/apis" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/run/docs/apis" track-type="nav" track-metadata-position="nav - reference" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" > Reference </a> </tab> <tab > <a href="https://cloud.google.com/run/docs/samples" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/run/docs/samples" track-type="nav" track-metadata-position="nav - samples" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" > Samples </a> </tab> <tab > <a href="https://cloud.google.com/run/docs/resources" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://cloud.google.com/run/docs/resources" track-type="nav" track-metadata-position="nav - resources" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" > Resources </a> </tab> </nav> </cloudx-tabs-nav> <div class="devsite-product-button-row"> <a href="https://cloud.google.com/contact" class="cta-button-secondary button " track-type="contact" track-metadata-position="nav" data-overflow-wrapper="tab" track-name="sales" data-overflow="devsite-tabs-wrapper" data-overflow-container="left" track-metadata-eventDetail="nav" >Contact Us</a> <a href="//console.cloud.google.com/freetrial" class="cloud-free-trial-button cta-button-primary button-primary button cloud-button cloud-button--primary " track-type="freeTrial" referrerpolicy="no-referrer-when-downgrade" track-metadata-position="nav" data-overflow="devsite-top-logo-row" track-metadata-eventDetail="nav" track-name="gcpCta" data-overflow-container="right" data-overflow-class="devsite-header-link devsite-top-button button cloud-free-trial-button cloud-free-trial-enabled cloud-button cloud-button--primary" >Start free</a> </div> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="googleCloud" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <img src="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/cloud-logo.svg" class="devsite-site-logo" alt="Google Cloud"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item devsite-has-google-wordmark"> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/docs" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Documentation" track-name="docs-home" track-link-column-type="single-column" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Documentation" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Documentation </span> </a> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/run/docs/overview/what-is-cloud-run" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Guides" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Guides </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> <li class="devsite-nav-item"> <a href="/run/docs/apis" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Reference" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Reference </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/run/docs/samples" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/run/docs/resources" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Resources" track-name="resources" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Resources" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Resources </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/docs/tech-area-overviews" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Technology areas" track-name="technology-areas" track-link-column-type="single-column" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Technology areas" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Technology areas </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Technology areas" track-name="technology-areas" track-link-column-type="single-column" > <span class="devsite-nav-text" tooltip menu="Technology areas"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Technology areas"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/docs/cross-product-overviews" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Cross-product tools" track-name="crossproduct" track-link-column-type="single-column" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cross-product tools" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cross-product tools </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Cross-product tools" track-name="crossproduct" track-link-column-type="single-column" > <span class="devsite-nav-text" tooltip menu="Cross-product tools"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Cross-product tools"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Related sites" track-name="related-sites" track-link-column-type="single-column" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Related sites" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Related sites </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Related sites" track-name="related-sites" track-link-column-type="single-column" > <span class="devsite-nav-text" tooltip menu="Related sites"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Related sites"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="//console.cloud.google.com/" class="devsite-nav-title gc-analytics-event " track-type="globalNav" referrerpolicy="no-referrer-when-downgrade" track-metadata-eventDetail="nav" track-name="console" track-metadata-position="nav" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Console" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Console </span> </a> </li> <li class="devsite-nav-item"> <a href="/contact" class="cta-button-secondary button" track-type="contact" track-metadata-position="nav" data-overflow-wrapper="tab" track-name="sales" data-overflow="devsite-tabs-wrapper" data-overflow-container="left" track-metadata-eventDetail="nav" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Contact Us" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Contact Us </span> </a> </li> <li class="devsite-nav-item"> <a href="//console.cloud.google.com/freetrial" class="cloud-free-trial-button cta-button-primary button-primary button cloud-button cloud-button--primary" track-type="freeTrial" referrerpolicy="no-referrer-when-downgrade" track-metadata-position="nav" data-overflow="devsite-top-logo-row" track-metadata-eventDetail="nav" track-name="gcpCta" data-overflow-container="right" data-overflow-class="devsite-header-link devsite-top-button button cloud-free-trial-button cloud-free-trial-enabled cloud-button cloud-button--primary" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Start free" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Start free </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Discover</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/overview/what-is-cloud-run" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/overview/what-is-cloud-run" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/overview/what-is-cloud-run" ><span class="devsite-nav-text" tooltip>Product overview</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/resource-model" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/resource-model" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/resource-model" ><span class="devsite-nav-text" tooltip>Cloud Run resource model</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/container-contract" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/container-contract" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/container-contract" ><span class="devsite-nav-text" tooltip>Container runtime contract</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/fit-for-run" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/fit-for-run" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/fit-for-run" ><span class="devsite-nav-text" tooltip>Is my service a good fit for Cloud Run?</span></a></li> <li class="devsite-nav-item devsite-nav-preview"><a href="/run/docs/functions-with-run" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/functions-with-run" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/functions-with-run" ><span class="devsite-nav-text" tooltip>When should I deploy a function?</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Get started</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/quickstarts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts" ><span class="devsite-nav-text" tooltip>Overview</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Deploy a sample web service</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/quickstarts/deploy-container" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/deploy-container" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/deploy-container" ><span class="devsite-nav-text" tooltip>Deploy a sample container</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/deploy-continuously" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/deploy-continuously" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/deploy-continuously" ><span class="devsite-nav-text" tooltip>Create template repository and deploy from a git repository</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Deploy a Hello World service from source code</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-go-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-go-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-go-service" ><span class="devsite-nav-text" tooltip>Go</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-nodejs-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-nodejs-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-nodejs-service" ><span class="devsite-nav-text" tooltip>Node.js</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-python-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-python-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-python-service" ><span class="devsite-nav-text" tooltip>Python</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-java-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-java-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-java-service" ><span class="devsite-nav-text" tooltip>Java</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-kotlin-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-kotlin-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-kotlin-service" ><span class="devsite-nav-text" tooltip>Kotlin</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-dotnet-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-dotnet-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-dotnet-service" ><span class="devsite-nav-text" tooltip>C#</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-c-plus-plus-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-c-plus-plus-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-c-plus-plus-service" ><span class="devsite-nav-text" tooltip>C++</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-php-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-php-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-php-service" ><span class="devsite-nav-text" tooltip>PHP</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-ruby-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-ruby-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-ruby-service" ><span class="devsite-nav-text" tooltip>Ruby</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/build-and-deploy/deploy-service-other-languages" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/build-and-deploy/deploy-service-other-languages" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/build-and-deploy/deploy-service-other-languages" ><span class="devsite-nav-text" tooltip>Other</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Frameworks</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/quickstarts/frameworks/frameworks-overview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/frameworks/frameworks-overview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/frameworks/frameworks-overview" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/frameworks/deploy-angular-ssr-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/frameworks/deploy-angular-ssr-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/frameworks/deploy-angular-ssr-service" ><span class="devsite-nav-text" tooltip>Angular SSR</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/frameworks/deploy-nextjs-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/frameworks/deploy-nextjs-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/frameworks/deploy-nextjs-service" ><span class="devsite-nav-text" tooltip>Next.js</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/frameworks/deploy-nuxtjs-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/frameworks/deploy-nuxtjs-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/frameworks/deploy-nuxtjs-service" ><span class="devsite-nav-text" tooltip>Nuxt.js</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/frameworks/deploy-sveltekit-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/frameworks/deploy-sveltekit-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/frameworks/deploy-sveltekit-service" ><span class="devsite-nav-text" tooltip>SvelteKit</span></a></li></ul></div></li></ul></div></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Execute a sample job</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/quickstarts/jobs/create-execute" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/jobs/create-execute" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/jobs/create-execute" ><span class="devsite-nav-text" tooltip>Execute a job</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Execute a job from source code</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/quickstarts/jobs/build-create-go" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/jobs/build-create-go" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/jobs/build-create-go" ><span class="devsite-nav-text" tooltip>Go</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/jobs/build-create-nodejs" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/jobs/build-create-nodejs" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/jobs/build-create-nodejs" ><span class="devsite-nav-text" tooltip>Node.js</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/jobs/build-create-python" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/jobs/build-create-python" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/jobs/build-create-python" ><span class="devsite-nav-text" tooltip>Python</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/jobs/build-create-java" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/jobs/build-create-java" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/jobs/build-create-java" ><span class="devsite-nav-text" tooltip>Java</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/jobs/build-create-shell" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/jobs/build-create-shell" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/jobs/build-create-shell" ><span class="devsite-nav-text" tooltip>Shell</span></a></li></ul></div></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-preview"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Deploy a sample function</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/quickstarts/functions/deploy-functions-console" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/functions/deploy-functions-console" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/functions/deploy-functions-console" ><span class="devsite-nav-text" tooltip>Deploy a function using the console</span></a></li><li class="devsite-nav-item"><a href="/run/docs/quickstarts/functions/deploy-functions-gcloud" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/quickstarts/functions/deploy-functions-gcloud" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/quickstarts/functions/deploy-functions-gcloud" ><span class="devsite-nav-text" tooltip>Deploy a function using gcloud</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Develop</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/setup" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/setup" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/setup" ><span class="devsite-nav-text" tooltip>Set up your environment</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Plan and prepare your service</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/developing" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/developing" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/developing" ><span class="devsite-nav-text" tooltip>Develop your service</span></a></li><li class="devsite-nav-item"><a href="/run/docs/building/containerize-your-code" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/building/containerize-your-code" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/building/containerize-your-code" ><span class="devsite-nav-text" tooltip>Containerize your code</span></a></li><li class="devsite-nav-item"><a href="/run/docs/integrate/using-gcp-services" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/integrate/using-gcp-services" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/integrate/using-gcp-services" ><span class="devsite-nav-text" tooltip>Connect to Google Cloud services</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/system-packages" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/system-packages" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/system-packages" ><span class="devsite-nav-text" tooltip>Install a system package in your container</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/gcloud" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/gcloud" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/gcloud" ><span class="devsite-nav-text" tooltip>Run gcloud commands within your container</span></a></li><li class="devsite-nav-item"><a href="/run/docs/ai-agents" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/ai-agents" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/ai-agents" ><span class="devsite-nav-text" tooltip>Host AI agents</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-preview"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Plan and prepare your function</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/functions/overview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/functions/overview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/functions/overview" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Write functions</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/write-functions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/write-functions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/write-functions" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/write-http-functions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/write-http-functions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/write-http-functions" ><span class="devsite-nav-text" tooltip>HTTP functions</span></a></li><li class="devsite-nav-item"><a href="/run/docs/write-cloudevents-functions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/write-cloudevents-functions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/write-cloudevents-functions" ><span class="devsite-nav-text" tooltip>CloudEvents functions</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Runtimes</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Node.js</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/runtimes/nodejs" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/nodejs" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/nodejs" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/runtimes/nodejs-dependencies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/nodejs-dependencies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/nodejs-dependencies" ><span class="devsite-nav-text" tooltip>Node.js dependencies</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Python</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/runtimes/python" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/python" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/python" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/runtimes/python-dependencies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/python-dependencies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/python-dependencies" ><span class="devsite-nav-text" tooltip>Python dependencies</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Go</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/runtimes/go" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/go" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/go" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/runtimes/go-dependencies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/go-dependencies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/go-dependencies" ><span class="devsite-nav-text" tooltip>Go dependencies</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Java</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/runtimes/java" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/java" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/java" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/runtimes/java-dependencies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/java-dependencies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/java-dependencies" ><span class="devsite-nav-text" tooltip>Java dependencies</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/runtimes/dotnet" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/dotnet" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/dotnet" ><span class="devsite-nav-text" tooltip>.NET</span></a></li><li class="devsite-nav-item"><a href="/run/docs/runtimes/ruby" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/ruby" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/ruby" ><span class="devsite-nav-text" tooltip>Ruby</span></a></li><li class="devsite-nav-item"><a href="/run/docs/runtimes/php" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/runtimes/php" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/runtimes/php" ><span class="devsite-nav-text" tooltip>PHP</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/local-dev-functions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/local-dev-functions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/local-dev-functions" ><span class="devsite-nav-text" tooltip>Local functions development</span></a></li><li class="devsite-nav-item"><a href="/run/docs/function-triggers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/function-triggers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/function-triggers" ><span class="devsite-nav-text" tooltip>Function triggers</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Tutorials</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/tutorials/function-returns-bigquery-query" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/function-returns-bigquery-query" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/function-returns-bigquery-query" ><span class="devsite-nav-text" tooltip>Create a function that returns BigQuery results</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/function-sends-query-to-spanner-database" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/function-sends-query-to-spanner-database" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/function-sends-query-to-spanner-database" ><span class="devsite-nav-text" tooltip>Create a function that returns Spanner results</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/codelabs" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/codelabs" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/codelabs" ><span class="devsite-nav-text" tooltip>Codelabs</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/functions/comparison" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/functions/comparison" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/functions/comparison" ><span class="devsite-nav-text" tooltip>Compare Cloud Run functions</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Build and test</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/building/containers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/building/containers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/building/containers" ><span class="devsite-nav-text" tooltip>Build containers</span></a></li><li class="devsite-nav-item"><a href="/run/docs/building/functions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/building/functions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/building/functions" ><span class="devsite-nav-text" tooltip>Build functions</span></a></li><li class="devsite-nav-item"><a href="/run/docs/testing/local" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/testing/local" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/testing/local" ><span class="devsite-nav-text" tooltip>Local testing</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Serve HTTP requests</span> </div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Deploy services</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/deploying" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/deploying" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/deploying" ><span class="devsite-nav-text" tooltip>Deploy container images</span></a></li><li class="devsite-nav-item"><a href="/run/docs/continuous-deployment-with-cloud-build" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/continuous-deployment-with-cloud-build" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/continuous-deployment-with-cloud-build" ><span class="devsite-nav-text" tooltip>Continuous deployment from git</span></a></li><li class="devsite-nav-item"><a href="/run/docs/deploying-source-code" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/deploying-source-code" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/deploying-source-code" ><span class="devsite-nav-text" tooltip>Deploy from source code</span></a></li><li class="devsite-nav-item devsite-nav-preview"><a href="/run/docs/deploy-functions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/deploy-functions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/deploy-functions" ><span class="devsite-nav-text" tooltip>Deploy functions</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Serve web traffic</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/mapping-custom-domains" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/mapping-custom-domains" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/mapping-custom-domains" ><span class="devsite-nav-text" tooltip>Mapping custom domains</span></a></li><li class="devsite-nav-item"><a href="/run/docs/set-up-cdn" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/set-up-cdn" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/set-up-cdn" ><span class="devsite-nav-text" tooltip>Serving static assets with CDN</span></a></li><li class="devsite-nav-item"><a href="/run/docs/multiple-regions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/multiple-regions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/multiple-regions" ><span class="devsite-nav-text" tooltip>Serving traffic from multiple regions</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/session-affinity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/session-affinity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/session-affinity" ><span class="devsite-nav-text" tooltip>Enable session affinity</span></a></li><li class="devsite-nav-item"><a href="/run/docs/internet-proxy-nginx-sidecar" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/internet-proxy-nginx-sidecar" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/internet-proxy-nginx-sidecar" ><span class="devsite-nav-text" tooltip>Frontend proxying using Nginx</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Manage services</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/managing/services" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/managing/services" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/managing/services" ><span class="devsite-nav-text" tooltip>View, copy, or delete services</span></a></li><li class="devsite-nav-item"><a href="/run/docs/managing/revisions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/managing/revisions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/managing/revisions" ><span class="devsite-nav-text" tooltip>View or delete revisions</span></a></li><li class="devsite-nav-item"><a href="/run/docs/rollouts-rollbacks-traffic-migration" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/rollouts-rollbacks-traffic-migration" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/rollouts-rollbacks-traffic-migration" ><span class="devsite-nav-text" tooltip>Traffic migration, gradual rollouts, rollbacks</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Configure services</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Capacity</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/services/memory-limits" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/memory-limits" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/memory-limits" ><span class="devsite-nav-text" tooltip>Memory limits</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/cpu" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/cpu" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/cpu" ><span class="devsite-nav-text" tooltip>CPU limits</span></a></li><li class="devsite-nav-item devsite-nav-expandable devsite-nav-preview"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>GPU</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/services/gpu" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/gpu" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/gpu" ><span class="devsite-nav-text" tooltip>GPU configuration</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/gpu-best-practices" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/gpu-best-practices" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/gpu-best-practices" ><span class="devsite-nav-text" tooltip>GPU performance best practices</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/gpu-gemma2-with-ollama" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/gpu-gemma2-with-ollama" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/gpu-gemma2-with-ollama" ><span class="devsite-nav-text" tooltip>Run LLM inference on Cloud Run GPUs with Ollama</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/gpu-gemma2-with-vllm" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/gpu-gemma2-with-vllm" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/gpu-gemma2-with-vllm" ><span class="devsite-nav-text" tooltip>Run LLM inference on Cloud Run GPUs with vLLM</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/gpu-opencv-with-cuda" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/gpu-opencv-with-cuda" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/gpu-opencv-with-cuda" ><span class="devsite-nav-text" tooltip>Run OpenCV on Cloud Run with GPU acceleration</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/gpu-gemma2-with-transformers-js" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/gpu-gemma2-with-transformers-js" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/gpu-gemma2-with-transformers-js" ><span class="devsite-nav-text" tooltip>Run LLM inference on Cloud Run GPUs with Hugging Face Transformers.js</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/gpu-llama3-with-tgi" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/gpu-llama3-with-tgi" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/gpu-llama3-with-tgi" ><span class="devsite-nav-text" tooltip>Run LLM inference on Cloud Run GPUs with Hugging Face TGI</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/configuring/request-timeout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/request-timeout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/request-timeout" ><span class="devsite-nav-text" tooltip>Request timeout</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Maximum concurrent requests</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/about-concurrency" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/about-concurrency" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/about-concurrency" ><span class="devsite-nav-text" tooltip>About maximum concurrent requests per instance</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/concurrency" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/concurrency" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/concurrency" ><span class="devsite-nav-text" tooltip>Configure maximum concurrent requests</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/configuring/billing-settings" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/billing-settings" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/billing-settings" ><span class="devsite-nav-text" tooltip>Billing</span></a></li><li class="devsite-nav-item"><a href="/run/docs/recommender" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/recommender" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/recommender" ><span class="devsite-nav-text" tooltip>Optimize service configurations with Recommender</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Environment</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/services/containers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/containers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/containers" ><span class="devsite-nav-text" tooltip>Container port and entrypoint</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Environment variables</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/services/overview-environment-variables" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/overview-environment-variables" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/overview-environment-variables" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/environment-variables" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/environment-variables" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/environment-variables" ><span class="devsite-nav-text" tooltip>Configure environment variables</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Volume mounts</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/services/cloud-storage-volume-mounts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/cloud-storage-volume-mounts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/cloud-storage-volume-mounts" ><span class="devsite-nav-text" tooltip>Cloud Storage volumes</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/nfs-volume-mounts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/nfs-volume-mounts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/nfs-volume-mounts" ><span class="devsite-nav-text" tooltip>NFS volumes</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/in-memory-volume-mounts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/in-memory-volume-mounts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/in-memory-volume-mounts" ><span class="devsite-nav-text" tooltip>In-memory volumes</span></a></li><li class="devsite-nav-item"><a href="/run/docs/using-network-file-systems" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/using-network-file-systems" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/using-network-file-systems" ><span class="devsite-nav-text" tooltip>Other network file systems</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Execution environment</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/about-execution-environments" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/about-execution-environments" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/about-execution-environments" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/execution-environments" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/execution-environments" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/execution-environments" ><span class="devsite-nav-text" tooltip>Select an execution environment</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/configuring/healthchecks" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/healthchecks" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/healthchecks" ><span class="devsite-nav-text" tooltip>Container health checks</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/http2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/http2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/http2" ><span class="devsite-nav-text" tooltip>HTTP/2 requests</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/secrets" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/secrets" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/secrets" ><span class="devsite-nav-text" tooltip>Secrets</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/service-identity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/service-identity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/service-identity" ><span class="devsite-nav-text" tooltip>Service identity</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Autoscaling</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/about-instance-autoscaling" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/about-instance-autoscaling" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/about-instance-autoscaling" ><span class="devsite-nav-text" tooltip>About instance autoscaling</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Maximum instances</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/max-instances-limits" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/max-instances-limits" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/max-instances-limits" ><span class="devsite-nav-text" tooltip>About maximum instances</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/max-instances" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/max-instances" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/max-instances" ><span class="devsite-nav-text" tooltip>Configure maximum instances</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/configuring/min-instances" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/min-instances" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/min-instances" ><span class="devsite-nav-text" tooltip>Minimum instances</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Metadata</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/description" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/description" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/description" ><span class="devsite-nav-text" tooltip>Description</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/labels" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/labels" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/labels" ><span class="devsite-nav-text" tooltip>Labels</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/tags" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/tags" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/tags" ><span class="devsite-nav-text" tooltip>Tags</span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable devsite-nav-preview"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Source deploy configurations</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/services/runtime-base-images" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/runtime-base-images" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/runtime-base-images" ><span class="devsite-nav-text" tooltip>Supported language runtimes and base images</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/automatic-base-image-updates" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/automatic-base-image-updates" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/automatic-base-image-updates" ><span class="devsite-nav-text" tooltip>Configure automatic base image updates</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/build-environment-variables" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/build-environment-variables" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/build-environment-variables" ><span class="devsite-nav-text" tooltip>Build environment variables</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/build-service-account" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/build-service-account" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/build-service-account" ><span class="devsite-nav-text" tooltip>Build service account</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/services/build-worker-pools" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/services/build-worker-pools" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/services/build-worker-pools" ><span class="devsite-nav-text" tooltip>Build worker pools</span></a></li></ul></div></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Invoke and trigger services</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Invoke with HTTPS</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/triggering/https-request" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/https-request" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/https-request" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/triggering/using-scheduler" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/using-scheduler" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/using-scheduler" ><span class="devsite-nav-text" tooltip>Invoke services on a schedule</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Create a workflow</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/triggering/invoke-services-from-workflows" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/invoke-services-from-workflows" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/invoke-services-from-workflows" ><span class="devsite-nav-text" tooltip>Invoke services as part of a Workflow</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/workflows" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/workflows" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/workflows" ><span class="devsite-nav-text" tooltip>Connect a series of services from Cloud Functions and Cloud Run tutorial</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/triggering/using-tasks" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/using-tasks" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/using-tasks" ><span class="devsite-nav-text" tooltip>Execute asynchronous tasks</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Call a service from a Pub/Sub push subscription</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/tutorials/pubsub" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/pubsub" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/pubsub" ><span class="devsite-nav-text" tooltip>Trigger service from Pub/Sub</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/image-processing" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/image-processing" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/image-processing" ><span class="devsite-nav-text" tooltip>Integrate image processing into Pub/Sub sample tutorial</span></a></li></ul></div></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Trigger from events</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/triggering/trigger-with-events" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/trigger-with-events" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/trigger-with-events" ><span class="devsite-nav-text" tooltip>Create triggers with Eventarc</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Pub/Sub triggers</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/triggering/pubsub-triggers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/pubsub-triggers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/pubsub-triggers" ><span class="devsite-nav-text" tooltip>Create triggers with Pub/Sub</span></a></li><li class="devsite-nav-item devsite-nav-preview"><a href="/run/docs/tutorials/pubsub-eventdriven" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/pubsub-eventdriven" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/pubsub-eventdriven" ><span class="devsite-nav-text" tooltip>Trigger functions from Pub/Sub using Eventarc</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span></a></li><li class="devsite-nav-item devsite-nav-preview"><a href="/run/docs/triggering/trigger-functions-from-log-entries" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/trigger-functions-from-log-entries" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/trigger-functions-from-log-entries" ><span class="devsite-nav-text" tooltip>Trigger functions from routed log entries</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Cloud Storage triggers</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/triggering/storage-triggers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/storage-triggers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/storage-triggers" ><span class="devsite-nav-text" tooltip>Create triggers with Cloud Storage</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/eventarc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/eventarc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/eventarc" ><span class="devsite-nav-text" tooltip>Trigger services from Cloud Storage using Eventarc</span></a></li><li class="devsite-nav-item devsite-nav-preview"><a href="/run/docs/tutorials/eventarc-functions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/eventarc-functions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/eventarc-functions" ><span class="devsite-nav-text" tooltip>Trigger functions from Cloud Storage using Eventarc</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span></a></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Firestore triggers</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/triggering/firestore-triggers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/firestore-triggers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/firestore-triggers" ><span class="devsite-nav-text" tooltip>Create triggers with Firestore</span></a></li><li class="devsite-nav-item devsite-nav-preview"><a href="/run/docs/triggering/trigger-functions-with-firestore-documents" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/trigger-functions-with-firestore-documents" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/trigger-functions-with-firestore-documents" ><span class="devsite-nav-text" tooltip>Trigger functions from events in a Firestore database</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span></a></li></ul></div></li></ul></div></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Create WebSocket services</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/triggering/websockets" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/websockets" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/websockets" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/websockets" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/websockets" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/websockets" ><span class="devsite-nav-text" tooltip>Build a WebSocket Chat service tutorial</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/triggering/grpc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/grpc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/grpc" ><span class="devsite-nav-text" tooltip>Connect with other services using gRPC</span></a></li><li class="devsite-nav-item"><a href="/run/docs/triggering/webhooks" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/webhooks" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/webhooks" ><span class="devsite-nav-text" tooltip>Host a webhook target</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Best practices</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/tips/general" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tips/general" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tips/general" ><span class="devsite-nav-text" tooltip>General development tips for services</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tips/java" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tips/java" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tips/java" ><span class="devsite-nav-text" tooltip>Optimize Java services</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tips/python" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tips/python" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tips/python" ><span class="devsite-nav-text" tooltip>Optimize Python services</span></a></li><li class="devsite-nav-item"><a href="/run/docs/about-load-testing" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/about-load-testing" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/about-load-testing" ><span class="devsite-nav-text" tooltip>Load testing best practices</span></a></li><li class="devsite-nav-item"><a href="/run/docs/zonal-redundancy" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/zonal-redundancy" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/zonal-redundancy" ><span class="devsite-nav-text" tooltip>Understand zonal redundancy</span></a></li><li class="devsite-nav-item devsite-nav-expandable devsite-nav-preview"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Functions best practices</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/tips/functions-best-practices" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tips/functions-best-practices" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tips/functions-best-practices" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tips/function-retries" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tips/function-retries" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tips/function-retries" ><span class="devsite-nav-text" tooltip>Enable event-driven function retries</span></a></li></ul></div></li></ul></div></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Execute background jobs</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/create-jobs" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/create-jobs" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/create-jobs" ><span class="devsite-nav-text" tooltip>Create jobs</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Execute jobs</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/execute/jobs" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/execute/jobs" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/execute/jobs" ><span class="devsite-nav-text" tooltip>Execute jobs</span></a></li><li class="devsite-nav-item"><a href="/run/docs/execute/jobs-on-schedule" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/execute/jobs-on-schedule" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/execute/jobs-on-schedule" ><span class="devsite-nav-text" tooltip>Execute scheduled jobs</span></a></li><li class="devsite-nav-item"><a href="/run/docs/execute/jobs-on-schedule-vpc-sc-perimeter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/execute/jobs-on-schedule-vpc-sc-perimeter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/execute/jobs-on-schedule-vpc-sc-perimeter" ><span class="devsite-nav-text" tooltip>Execute scheduled jobs in a VPC SC perimeter</span></a></li><li class="devsite-nav-item"><a href="/run/docs/triggering/invoke-jobs-with-workflows" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/triggering/invoke-jobs-with-workflows" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/triggering/invoke-jobs-with-workflows" ><span class="devsite-nav-text" tooltip>Execute jobs from Workflows</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Configure jobs</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/containers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/containers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/containers" ><span class="devsite-nav-text" tooltip>Container entrypoint</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/cpu" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/cpu" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/cpu" ><span class="devsite-nav-text" tooltip>CPU limits</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/memory-limits" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/memory-limits" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/memory-limits" ><span class="devsite-nav-text" tooltip>Memory limits</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/environment-variables" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/environment-variables" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/environment-variables" ><span class="devsite-nav-text" tooltip>Environment variables</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/healthchecks" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/healthchecks" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/healthchecks" ><span class="devsite-nav-text" tooltip>Container health checks</span></a></li><li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Volume mounts</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/cloud-storage-volume-mounts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/cloud-storage-volume-mounts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/cloud-storage-volume-mounts" ><span class="devsite-nav-text" tooltip>Cloud Storage volumes</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/nfs-volume-mounts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/nfs-volume-mounts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/nfs-volume-mounts" ><span class="devsite-nav-text" tooltip>NFS volumes</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/in-memory-volume-mounts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/in-memory-volume-mounts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/in-memory-volume-mounts" ><span class="devsite-nav-text" tooltip>In-memory volumes</span></a></li><li class="devsite-nav-item"><a href="/run/docs/using-network-file-systems" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/using-network-file-systems" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/using-network-file-systems" ><span class="devsite-nav-text" tooltip>Other network file systems</span></a></li></ul></div></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/labels" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/labels" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/labels" ><span class="devsite-nav-text" tooltip>Labels</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/max-retries" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/max-retries" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/max-retries" ><span class="devsite-nav-text" tooltip>Maximum retries</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/parallelism" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/parallelism" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/parallelism" ><span class="devsite-nav-text" tooltip>Parallelism</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/secrets" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/secrets" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/secrets" ><span class="devsite-nav-text" tooltip>Secrets</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/service-identity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/service-identity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/service-identity" ><span class="devsite-nav-text" tooltip>Service identity</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/task-timeout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/task-timeout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/task-timeout" ><span class="devsite-nav-text" tooltip>Task timeout</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/jobs/tags" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/jobs/tags" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/jobs/tags" ><span class="devsite-nav-text" tooltip>Tags</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Manage jobs</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/managing/jobs" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/managing/jobs" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/managing/jobs" ><span class="devsite-nav-text" tooltip>View or delete jobs</span></a></li><li class="devsite-nav-item"><a href="/run/docs/managing/job-executions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/managing/job-executions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/managing/job-executions" ><span class="devsite-nav-text" tooltip>View or stop job executions</span></a></li></ul></div></li> <li class="devsite-nav-item"><a href="/run/docs/jobs-retries" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/jobs-retries" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/jobs-retries" ><span class="devsite-nav-text" tooltip>Best practices</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Configure networking</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/securing/private-networking" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/private-networking" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/private-networking" ><span class="devsite-nav-text" tooltip>Configure private networking</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Send traffic to VPC network</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/connecting-vpc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/connecting-vpc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/connecting-vpc" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/vpc-direct-vpc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/vpc-direct-vpc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/vpc-direct-vpc" ><span class="devsite-nav-text" tooltip>Direct VPC egress</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/vpc-dual-stack-subnet" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/vpc-dual-stack-subnet" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/vpc-dual-stack-subnet" ><span class="devsite-nav-text" tooltip>Dual-stack services and jobs</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/migrate-direct-vpc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/migrate-direct-vpc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/migrate-direct-vpc" ><span class="devsite-nav-text" tooltip>Migrate standard VPC connector to Direct VPC egress</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/vpc-connectors" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/vpc-connectors" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/vpc-connectors" ><span class="devsite-nav-text" tooltip>VPC connectors</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Send traffic to Shared VPC network</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/configuring/connecting-shared-vpc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/connecting-shared-vpc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/connecting-shared-vpc" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/shared-vpc-direct-vpc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/shared-vpc-direct-vpc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/shared-vpc-direct-vpc" ><span class="devsite-nav-text" tooltip>Direct VPC egress</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/migrate-shared-vpc-direct-vpc" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/migrate-shared-vpc-direct-vpc" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/migrate-shared-vpc-direct-vpc" ><span class="devsite-nav-text" tooltip>Migrate Shared VPC connector to Direct VPC egress</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/shared-vpc-service-projects" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/shared-vpc-service-projects" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/shared-vpc-service-projects" ><span class="devsite-nav-text" tooltip>Connectors in service projects</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/shared-vpc-host-project" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/shared-vpc-host-project" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/shared-vpc-host-project" ><span class="devsite-nav-text" tooltip>Connectors in host project</span></a></li></ul></div></li> <li class="devsite-nav-item"><a href="/run/docs/configuring/static-outbound-ip" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/static-outbound-ip" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/static-outbound-ip" ><span class="devsite-nav-text" tooltip>Static outbound IP address</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Network security</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/securing/ingress" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/ingress" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/ingress" ><span class="devsite-nav-text" tooltip>Restrict ingress (services)</span></a></li><li class="devsite-nav-item"><a href="/run/docs/securing/using-vpc-service-controls" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/using-vpc-service-controls" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/using-vpc-service-controls" ><span class="devsite-nav-text" tooltip>Use VPC Service Controls (VPC SC)</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-preview"><a href="/run/docs/configuring/cloud-service-mesh" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/cloud-service-mesh" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/cloud-service-mesh" ><span class="devsite-nav-text" tooltip>Cloud Service Mesh</span><span class="devsite-nav-icon material-icons" data-icon="preview" data-title="Preview" aria-hidden="true"></span></a></li> <li class="devsite-nav-item"><a href="/run/docs/configuring/networking-best-practices" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/networking-best-practices" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/networking-best-practices" ><span class="devsite-nav-text" tooltip>Best practices for Cloud Run networking</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Secure</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/securing/security" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/security" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/security" ><span class="devsite-nav-text" tooltip>Security design overview</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Authenticate requests</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/authenticating/overview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/authenticating/overview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/authenticating/overview" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/authenticating/public" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/authenticating/public" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/authenticating/public" ><span class="devsite-nav-text" tooltip>Allow public access</span></a></li><li class="devsite-nav-item"><a href="/run/docs/configuring/custom-audiences" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/configuring/custom-audiences" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/configuring/custom-audiences" ><span class="devsite-nav-text" tooltip>Custom audiences</span></a></li><li class="devsite-nav-item"><a href="/run/docs/authenticating/developers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/authenticating/developers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/authenticating/developers" ><span class="devsite-nav-text" tooltip>Authenticate developers</span></a></li><li class="devsite-nav-item"><a href="/run/docs/authenticating/service-to-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/authenticating/service-to-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/authenticating/service-to-service" ><span class="devsite-nav-text" tooltip>Service-to-service</span></a></li><li class="devsite-nav-item"><a href="/run/docs/authenticating/end-users" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/authenticating/end-users" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/authenticating/end-users" ><span class="devsite-nav-text" tooltip>Authenticate users</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/identity-platform" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/identity-platform" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/identity-platform" ><span class="devsite-nav-text" tooltip>End user authentication tutorial</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Secure your resources</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/securing/managing-access" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/managing-access" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/managing-access" ><span class="devsite-nav-text" tooltip>Access control with IAM</span></a></li><li class="devsite-nav-item"><a href="/run/docs/securing/service-identity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/service-identity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/service-identity" ><span class="devsite-nav-text" tooltip>Introduction to service identity</span></a></li><li class="devsite-nav-item"><a href="/run/docs/securing/cloud-armor" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/cloud-armor" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/cloud-armor" ><span class="devsite-nav-text" tooltip>Protect services with Cloud Armor</span></a></li><li class="devsite-nav-item"><a href="/run/docs/securing/binary-authorization" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/binary-authorization" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/binary-authorization" ><span class="devsite-nav-text" tooltip>Use Binary Authorization</span></a></li><li class="devsite-nav-item"><a href="/run/docs/securing/using-cmek" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/using-cmek" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/using-cmek" ><span class="devsite-nav-text" tooltip>Use customer managed encryption keys</span></a></li><li class="devsite-nav-item"><a href="/run/docs/securing/custom-constraints" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/custom-constraints" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/custom-constraints" ><span class="devsite-nav-text" tooltip>Manage custom constraints for projects</span></a></li><li class="devsite-nav-item"><a href="/run/docs/securing/view-security-insights" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/securing/view-security-insights" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/securing/view-security-insights" ><span class="devsite-nav-text" tooltip>View software supply chain security insights</span></a></li><li class="devsite-nav-item"><a href="/run/docs/tutorials/secure-services" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/secure-services" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/secure-services" ><span class="devsite-nav-text" tooltip>Secure Cloud Run services tutorial</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Monitor and log</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/monitoring" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/monitoring" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/monitoring" ><span class="devsite-nav-text" tooltip>View built-in metrics</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/monitoring-managed-prometheus-sidecar" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/monitoring-managed-prometheus-sidecar" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/monitoring-managed-prometheus-sidecar" ><span class="devsite-nav-text" tooltip>Write Prometheus metrics</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/tutorials/custom-metrics-opentelemetry-sidecar" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/custom-metrics-opentelemetry-sidecar" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/custom-metrics-opentelemetry-sidecar" ><span class="devsite-nav-text" tooltip>Write OpenTelemetry metrics</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/logging" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/logging" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/logging" ><span class="devsite-nav-text" tooltip>Log and view logs</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/audit-logging" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/audit-logging" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/audit-logging" ><span class="devsite-nav-text" tooltip>Audit logging</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/error-reporting" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/error-reporting" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/error-reporting" ><span class="devsite-nav-text" tooltip>Error reporting</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/trace" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/trace" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/trace" ><span class="devsite-nav-text" tooltip>Use distributed tracing for services</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Migrate</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/a-web-service" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/a-web-service" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/a-web-service" ><span class="devsite-nav-text" tooltip>An existing web service</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/from-app-engine-to-cloud-run" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/from-app-engine-to-cloud-run" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/from-app-engine-to-cloud-run" ><span class="devsite-nav-text" tooltip>From App Engine</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/from-aws-lambda" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/from-aws-lambda" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/from-aws-lambda" ><span class="devsite-nav-text" tooltip>From AWS Lambda</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/migrating-nodejs-apps-from-heroku-to-cloud-run" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/migrating-nodejs-apps-from-heroku-to-cloud-run" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/migrating-nodejs-apps-from-heroku-to-cloud-run" ><span class="devsite-nav-text" tooltip>From Heroku</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>From Cloud Foundry</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/run/docs/migrate/cloud-foundry/migrate-from-cloud-foundry-to-cloud-run" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/cloud-foundry/migrate-from-cloud-foundry-to-cloud-run" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/cloud-foundry/migrate-from-cloud-foundry-to-cloud-run" ><span class="devsite-nav-text" tooltip>Migration overview</span></a></li><li class="devsite-nav-item"><a href="/run/docs/migrate/cloud-foundry/oci-compliant-strategy" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/cloud-foundry/oci-compliant-strategy" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/cloud-foundry/oci-compliant-strategy" ><span class="devsite-nav-text" tooltip>Choose an OCI-compliant-strategy</span></a></li><li class="devsite-nav-item"><a href="/run/docs/migrate/cloud-foundry/migrate-to-oci-containers" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/cloud-foundry/migrate-to-oci-containers" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/cloud-foundry/migrate-to-oci-containers" ><span class="devsite-nav-text" tooltip>Migrate to OCI containers</span></a></li><li class="devsite-nav-item"><a href="/run/docs/migrate/cloud-foundry/migrate-configuration" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/cloud-foundry/migrate-configuration" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/cloud-foundry/migrate-configuration" ><span class="devsite-nav-text" tooltip>Migrate configuration</span></a></li><li class="devsite-nav-item"><a href="/run/docs/migrate/cloud-foundry/spring-music-migration-example" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/cloud-foundry/spring-music-migration-example" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/cloud-foundry/spring-music-migration-example" ><span class="devsite-nav-text" tooltip>Sample migration: Spring Music</span></a></li></ul></div></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/from-vmware-tanzu" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/from-vmware-tanzu" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/from-vmware-tanzu" ><span class="devsite-nav-text" tooltip>From VMWare Tanzu</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/from-on-premises" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/from-on-premises" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/from-on-premises" ><span class="devsite-nav-text" tooltip>From a VM using Migrate to Containers</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/from-kubernetes" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/from-kubernetes" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/from-kubernetes" ><span class="devsite-nav-text" tooltip>From Kubernetes</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/migrate/to-gke" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/migrate/to-gke" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/migrate/to-gke" ><span class="devsite-nav-text" tooltip>To GKE</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Troubleshoot</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/troubleshooting/overview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/troubleshooting/overview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/troubleshooting/overview" ><span class="devsite-nav-text" tooltip>Introduction</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/troubleshooting" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/troubleshooting" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/troubleshooting" ><span class="devsite-nav-text" tooltip>Troubleshoot errors</span></a></li> <li class="devsite-nav-item"><a href="/run/docs/tutorials/local-troubleshooting" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/tutorials/local-troubleshooting" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/tutorials/local-troubleshooting" ><span class="devsite-nav-text" tooltip>Local troubleshooting tutorial</span></a></li> <li class="devsite-nav-item devsite-nav-heading"><div class="devsite-nav-title devsite-nav-title-no-path"> <span class="devsite-nav-text" tooltip>Samples</span> </div></li> <li class="devsite-nav-item"><a href="/run/docs/samples" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /run/docs/samples" track-type="bookNav" track-name="click" track-metadata-eventdetail="/run/docs/samples" ><span class="devsite-nav-text" tooltip>All Cloud Run code samples</span></a></li> <li class="devsite-nav-item"><a href="/docs/samples" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /docs/samples" track-type="bookNav" track-name="click" track-metadata-eventdetail="/docs/samples" ><span class="devsite-nav-text" tooltip>Code samples for all products</span></a></li> </ul> <ul class="devsite-nav-list" menu="Technology areas" aria-label="Side menu" hidden> <li class="devsite-nav-item"> <a href="/docs/ai-ml" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: AI and ML" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > AI and ML </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/application-development" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Application development" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Application development </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/application-hosting" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Application hosting" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Application hosting </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/compute-area" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Compute" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Compute </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/data" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Data analytics and pipelines" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Data analytics and pipelines </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/databases" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Databases" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Databases </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/dhm-cloud" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Distributed, hybrid, and multicloud" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Distributed, hybrid, and multicloud </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/generative-ai" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Generative AI" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Generative AI </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/industry" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Industry solutions" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Industry solutions </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/networking" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Networking" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Networking </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/observability" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Observability and monitoring" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Observability and monitoring </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Security" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Security </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/storage" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Storage" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Storage </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Cross-product tools" aria-label="Side menu" hidden> <li class="devsite-nav-item"> <a href="/docs/access-resources" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Access and resources management" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Access and resources management </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/costs-usage" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Costs and usage management" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Costs and usage management </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/devtools" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud SDK, languages, frameworks, and tools" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud SDK, languages, frameworks, and tools </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/iac" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Infrastructure as code" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Infrastructure as code </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/migration" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Migration" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Migration </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Related sites" aria-label="Side menu" hidden> <li class="devsite-nav-item"> <a href="/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Home" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Home </span> </a> </li> <li class="devsite-nav-item"> <a href="/free" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Free Trial and Free Tier" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Free Trial and Free Tier </span> </a> </li> <li class="devsite-nav-item"> <a href="/architecture" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Architecture Center" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Architecture Center </span> </a> </li> <li class="devsite-nav-item"> <a href="https://cloud.google.com/blog" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Blog" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Blog </span> </a> </li> <li class="devsite-nav-item"> <a href="/contact" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Contact Sales" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Contact Sales </span> </a> </li> <li class="devsite-nav-item"> <a href="/developers" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Developer Center" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Developer Center </span> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Developer Center" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Developer Center </span> </a> </li> <li class="devsite-nav-item"> <a href="https://console.cloud.google.com/marketplace" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Marketplace" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Marketplace </span> </a> </li> <li class="devsite-nav-item"> <a href="/marketplace/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Marketplace Documentation" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Marketplace Documentation </span> </a> </li> <li class="devsite-nav-item"> <a href="https://www.cloudskillsboost.google/paths" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Skills Boost" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Skills Boost </span> </a> </li> <li class="devsite-nav-item"> <a href="/solutions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Solution Center" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Solution Center </span> </a> </li> <li class="devsite-nav-item"> <a href="/support-hub" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Support" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Support </span> </a> </li> <li class="devsite-nav-item"> <a href="https://www.youtube.com/@googlecloudtech" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Cloud Tech Youtube Channel" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Cloud Tech Youtube Channel </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" id="main-content" class="devsite-main-content" has-book-nav has-sidebar > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars ></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://cloud.google.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Google Cloud" > Home </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://cloud.google.com/run" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Cloud Run" > Cloud Run </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://cloud.google.com/run/docs" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="Cloud Run Documentation" > Documentation </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://cloud.google.com/run/docs/overview/what-is-cloud-run" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="4" track-type="globalNav" track-name="breadcrumb" track-metadata-position="4" track-metadata-eventdetail="" > Guides </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <devsite-feedback position="header" project-name="Cloud Run Documentation" product-id="97037" bucket="Documentation" context="" version="t-devsite-webserver-20250211-r00-rc00.466928320959134316" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="header" class="nocontent" project-feedback-url="https://issuetracker.google.com/issues/new?component=608076" project-icon="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/favicons/onecloud/super_cloud.png" > <button> Send feedback </button> </devsite-feedback> <h1 class="devsite-page-title" tabindex="-1"> Use Pub/Sub with Cloud Run tutorial </h1> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <div class="devsite-page-title-meta"><devsite-view-release-notes></devsite-view-release-notes></div> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <div class="devsite-article-body clearfix "> <div class="tutorial tutorial-lesson"> <hr class="cloud-divider"> <section id="overview"> <p>This tutorial shows how to write, deploy, and call a Cloud Run service from a <a href="/pubsub/docs/push">Pub/Sub push subscription</a>.</p> </section> <section id="objectives"> <h2 id="objectives" data-text="Objectives" tabindex="-1">Objectives</h2> <ul> <li>Write, build, and deploy a service to Cloud Run</li> <li>Call the service by publishing a message to a <a href="/pubsub">Pub/Sub</a> topic.</li> </ul> </section> <section id="costs"> <h2 id="costs" data-text="Costs" tabindex="-1">Costs</h2> <p> In this document, you use the following billable components of Google Cloud: </p> <ul> <li><a href="/artifact-registry">Artifact Registry</a></li> <li><a href="/build">Cloud Build</a></li> <li><a href="/pubsub">Pub/Sub</a></li> <li><a href="/run">Cloud Run</a></li> </ul> <p> To generate a cost estimate based on your projected usage, use the <a href="/products/calculator" track-type="commonIncludes" track-name="pricingCalculator">pricing calculator</a>. <cloudx-free-trial-eligible-content> <slot slot="eligible"> New Google Cloud users might be eligible for a <a href="/free" track-type="freeTrial" track-name="consoleLink" track-metadata-position="prerequisites" track-metadata-end-goal="signUp" target="_blank">free trial</a>. </slot> <slot slot="ineligible"> </slot> </cloudx-free-trial-eligible-content> </p> </section> <section id="prerequisites"> <h2 id="before-you-begin" data-text="Before you begin" tabindex="-1">Before you begin</h2> <ol> <cloudx-free-trial-eligible-content> <slot slot="eligible"> <li> Sign in to your Google Cloud account. If you're new to Google Cloud, <a href="https://console.cloud.google.com/freetrial" target="console" track-type="commonIncludes" track-name="createAnAccount" track-metadata-position="prereqs" track-metadata-eventdetail="https://console.cloud.google.com/freetrial" track-metadata-link-destination="https://console.cloud.google.com/freetrial"> create an account</a> to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads. </li> <li> <p>In the Google Cloud console, on the project selector page, select or create a Google Cloud project.</p> <aside class="note"><b>Note</b>: If you don't plan to keep the resources that you create in this procedure, create a project instead of selecting an existing project. After you finish these steps, you can delete the project, removing all resources associated with the project.</aside> <p><a href="https://console.cloud.google.com/projectselector2/home/dashboard" target="console" track-type="commonIncludes" track-name="consoleLink" track-metadata-end-goal="createProject" class="button button-primary">Go to project selector</a></p> </li> <li> <p> <a href="/billing/docs/how-to/verify-billing-enabled#confirm_billing_is_enabled_on_a_project" target="_blank" track-type="commonIncludes" track-name="supportLink" track-metadata-end-goal="enableBilling" >Make sure that billing is enabled for your Google Cloud project</a>. </p> </li> </slot> <slot slot="ineligible"> <li> <p>In the Google Cloud console, on the project selector page, select or create a Google Cloud project.</p> <aside class="note"><b>Note</b>: If you don't plan to keep the resources that you create in this procedure, create a project instead of selecting an existing project. After you finish these steps, you can delete the project, removing all resources associated with the project.</aside> <p><a href="https://console.cloud.google.com/projectselector2/home/dashboard" target="console" track-type="commonIncludes" track-name="consoleLink" track-metadata-end-goal="createProject" class="button button-primary">Go to project selector</a></p> </li> <li> <p> <a href="/billing/docs/how-to/verify-billing-enabled#confirm_billing_is_enabled_on_a_project" target="_blank" track-type="commonIncludes" track-name="supportLink" track-metadata-end-goal="enableBilling" >Make sure that billing is enabled for your Google Cloud project</a>. </p> </li> </slot> </cloudx-free-trial-eligible-content> <li> <p> Enable the Artifact Registry, Cloud Build, Pub/Sub and Cloud Run APIs. </p><p><a href="https://console.cloud.google.com/flows/enableapi?apiid=artifactregistry.googleapis.com,cloudbuild.googleapis.com,pubsub.googleapis.com,run.googleapis.com" target="console" track-type="commonIncludes" track-name="consoleLink" track-metadata-end-goal="enableAPI" class="button button-primary">Enable the APIs</a></p> </li> <style> .henhouse-text { font-size:85%; padding:2px 4px; line-height:1; } </style> <li><a href="/sdk/docs/install">Install and initialize the gcloud CLI</a>.</li> <li>Update components: <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>components<span class="devsite-syntax-w"> </span>update</pre></devsite-code></li> </ol> <h3 id="required_roles" data-text="Required roles" tabindex="-1">Required roles</h3> <p> To get the permissions that you need to complete the tutorial, ask your administrator to grant you the following IAM roles on your project: </p> <ul> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#cloudbuild.builds.editor">Cloud Build Editor </a> (<code translate="no" dir="ltr">roles/cloudbuild.builds.editor</code>)</li> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#run.admin">Cloud Run Admin </a> (<code translate="no" dir="ltr">roles/run.admin</code>)</li> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#iam.serviceAccountCreator">Create Service Accounts </a> (<code translate="no" dir="ltr">roles/iam.serviceAccountCreator</code>)</li> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#resourcemanager.projectIamAdmin">Project IAM Admin </a> (<code translate="no" dir="ltr">roles/resourcemanager.projectIamAdmin</code>)</li> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#pubsub.editor">Pub/Sub Editor </a> (<code translate="no" dir="ltr">roles/pubsub.editor</code>)</li> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#iam.serviceAccountUser">Service Account User </a> (<code translate="no" dir="ltr">roles/iam.serviceAccountUser</code>)</li> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#serviceusage.serviceUsageConsumer">Service Usage Consumer </a> (<code translate="no" dir="ltr">roles/serviceusage.serviceUsageConsumer</code>)</li> <li> <a href="https://cloud.google.com/iam/docs/understanding-roles#storage.admin">Storage Admin </a> (<code translate="no" dir="ltr">roles/storage.admin</code>)</li> </ul> <p> For more information about granting roles, see <a href="/iam/docs/granting-changing-revoking-access">Manage access to projects, folders, and organizations</a>. </p> <p> You might also be able to get the required permissions through <a href="/iam/docs/creating-custom-roles">custom roles</a> or other <a href="/iam/docs/understanding-roles">predefined roles</a>. </p> <aside class="note"> <strong>Note:</strong> <a href="/iam/docs/understanding-roles#basic">IAM basic roles</a> might also contain permissions to complete the tutorial. You shouldn't grant basic roles in a production environment, but you can grant them in a development or test environment. </aside> </section> <div id="tutorial-content"> <section class="tutorial-content"> <h2 id="setting-up-gcloud" data-text="Set up gcloud defaults" tabindex="-1">Set up gcloud defaults</h2> <p>To configure gcloud with defaults for your Cloud Run service:</p> <ol> <li><p>Set your default project:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>config<span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">set</span><span class="devsite-syntax-w"> </span>project<span class="devsite-syntax-w"> </span><var translate="no">PROJECT_ID</var></pre></devsite-code> <p>Replace <var translate="no">PROJECT_ID</var> with the name of the project you created for this tutorial.</p></li> <li><p>Configure gcloud for your chosen region:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>config<span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">set</span><span class="devsite-syntax-w"> </span>run/region<span class="devsite-syntax-w"> </span><var translate="no">REGION</var></pre></devsite-code> <p>Replace <var translate="no">REGION</var> with the supported Cloud Run <a href="#follow-cloud-run" style="border-bottom: 1px dotted #999" data-modal-dialog-id="regions" class="devsite-dialog-button">region</a> of your choice.</p></li> </ol> <div id="regions" class="devsite-dialog"> <div class="devsite-dialog-contents"> <h3 class="hide-from-toc" id="cloud-run-locations" data-text="Cloud Run locations" tabindex="-1">Cloud Run locations</h3></p> <p>Cloud Run is regional, which means the infrastructure that runs your Cloud Run services is located in a specific region and is managed by Google to be redundantly available across <a href="/docs/geography-and-regions">all the zones within that region</a>. <br><br></p> <p>Meeting your latency, availability, or durability requirements are primary factors for selecting the region where your Cloud Run services are run. You can generally select the region nearest to your users but you should consider the location of the <a href="/about/locations#locations">other Google Cloud products</a> that are used by your Cloud Run service. Using Google Cloud products together across multiple locations can affect your service's latency as well as cost.<br><br></p> <p>Cloud Run is available in the following regions:</p> <h4 id="tier-1" data-text="Subject to Tier 1 pricing" tabindex="-1">Subject to <a href="/run/pricing#tables" track-type="inline link">Tier 1 pricing</a></h4> <ul> <li><code translate="no" dir="ltr">asia-east1</code> (Taiwan) </li> <li><code translate="no" dir="ltr">asia-northeast1</code> (Tokyo) </li> <li><code translate="no" dir="ltr">asia-northeast2</code> (Osaka) </li> <li><code translate="no" dir="ltr">asia-south1</code> (Mumbai, India) </li> <li><code translate="no" dir="ltr">europe-north1</code> (Finland) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">europe-southwest1</code> (Madrid) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">europe-west1</code> (Belgium) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">europe-west4</code> (Netherlands) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">europe-west8</code> (Milan) </li> <li><code translate="no" dir="ltr">europe-west9</code> (Paris) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">me-west1</code> (Tel Aviv) </li> <li><code translate="no" dir="ltr">us-central1</code> (Iowa) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">us-east1</code> (South Carolina) </li> <li><code translate="no" dir="ltr">us-east4</code> (Northern Virginia) </li> <li><code translate="no" dir="ltr">us-east5</code> (Columbus) </li> <li><code translate="no" dir="ltr">us-south1</code> (Dallas) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">us-west1</code> (Oregon) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a></li> </ul> <h4 id="tier-2" data-text="Subject to Tier 2 pricing" tabindex="-1">Subject to <a href="/run/pricing#tables" track-type="inline link">Tier 2 pricing</a></h4> <ul> <li><code translate="no" dir="ltr">africa-south1</code> (Johannesburg) </li> <li><code translate="no" dir="ltr">asia-east2</code> (Hong Kong) </li> <li><code translate="no" dir="ltr">asia-northeast3</code> (Seoul, South Korea) </li> <li><code translate="no" dir="ltr">asia-southeast1</code> (Singapore) </li> <li><code translate="no" dir="ltr">asia-southeast2 </code> (Jakarta) </li> <li><code translate="no" dir="ltr">asia-south2</code> (Delhi, India) </li> <li><code translate="no" dir="ltr">australia-southeast1</code> (Sydney) </li> <li><code translate="no" dir="ltr">australia-southeast2</code> (Melbourne) </li> <li><code translate="no" dir="ltr">europe-central2</code> (Warsaw, Poland) </li> <li><code translate="no" dir="ltr">europe-west10</code> (Berlin) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">europe-west12</code> (Turin) </li> <li><code translate="no" dir="ltr">europe-west2</code> (London, UK) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">europe-west3</code> (Frankfurt, Germany) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">europe-west6</code> (Zurich, Switzerland) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">me-central1</code> (Doha) </li> <li><code translate="no" dir="ltr">me-central2</code> (Dammam) </li> <li><code translate="no" dir="ltr">northamerica-northeast1</code> (Montreal) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">northamerica-northeast2</code> (Toronto) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">southamerica-east1</code> (Sao Paulo, Brazil) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">southamerica-west1</code> (Santiago, Chile) <img src="/static/sustainability/region-carbon/gleaf.svg" width="18" alt="leaf icon"> <a href="/sustainability/region-carbon#region-picker" track-type="inline link">Low CO<sub>2</sub></a> </li> <li><code translate="no" dir="ltr">us-west2</code> (Los Angeles) </li> <li><code translate="no" dir="ltr">us-west3</code> (Salt Lake City) </li> <li><code translate="no" dir="ltr">us-west4</code> (Las Vegas) </li> </ul> <p>If you already created a Cloud Run service, you can view the region in the Cloud Run dashboard in the <a href="https://console.cloud.google.com/run">Google Cloud console</a>.</p> </div> <div class="devsite-dialog-buttons"> <button class="devsite-dialog-close">OK</button> </div> </div> <h2 id="deploy-repo" data-text="Create an Artifact Registry standard repository" tabindex="-1">Create an Artifact Registry standard repository</h2> <p>Create an Artifact Registry standard repository to store your container image:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>artifacts<span class="devsite-syntax-w"> </span>repositories<span class="devsite-syntax-w"> </span>create<span class="devsite-syntax-w"> </span><var translate="no">REPOSITORY</var><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>--repository-format<span class="devsite-syntax-o">=</span>docker<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>--location<span class="devsite-syntax-o">=</span><var translate="no">REGION</var></pre></devsite-code> <p>Replace:</p> <ul> <li><var translate="no">REPOSITORY</var> with a unique name for the repository.</li> <li><var translate="no">REGION</var> with the Google Cloud region to be used for the Artifact Registry repository.</li> </ul> <h2 id="creating-topic" data-text="Create a Pub/Sub topic" tabindex="-1">Create a Pub/Sub topic</h2> <p>The sample service is triggered by messages published to a Pub/Sub topic, so you'll need to create a topic in Pub/Sub.</p> <div class="ds-selector-tabs" data-ds-scope="code-sample"> <section><h3 id="gcloud" data-text=" gcloud " tabindex="-1"> gcloud </h3><p>To create a new Pub/Sub topic, use the command:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>pubsub<span class="devsite-syntax-w"> </span>topics<span class="devsite-syntax-w"> </span>create<span class="devsite-syntax-w"> </span><var translate="no">myRunTopic</var></pre></devsite-code> <p>You can use <var translate="no">myRunTopic</var> or replace with a topic name unique within your Google Cloud project.</p></section> <section><h3 id="terraform" data-text="Terraform" tabindex="-1">Terraform</h3><p> <p>To learn how to apply or remove a Terraform configuration, see <a href="/docs/terraform/basic-commands">Basic Terraform commands</a>.</p></p> <p>To create a Pub/Sub topic, add the following to your existing <code translate="no" dir="ltr">main.tf</code> file:</p> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf/main/cloudrun_service_pubsub_topic" data-code-snippet="true" data-github-includecode-link="https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf" feedback-context="{"language": "hcl", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf"}" feedback-product="1634365" feedback-bucket="serverless" language="hcl" data-github-path="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf" data-git-revision="main" data-region-tag="cloudrun_service_pubsub_topic" dir="ltr" is-upgraded syntax="Terraform"><code translate="no" dir="ltr"><span class="devsite-syntax-kr">resource</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">"google_pubsub_topic"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">"default"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"pubsub_topic"</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> <p>You can use a topic name unique within your Cloud project.</p></section> </div> <h2 id="retrieve-code" data-text="Retrieve the code sample" tabindex="-1">Retrieve the code sample</h2> <p>To retrieve the code sample for use:</p> <ol> <li><p>Clone the sample app repository to your local machine:</p> <div id="run-clone-sample-repository-tabs" class="ds-selector-tabs" data-ds-scope="code-sample"> <section> <h3 id="run-clone-sample-repository-nodejs" track-type="sampleTabNav" track-name="nodejs" track-metadata-position="run-clone-sample-repository" data-text=" Node.js " tabindex="-1"> Node.js </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash">git<span class="devsite-syntax-w"> </span>clone<span class="devsite-syntax-w"> </span>https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git</pre></devsite-code> <p> Alternatively, you can <a href="https://github.com/GoogleCloudPlatform/nodejs-docs-samples/archive/master.zip"> download the sample </a> as a zip file and extract it. </p> </section> <section> <h3 id="run-clone-sample-repository-python" track-type="sampleTabNav" track-name="python" track-metadata-position="run-clone-sample-repository" data-text=" Python " tabindex="-1"> Python </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash">git<span class="devsite-syntax-w"> </span>clone<span class="devsite-syntax-w"> </span>https://github.com/GoogleCloudPlatform/python-docs-samples.git</pre></devsite-code> <p> Alternatively, you can <a href="https://github.com/GoogleCloudPlatform/python-docs-samples/archive/master.zip"> download the sample </a> as a zip file and extract it. </p> </section> <section> <h3 id="run-clone-sample-repository-go" track-type="sampleTabNav" track-name="go" track-metadata-position="run-clone-sample-repository" data-text=" Go " tabindex="-1"> Go </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash">git<span class="devsite-syntax-w"> </span>clone<span class="devsite-syntax-w"> </span>https://github.com/GoogleCloudPlatform/golang-samples.git</pre></devsite-code> <p> Alternatively, you can <a href="https://github.com/GoogleCloudPlatform/golang-samples/archive/master.zip"> download the sample </a> as a zip file and extract it. </p> </section> <section> <h3 id="run-clone-sample-repository-java" track-type="sampleTabNav" track-name="java" track-metadata-position="run-clone-sample-repository" data-text=" Java " tabindex="-1"> Java </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash">git<span class="devsite-syntax-w"> </span>clone<span class="devsite-syntax-w"> </span>https://github.com/GoogleCloudPlatform/java-docs-samples.git</pre></devsite-code> <p> Alternatively, you can <a href="https://github.com/GoogleCloudPlatform/java-docs-samples/archive/master.zip"> download the sample </a> as a zip file and extract it. </p> </section> <section> <h3 id="run-clone-sample-repository-dotnet" track-type="sampleTabNav" track-name="dotnet" track-metadata-position="run-clone-sample-repository" data-text=" C# " tabindex="-1"> C# </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash">git<span class="devsite-syntax-w"> </span>clone<span class="devsite-syntax-w"> </span>https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git</pre></devsite-code> <p> Alternatively, you can <a href="https://github.com/GoogleCloudPlatform/dotnet-docs-samples/archive/master.zip"> download the sample </a> as a zip file and extract it. </p> </section> </div> </li> <li><p>Change to the directory that contains the Cloud Run sample code:</p> <p> <div id="run-change-directory-tabs" class="ds-selector-tabs" data-ds-scope="code-sample"> <section> <h3 id="run-change-directory-nodejs" track-type="sampleTabNav" track-name="nodejs" track-metadata-position="run-change-directory" data-text=" Node.js " tabindex="-1"> Node.js </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash"><span class="devsite-syntax-nb">cd</span><span class="devsite-syntax-w"> </span>nodejs-docs-samples/run/pubsub/</pre></devsite-code> </section> <section> <h3 id="run-change-directory-python" track-type="sampleTabNav" track-name="python" track-metadata-position="run-change-directory" data-text=" Python " tabindex="-1"> Python </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash"><span class="devsite-syntax-nb">cd</span><span class="devsite-syntax-w"> </span>python-docs-samples/run/pubsub/</pre></devsite-code> </section> <section> <h3 id="run-change-directory-go" track-type="sampleTabNav" track-name="go" track-metadata-position="run-change-directory" data-text=" Go " tabindex="-1"> Go </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash"><span class="devsite-syntax-nb">cd</span><span class="devsite-syntax-w"> </span>golang-samples/run/pubsub/</pre></devsite-code> </section> <section> <h3 id="run-change-directory-java" track-type="sampleTabNav" track-name="java" track-metadata-position="run-change-directory" data-text=" Java " tabindex="-1"> Java </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash"><span class="devsite-syntax-nb">cd</span><span class="devsite-syntax-w"> </span>java-docs-samples/run/pubsub/</pre></devsite-code> </section> <section> <h3 id="run-change-directory-dotnet" track-type="sampleTabNav" track-name="dotnet" track-metadata-position="run-change-directory" data-text=" C# " tabindex="-1"> C# </h3> <div></div><devsite-code><pre class="devsite-click-to-copy notranslate" dir="ltr" is-upgraded syntax="Bash"><span class="devsite-syntax-nb">cd</span><span class="devsite-syntax-w"> </span>dotnet-docs-samples/run/Run.Samples.Pubsub.MinimalApi/</pre></devsite-code> </section> </div> </p></li> </ol> <h2 id="review_the_code" data-text="Review the code" tabindex="-1">Review the code</h2> <p>The code for this tutorial consists of the following:</p> <ul> <li><p>A server that handles incoming requests.</p> <p> <div id="run_pubsub_server-tabs" class="ds-selector-tabs" data-ds-scope="code-sample"> <section> <h3 id="run_pubsub_server-nodejs" track-type="sampleTabNav" track-name="nodejs" track-metadata-position="run_pubsub_server" data-text=" Node.js " tabindex="-1"> Node.js </h3> </p> <p>To keep the Node.js service easy to test, the server configuration is separate from the server startup.</p> <p>The Node.js web server is set up in <code translate="no" dir="ltr">app.js</code>. <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/app.js/HEAD/cloudrun_pubsub_server_setup" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/app.js" feedback-context="{"language": "nodejs", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/app.js"}" feedback-product="1634365" feedback-bucket="serverless" language="nodejs" data-github-path="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/app.js" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_server_setup" dir="ltr" is-upgraded syntax="JavaScript"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">express</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">require</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s1">'express'</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">app</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">express</span><span class="devsite-syntax-p">();</span> <span class="devsite-syntax-c1">// This middleware is available in Express v4.16.0 onwards</span> <span class="devsite-syntax-nx">app</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">use</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">express</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">json</span><span class="devsite-syntax-p">());</span></code></pre></devsite-code> </div> </p> <p>The web server is started in <code translate="no" dir="ltr">index.js</code>:</p> <p> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/index.js/HEAD/cloudrun_pubsub_server" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/index.js" feedback-context="{"language": "nodejs", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/index.js"}" feedback-product="1634365" feedback-bucket="serverless" language="nodejs" data-github-path="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/index.js" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_server" dir="ltr" is-upgraded syntax="JavaScript"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">app</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">require</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s1">'./app.js'</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">PORT</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">parseInt</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nb">parseInt</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">process</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">env</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">PORT</span><span class="devsite-syntax-p">))</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">||</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mf">8080</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-nx">app</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">listen</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">PORT</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span>> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">console</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sb">`nodejs-pubsub-tutorial listening on port </span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-nx">PORT</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-sb">`</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">);</span></code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_server-python" track-type="sampleTabNav" track-name="python" track-metadata-position="run_pubsub_server" data-text=" Python " tabindex="-1"> Python </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/python-docs-samples/run/pubsub/main.py/HEAD/cloudrun_pubsub_server" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/run/pubsub/main.py" feedback-context="{"language": "python", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/run/pubsub/main.py"}" feedback-product="1634365" feedback-bucket="serverless" language="python" data-github-path="GoogleCloudPlatform/python-docs-samples/run/pubsub/main.py" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_server" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">base64</span> <span class="devsite-syntax-kn">from</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">flask</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kn">import</span> <span class="devsite-syntax-n">Flask</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">request</span> <span class="devsite-syntax-n">app</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">Flask</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-vm">__name__</span><span class="devsite-syntax-p">)</span> </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_server-go" track-type="sampleTabNav" track-name="go" track-metadata-position="run_pubsub_server" data-text=" Go " tabindex="-1"> Go </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/golang-samples/run/pubsub/main.go/HEAD/cloudrun_pubsub_server" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/golang-samples/blob/HEAD/run/pubsub/main.go" feedback-context="{"language": "go", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/golang-samples/blob/HEAD/run/pubsub/main.go"}" feedback-product="1634365" feedback-bucket="serverless" language="go" data-github-path="GoogleCloudPlatform/golang-samples/run/pubsub/main.go" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_server" dir="ltr" is-upgraded syntax="Go"><code translate="no" dir="ltr"> <span class="devsite-syntax-c1">// Sample run-pubsub is a Cloud Run service which handles Pub/Sub messages.</span> <span class="devsite-syntax-kn">package</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">main</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"encoding/json"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"io"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"log"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"net/http"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"os"</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-kd">func</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">main</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">HandleFunc</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"/"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">HelloPubSub</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Determine port for HTTP service.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">port</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">:=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">os</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Getenv</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"PORT"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">port</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">==</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">""</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">port</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"8080"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Printf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Defaulting to port %s"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">port</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Start HTTP server.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Printf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Listening on port %s"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">port</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">:=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">ListenAndServe</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">":"</span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-nx">port</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">nil</span><span class="devsite-syntax-p">);</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">!=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">nil</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Fatal</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_server-java" track-type="sampleTabNav" track-name="java" track-metadata-position="run_pubsub_server" data-text=" Java " tabindex="-1"> Java </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/java-docs-samples/run/pubsub/src/main/java/com/example/cloudrun/PubSubApplication.java/HEAD/cloudrun_pubsub_server" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/java-docs-samples/blob/HEAD/run/pubsub/src/main/java/com/example/cloudrun/PubSubApplication.java" feedback-context="{"language": "java", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/java-docs-samples/blob/HEAD/run/pubsub/src/main/java/com/example/cloudrun/PubSubApplication.java"}" feedback-product="1634365" feedback-bucket="serverless" language="java" data-github-path="GoogleCloudPlatform/java-docs-samples/run/pubsub/src/main/java/com/example/cloudrun/PubSubApplication.java" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_server" dir="ltr" is-upgraded syntax="Java"><code translate="no" dir="ltr"><span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.boot.SpringApplication</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.boot.autoconfigure.SpringBootApplication</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-nd">@SpringBootApplication</span> <span class="devsite-syntax-kd">public</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">class</span> <span class="devsite-syntax-nc">PubSubApplication</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">public</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">static</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">void</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">main</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">String</span><span class="devsite-syntax-o">[]</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">args</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">SpringApplication</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">run</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">PubSubApplication</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">class</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">args</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_server-dotnet" track-type="sampleTabNav" track-name="dotnet" track-metadata-position="run_pubsub_server" data-text=" C# " tabindex="-1"> C# </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/dotnet-docs-samples/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs/HEAD/cloudrun_pubsub_server" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/HEAD/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs" feedback-context="{"language": "csharp", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/HEAD/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs"}" feedback-product="1634365" feedback-bucket="serverless" language="csharp" data-github-path="GoogleCloudPlatform/dotnet-docs-samples/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_server" dir="ltr" is-upgraded syntax="C#"><code translate="no" dir="ltr"><span class="devsite-syntax-kt">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">builder</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">WebApplication</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">CreateBuilder</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">args</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-kt">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">app</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">builder</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Build</span><span class="devsite-syntax-p">();</span> <span class="devsite-syntax-kt">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">port</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Environment</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">GetEnvironmentVariable</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"PORT"</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">port</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">!=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">null</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">app</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Urls</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Add</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">$"http://0.0.0.0:{port}"</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> </div> </section> </div> </p></li> <li><p>A handler that processes the Pub/Sub message and logs a greeting. <div id="run_pubsub_handler-tabs" class="ds-selector-tabs" data-ds-scope="code-sample"> <section> <h3 id="run_pubsub_handler-nodejs" track-type="sampleTabNav" track-name="nodejs" track-metadata-position="run_pubsub_handler" data-text=" Node.js " tabindex="-1"> Node.js </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/app.js/HEAD/cloudrun_pubsub_handler" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/app.js" feedback-context="{"language": "nodejs", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/app.js"}" feedback-product="1634365" feedback-bucket="serverless" language="nodejs" data-github-path="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/app.js" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_handler" dir="ltr" is-upgraded syntax="JavaScript"><code translate="no" dir="ltr"><span class="devsite-syntax-nx">app</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">post</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s1">'/'</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">req</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">res</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span>><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-o">!</span><span class="devsite-syntax-nx">req</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">body</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">msg</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'no Pub/Sub message received'</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">console</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">error</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sb">`error: </span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-nx">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-sb">`</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">res</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">status</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-mf">400</span><span class="devsite-syntax-p">).</span><span class="devsite-syntax-nx">send</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sb">`Bad Request: </span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-nx">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-sb">`</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-o">!</span><span class="devsite-syntax-nx">req</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">body</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">message</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">msg</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'invalid Pub/Sub message format'</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">console</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">error</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sb">`error: </span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-nx">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-sb">`</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">res</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">status</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-mf">400</span><span class="devsite-syntax-p">).</span><span class="devsite-syntax-nx">send</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sb">`Bad Request: </span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-nx">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-sb">`</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">pubSubMessage</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">req</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">body</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">message</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">const</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">pubSubMessage</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">data</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">?</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">Buffer</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-kr">from</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">pubSubMessage</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">data</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'base64'</span><span class="devsite-syntax-p">).</span><span class="devsite-syntax-nx">toString</span><span class="devsite-syntax-p">().</span><span class="devsite-syntax-nx">trim</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'World'</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">console</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sb">`Hello </span><span class="devsite-syntax-si">${</span><span class="devsite-syntax-nx">name</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-sb">!`</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">res</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">status</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-mf">204</span><span class="devsite-syntax-p">).</span><span class="devsite-syntax-nx">send</span><span class="devsite-syntax-p">();</span> <span class="devsite-syntax-p">});</span></code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_handler-python" track-type="sampleTabNav" track-name="python" track-metadata-position="run_pubsub_handler" data-text=" Python " tabindex="-1"> Python </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/python-docs-samples/run/pubsub/main.py/HEAD/cloudrun_pubsub_handler" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/run/pubsub/main.py" feedback-context="{"language": "python", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/run/pubsub/main.py"}" feedback-product="1634365" feedback-bucket="serverless" language="python" data-github-path="GoogleCloudPlatform/python-docs-samples/run/pubsub/main.py" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_handler" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-nd">@app</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">route</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"/"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">methods</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"POST"</span><span class="devsite-syntax-p">])</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">index</span><span class="devsite-syntax-p">():</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-sd">"""Receive and parse Pub/Sub messages."""</span> <span class="devsite-syntax-n">envelope</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">request</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">get_json</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-k">if</span> <span class="devsite-syntax-ow">not</span> <span class="devsite-syntax-n">envelope</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">msg</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"no Pub/Sub message received"</span> <span class="devsite-syntax-nb">print</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sa">f</span><span class="devsite-syntax-s2">"error: </span><span class="devsite-syntax-si">{</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-s2">"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-sa">f</span><span class="devsite-syntax-s2">"Bad Request: </span><span class="devsite-syntax-si">{</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-s2">"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-mi">400</span> <span class="devsite-syntax-k">if</span> <span class="devsite-syntax-ow">not</span> <span class="devsite-syntax-nb">isinstance</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">envelope</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-nb">dict</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-ow">or</span> <span class="devsite-syntax-s2">"message"</span> <span class="devsite-syntax-ow">not</span> <span class="devsite-syntax-ow">in</span> <span class="devsite-syntax-n">envelope</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">msg</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"invalid Pub/Sub message format"</span> <span class="devsite-syntax-nb">print</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sa">f</span><span class="devsite-syntax-s2">"error: </span><span class="devsite-syntax-si">{</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-s2">"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-sa">f</span><span class="devsite-syntax-s2">"Bad Request: </span><span class="devsite-syntax-si">{</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-s2">"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-mi">400</span> <span class="devsite-syntax-n">pubsub_message</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">envelope</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"message"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"World"</span> <span class="devsite-syntax-k">if</span> <span class="devsite-syntax-nb">isinstance</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">pubsub_message</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-nb">dict</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-ow">and</span> <span class="devsite-syntax-s2">"data"</span> <span class="devsite-syntax-ow">in</span> <span class="devsite-syntax-n">pubsub_message</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">base64</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">b64decode</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">pubsub_message</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"data"</span><span class="devsite-syntax-p">])</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">decode</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"utf-8"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">strip</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-nb">print</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-sa">f</span><span class="devsite-syntax-s2">"Hello </span><span class="devsite-syntax-si">{</span><span class="devsite-syntax-n">name</span><span class="devsite-syntax-si">}</span><span class="devsite-syntax-s2">!"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">""</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-mi">204</span><span class="devsite-syntax-p">)</span> </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_handler-go" track-type="sampleTabNav" track-name="go" track-metadata-position="run_pubsub_handler" data-text=" Go " tabindex="-1"> Go </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/golang-samples/run/pubsub/main.go/HEAD/cloudrun_pubsub_handler" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/golang-samples/blob/HEAD/run/pubsub/main.go" feedback-context="{"language": "go", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/golang-samples/blob/HEAD/run/pubsub/main.go"}" feedback-product="1634365" feedback-bucket="serverless" language="go" data-github-path="GoogleCloudPlatform/golang-samples/run/pubsub/main.go" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_handler" dir="ltr" is-upgraded syntax="Go"><code translate="no" dir="ltr"> <span class="devsite-syntax-c1">// PubSubMessage is the payload of a Pub/Sub event.</span> <span class="devsite-syntax-c1">// See the documentation for more details:</span> <span class="devsite-syntax-c1">// https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage</span> <span class="devsite-syntax-kd">type</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">PubSubMessage</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">struct</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">Message</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">struct</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">Data</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[]</span><span class="devsite-syntax-kt">byte</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">`json:"data,omitempty"`</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">ID</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">string</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">`json:"id"`</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">`json:"message"`</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">Subscription</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">string</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">`json:"subscription"`</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-c1">// HelloPubSub receives and processes a Pub/Sub push message.</span> <span class="devsite-syntax-kd">func</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">HelloPubSub</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">w</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">ResponseWriter</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">r</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">*</span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Request</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">m</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">PubSubMessage</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">body</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">:=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">io</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">ReadAll</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">r</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Body</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">defer</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">r</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Body</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Close</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">!=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">nil</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Printf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"io.ReadAll: %v"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Error</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">w</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"Bad Request"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">StatusBadRequest</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// byte slice unmarshalling handles base64 decoding.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">:=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">json</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Unmarshal</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">body</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span>&<span class="devsite-syntax-nx">m</span><span class="devsite-syntax-p">);</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">!=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">nil</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Printf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"json.Unmarshal: %v"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">err</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Error</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">w</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"Bad Request"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">http</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">StatusBadRequest</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">:=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">string</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nx">m</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Message</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Data</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">==</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">""</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"World"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">log</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-nx">Printf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Hello %s!"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">name</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_handler-java" track-type="sampleTabNav" track-name="java" track-metadata-position="run_pubsub_handler" data-text=" Java " tabindex="-1"> Java </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/java-docs-samples/run/pubsub/src/main/java/com/example/cloudrun/PubSubController.java/HEAD/cloudrun_pubsub_handler" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/java-docs-samples/blob/HEAD/run/pubsub/src/main/java/com/example/cloudrun/PubSubController.java" feedback-context="{"language": "java", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/java-docs-samples/blob/HEAD/run/pubsub/src/main/java/com/example/cloudrun/PubSubController.java"}" feedback-product="1634365" feedback-bucket="serverless" language="java" data-github-path="GoogleCloudPlatform/java-docs-samples/run/pubsub/src/main/java/com/example/cloudrun/PubSubController.java" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_handler" dir="ltr" is-upgraded syntax="Java"><code translate="no" dir="ltr"><span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">com.example.cloudrun.Body</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">java.util.Base64</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.apache.commons.lang3.StringUtils</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.http.HttpStatus</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.http.ResponseEntity</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.web.bind.annotation.RequestBody</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.web.bind.annotation.RequestMapping</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.web.bind.annotation.RequestMethod</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-kn">import</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nn">org.springframework.web.bind.annotation.RestController</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-c1">// PubsubController consumes a Pub/Sub message.</span> <span class="devsite-syntax-nd">@RestController</span> <span class="devsite-syntax-kd">public</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">class</span> <span class="devsite-syntax-nc">PubSubController</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nd">@RequestMapping</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">value</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"/"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">method</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">RequestMethod</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">POST</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">public</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ResponseEntity<String></span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">receiveMessage</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nd">@RequestBody</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Body</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">body</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Get PubSub message from request body.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Body</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">Message</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">message</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">body</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getMessage</span><span class="devsite-syntax-p">();</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">message</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">==</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">null</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">String</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"Bad Request: invalid Pub/Sub message format"</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">System</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">out</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">println</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">new</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ResponseEntity</span><><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">HttpStatus</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">BAD_REQUEST</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">String</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">data</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">message</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getData</span><span class="devsite-syntax-p">();</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">String</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">target</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">!</span><span class="devsite-syntax-n">StringUtils</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">isEmpty</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">data</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">?</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">new</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">String</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">Base64</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getDecoder</span><span class="devsite-syntax-p">().</span><span class="devsite-syntax-na">decode</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">data</span><span class="devsite-syntax-p">))</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"World"</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">String</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"Hello "</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">target</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"!"</span><span class="devsite-syntax-p">;</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">System</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">out</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">println</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">new</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ResponseEntity</span><><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">msg</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">HttpStatus</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">OK</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_handler-dotnet" track-type="sampleTabNav" track-name="dotnet" track-metadata-position="run_pubsub_handler" data-text=" C# " tabindex="-1"> C# </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/dotnet-docs-samples/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs/HEAD/cloudrun_pubsub_handler" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/HEAD/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs" feedback-context="{"language": "csharp", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/HEAD/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs"}" feedback-product="1634365" feedback-bucket="serverless" language="csharp" data-github-path="GoogleCloudPlatform/dotnet-docs-samples/run/pubsub/Run.Samples.Pubsub.MinimalApi/Program.cs" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_handler" dir="ltr" is-upgraded syntax="C#"><code translate="no" dir="ltr"><span class="devsite-syntax-n">app</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">MapPost</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"/"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">Envelope</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">envelope</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span>> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">envelope</span><span class="devsite-syntax-o">?.</span><span class="devsite-syntax-n">Message</span><span class="devsite-syntax-o">?.</span><span class="devsite-syntax-n">Data</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">==</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">null</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">app</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Logger</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">LogWarning</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Bad Request: Invalid Pub/Sub message format."</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Results</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">BadRequest</span><span class="devsite-syntax-p">();</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">data</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Convert</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">FromBase64String</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">envelope</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Message</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Data</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">target</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">System</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Text</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Encoding</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">UTF8</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">GetString</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">data</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">app</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">Logger</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">LogInformation</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">$"Hello {target}!"</span><span class="devsite-syntax-p">);</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">return</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Results</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-n">NoContent</span><span class="devsite-syntax-p">();</span> <span class="devsite-syntax-p">});</span> </code></pre></devsite-code> </div> </section> </div> </p> <p>You must code the service to return an accurate HTTP response code. Success codes, such as HTTP <code translate="no" dir="ltr">200</code> or <code translate="no" dir="ltr">204</code>, acknowledge complete processing of the Pub/Sub message. Error codes, such as HTTP <code translate="no" dir="ltr">400</code> or <code translate="no" dir="ltr">500</code>, indicate the message will be retried, as described in <a href="/pubsub/docs/push">Receiving messages using Push guide</a>.</p></li> <li><p>A <code translate="no" dir="ltr">Dockerfile</code> that defines the operating environment for the service. The contents of the <code translate="no" dir="ltr">Dockerfile</code> vary by language.</p> <p> <div id="run_pubsub_dockerfile-tabs" class="ds-selector-tabs" data-ds-scope="code-sample"> <section> <h3 id="run_pubsub_dockerfile-nodejs" track-type="sampleTabNav" track-name="nodejs" track-metadata-position="run_pubsub_dockerfile" data-text=" Node.js " tabindex="-1"> Node.js </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/Dockerfile/HEAD/cloudrun_pubsub_dockerfile_nodejs" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/Dockerfile" feedback-context="{"language": "nodejs", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/HEAD/run/pubsub/Dockerfile"}" feedback-product="1634365" feedback-bucket="serverless" language="nodejs" data-github-path="GoogleCloudPlatform/nodejs-docs-samples/run/pubsub/Dockerfile" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_dockerfile_nodejs" dir="ltr" is-upgraded syntax="Docker"><code translate="no" dir="ltr"> <span class="devsite-syntax-c"># Use the official lightweight Node.js image.</span> <span class="devsite-syntax-c"># https://hub.docker.com/_/node</span> <span class="devsite-syntax-k">FROM</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">node:20-slim</span> <span class="devsite-syntax-c"># Create and change to the app directory.</span> <span class="devsite-syntax-k">WORKDIR</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">/usr/src/app</span> <span class="devsite-syntax-c"># Copy application dependency manifests to the container image.</span> <span class="devsite-syntax-c"># A wildcard is used to ensure both package.json AND package-lock.json are copied.</span> <span class="devsite-syntax-c"># Copying this separately prevents re-running npm install on every code change.</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>package*.json<span class="devsite-syntax-w"> </span>./ <span class="devsite-syntax-c"># Install dependencies.</span> <span class="devsite-syntax-c"># if you need a deterministic and repeatable build create a</span> <span class="devsite-syntax-c"># package-lock.json file and use npm ci:</span> <span class="devsite-syntax-c"># RUN npm ci --omit=dev</span> <span class="devsite-syntax-c"># if you need to include development dependencies during development</span> <span class="devsite-syntax-c"># of your application, use:</span> <span class="devsite-syntax-c"># RUN npm install --dev</span> <span class="devsite-syntax-k">RUN</span><span class="devsite-syntax-w"> </span>npm<span class="devsite-syntax-w"> </span>install<span class="devsite-syntax-w"> </span>--omit<span class="devsite-syntax-o">=</span>dev <span class="devsite-syntax-c"># Copy local code to the container image.</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>.<span class="devsite-syntax-w"> </span>. <span class="devsite-syntax-c"># Run the web service on container startup.</span> <span class="devsite-syntax-k">CMD</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"npm"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"start"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">]</span> </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_dockerfile-python" track-type="sampleTabNav" track-name="python" track-metadata-position="run_pubsub_dockerfile" data-text=" Python " tabindex="-1"> Python </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/python-docs-samples/run/pubsub/Dockerfile/HEAD/cloudrun_pubsub_dockerfile_python" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/run/pubsub/Dockerfile" feedback-context="{"language": "python", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/run/pubsub/Dockerfile"}" feedback-product="1634365" feedback-bucket="serverless" language="python" data-github-path="GoogleCloudPlatform/python-docs-samples/run/pubsub/Dockerfile" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_dockerfile_python" dir="ltr" is-upgraded syntax="Docker"><code translate="no" dir="ltr"> <span class="devsite-syntax-c"># Use the official Python image.</span> <span class="devsite-syntax-c"># https://hub.docker.com/_/python</span> <span class="devsite-syntax-k">FROM</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">python:3.11</span> <span class="devsite-syntax-c"># Allow statements and log messages to immediately appear in the Cloud Run logs</span> <span class="devsite-syntax-k">ENV</span><span class="devsite-syntax-w"> </span>PYTHONUNBUFFERED<span class="devsite-syntax-w"> </span>True <span class="devsite-syntax-c"># Copy application dependency manifests to the container image.</span> <span class="devsite-syntax-c"># Copying this separately prevents re-running pip install on every code change.</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>requirements.txt<span class="devsite-syntax-w"> </span>./ <span class="devsite-syntax-c"># Install production dependencies.</span> <span class="devsite-syntax-k">RUN</span><span class="devsite-syntax-w"> </span>pip<span class="devsite-syntax-w"> </span>install<span class="devsite-syntax-w"> </span>-r<span class="devsite-syntax-w"> </span>requirements.txt <span class="devsite-syntax-c"># Copy local code to the container image.</span> <span class="devsite-syntax-k">ENV</span><span class="devsite-syntax-w"> </span>APP_HOME<span class="devsite-syntax-w"> </span>/app <span class="devsite-syntax-k">WORKDIR</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">$APP_HOME</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>.<span class="devsite-syntax-w"> </span>./ <span class="devsite-syntax-c"># Run the web service on container startup.</span> <span class="devsite-syntax-c"># Use gunicorn webserver with one worker process and 8 threads.</span> <span class="devsite-syntax-c"># For environments with multiple CPU cores, increase the number of workers</span> <span class="devsite-syntax-c"># to be equal to the cores available.</span> <span class="devsite-syntax-c"># Timeout is set to 0 to disable the timeouts of the workers to allow Cloud Run to handle instance scaling.</span> <span class="devsite-syntax-k">CMD</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">exec</span><span class="devsite-syntax-w"> </span>gunicorn<span class="devsite-syntax-w"> </span>--bind<span class="devsite-syntax-w"> </span>:<span class="devsite-syntax-nv">$PORT</span><span class="devsite-syntax-w"> </span>--workers<span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">1</span><span class="devsite-syntax-w"> </span>--threads<span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">8</span><span class="devsite-syntax-w"> </span>--timeout<span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-w"> </span>main:app </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_dockerfile-go" track-type="sampleTabNav" track-name="go" track-metadata-position="run_pubsub_dockerfile" data-text=" Go " tabindex="-1"> Go </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/golang-samples/run/pubsub/Dockerfile/HEAD/cloudrun_pubsub_dockerfile_go" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/golang-samples/blob/HEAD/run/pubsub/Dockerfile" feedback-context="{"language": "go", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/golang-samples/blob/HEAD/run/pubsub/Dockerfile"}" feedback-product="1634365" feedback-bucket="serverless" language="go" data-github-path="GoogleCloudPlatform/golang-samples/run/pubsub/Dockerfile" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_dockerfile_go" dir="ltr" is-upgraded syntax="Docker"><code translate="no" dir="ltr"> <span class="devsite-syntax-c"># Use the official Go image to create a binary.</span> <span class="devsite-syntax-c"># This is based on Debian and sets the GOPATH to /go.</span> <span class="devsite-syntax-c"># https://hub.docker.com/_/golang</span> <span class="devsite-syntax-k">FROM</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">golang:1.21-bookworm</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">as</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">builder</span> <span class="devsite-syntax-c"># Create and change to the app directory.</span> <span class="devsite-syntax-k">WORKDIR</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">/app</span> <span class="devsite-syntax-c"># Retrieve application dependencies.</span> <span class="devsite-syntax-c"># This allows the container build to reuse cached dependencies.</span> <span class="devsite-syntax-c"># Expecting to copy go.mod and if present go.sum.</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>go.*<span class="devsite-syntax-w"> </span>./ <span class="devsite-syntax-k">RUN</span><span class="devsite-syntax-w"> </span>go<span class="devsite-syntax-w"> </span>mod<span class="devsite-syntax-w"> </span>download <span class="devsite-syntax-c"># Copy local code to the container image.</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>.<span class="devsite-syntax-w"> </span>./ <span class="devsite-syntax-c"># Build the binary.</span> <span class="devsite-syntax-k">RUN</span><span class="devsite-syntax-w"> </span>go<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>-v<span class="devsite-syntax-w"> </span>-o<span class="devsite-syntax-w"> </span>server <span class="devsite-syntax-c"># Use the official Debian slim image for a lean production container.</span> <span class="devsite-syntax-c"># https://hub.docker.com/_/debian</span> <span class="devsite-syntax-c"># https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds</span> <span class="devsite-syntax-k">FROM</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">debian:bookworm-slim</span> <span class="devsite-syntax-k">RUN</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">set</span><span class="devsite-syntax-w"> </span>-x<span class="devsite-syntax-w"> && </span>apt-get<span class="devsite-syntax-w"> </span>update<span class="devsite-syntax-w"> && </span><span class="devsite-syntax-nv">DEBIAN_FRONTEND</span><span class="devsite-syntax-o">=</span>noninteractive<span class="devsite-syntax-w"> </span>apt-get<span class="devsite-syntax-w"> </span>install<span class="devsite-syntax-w"> </span>-y<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>ca-certificates<span class="devsite-syntax-w"> && </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>rm<span class="devsite-syntax-w"> </span>-rf<span class="devsite-syntax-w"> </span>/var/lib/apt/lists/* <span class="devsite-syntax-c"># Copy the binary to the production image from the builder stage.</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>--from<span class="devsite-syntax-o">=</span>builder<span class="devsite-syntax-w"> </span>/app/server<span class="devsite-syntax-w"> </span>/server <span class="devsite-syntax-c"># Run the web service on container startup.</span> <span class="devsite-syntax-k">CMD</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"/server"</span><span class="devsite-syntax-p">]</span> </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_dockerfile-java" track-type="sampleTabNav" track-name="java" track-metadata-position="run_pubsub_dockerfile" data-text=" Java " tabindex="-1"> Java </h3> </p> <p>This sample uses <a href="https://github.com/GoogleContainerTools/jib">Jib</a> to build Docker images using common Java tools. Jib optimizes container builds without the need for a Dockerfile or having <a href="https://www.docker.com/">Docker</a> installed. Learn more about <a href="/run/docs/tutorials/jib">building Java containers with Jib</a>. <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/java-docs-samples/run/pubsub/pom.xml/HEAD/cloudrun_pubsub_jib" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/java-docs-samples/blob/HEAD/run/pubsub/pom.xml" feedback-context="{"language": "java", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/java-docs-samples/blob/HEAD/run/pubsub/pom.xml"}" feedback-product="1634365" feedback-bucket="serverless" language="java" data-github-path="GoogleCloudPlatform/java-docs-samples/run/pubsub/pom.xml" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_jib" dir="ltr" is-upgraded syntax="XML"><code translate="no" dir="ltr"><plugin> <span class="devsite-syntax-w"> </span><groupId>com.google.cloud.tools</groupId> <span class="devsite-syntax-w"> </span><artifactId>jib-maven-plugin</artifactId> <span class="devsite-syntax-w"> </span><version>3.4.0</version> <span class="devsite-syntax-w"> </span><configuration> <span class="devsite-syntax-w"> </span><to> <span class="devsite-syntax-w"> </span><image>gcr.io/PROJECT_ID/pubsub</image> <span class="devsite-syntax-w"> </span></to> <span class="devsite-syntax-w"> </span></configuration> </plugin> </code></pre></devsite-code> </div> </section> <section> <h3 id="run_pubsub_dockerfile-dotnet" track-type="sampleTabNav" track-name="dotnet" track-metadata-position="run_pubsub_dockerfile" data-text=" C# " tabindex="-1"> C# </h3> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="GoogleCloudPlatform/dotnet-docs-samples/run/pubsub/Run.Samples.Pubsub.MinimalApi/Dockerfile/HEAD/cloudrun_pubsub_dockerfile_csharp" data-code-snippet="true" data-github-includecode-link="https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/HEAD/run/pubsub/Run.Samples.Pubsub.MinimalApi/Dockerfile" feedback-context="{"language": "csharp", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/HEAD/run/pubsub/Run.Samples.Pubsub.MinimalApi/Dockerfile"}" feedback-product="1634365" feedback-bucket="serverless" language="csharp" data-github-path="GoogleCloudPlatform/dotnet-docs-samples/run/pubsub/Run.Samples.Pubsub.MinimalApi/Dockerfile" data-git-revision="HEAD" data-region-tag="cloudrun_pubsub_dockerfile_csharp" dir="ltr" is-upgraded syntax="Docker"><code translate="no" dir="ltr"><span class="devsite-syntax-c"># Build in SDK base image</span> <span class="devsite-syntax-k">FROM</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">mcr.microsoft.com/dotnet/sdk:6.0</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">AS</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">build-env</span> <span class="devsite-syntax-k">WORKDIR</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">/app</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>*.csproj<span class="devsite-syntax-w"> </span>./ <span class="devsite-syntax-k">RUN</span><span class="devsite-syntax-w"> </span>dotnet<span class="devsite-syntax-w"> </span>restore <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>.<span class="devsite-syntax-w"> </span>./ <span class="devsite-syntax-k">RUN</span><span class="devsite-syntax-w"> </span>dotnet<span class="devsite-syntax-w"> </span>publish<span class="devsite-syntax-w"> </span>-r<span class="devsite-syntax-w"> </span>linux-x64<span class="devsite-syntax-w"> </span>--no-self-contained<span class="devsite-syntax-w"> </span>-p:PublishReadyToRun<span class="devsite-syntax-o">=</span><span class="devsite-syntax-nb">true</span><span class="devsite-syntax-w"> </span>-c<span class="devsite-syntax-w"> </span>Release<span class="devsite-syntax-w"> </span>-o<span class="devsite-syntax-w"> </span>out <span class="devsite-syntax-c"># Copy to runtime image</span> <span class="devsite-syntax-k">FROM</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">mcr.microsoft.com/dotnet/aspnet:6.0</span> <span class="devsite-syntax-k">WORKDIR</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">/app</span> <span class="devsite-syntax-k">COPY</span><span class="devsite-syntax-w"> </span>--from<span class="devsite-syntax-o">=</span>build-env<span class="devsite-syntax-w"> </span>/app/out<span class="devsite-syntax-w"> </span>. <span class="devsite-syntax-c"># Port passed in by Cloud Run via environment variable PORT. Default 8080.</span> <span class="devsite-syntax-k">ENV</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">PORT</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-m">8080</span> <span class="devsite-syntax-k">ENTRYPOINT</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"dotnet"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"Run.Samples.Pubsub.MinimalApi.dll"</span><span class="devsite-syntax-p">]</span></code></pre></devsite-code> </div> </section> </div> </p></li> </ul> <p>For details on how to authenticate the origin of Pub/Sub requests, see <a href="#integrating-pubsub">Integrate with Pub/Sub</a>.</p> <h2 id="ship_the_code" data-text="Ship the code" tabindex="-1">Ship the code</h2> <p>Shipping code consists of three steps: building a container image with Cloud Build, uploading the container image to Artifact Registry, and deploying the container image to Cloud Run.</p> <p>To ship your code:</p> <ol> <li> <p>Build your container and publish on Artifact Registry:</p> <div id="run_pubsub_build-tabs" class="ds-selector-tabs" data-ds-scope="code-sample"> <section> <h3 id="run_pubsub_build-nodejs" track-type="sampleTabNav" track-name="nodejs" track-metadata-position="run_pubsub_build" data-text=" Node.js " tabindex="-1"> Node.js </h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>builds<span class="devsite-syntax-w"> </span>submit<span class="devsite-syntax-w"> </span>--tag<span class="devsite-syntax-w"> </span><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub</pre></devsite-code> Replace: <ul> <li><var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> <li><var translate="no">REPOSITORY</var> with the name of the Artifact Registry repository.</li> <li><var translate="no">REGION</var> with the Google Cloud region to be used for the Artifact Registry repository.</li> </ul> <p><code translate="no" dir="ltr">pubsub</code> is the image name.</p> <p>Upon success, you should see a SUCCESS message containing the ID, creation time, and image name. The image is stored in Artifact Registry and can be re-used if required.</p> </section> <section> <h3 id="run_pubsub_build-python" track-type="sampleTabNav" track-name="python" track-metadata-position="run_pubsub_build" data-text=" Python " tabindex="-1"> Python </h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>builds<span class="devsite-syntax-w"> </span>submit<span class="devsite-syntax-w"> </span>--tag<span class="devsite-syntax-w"> </span><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub</pre></devsite-code> Replace: <ul> <li> <var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> <li> <var translate="no">REPOSITORY</var> with the name of the Artifact Registry repository.</li> <li> <var translate="no">REGION</var> with the Google Cloud region to be used for the Artifact Registry repository.</li> </ul> <p><code translate="no" dir="ltr">pubsub</code> is the image name.</p> <p>Upon success, you should see a SUCCESS message containing the ID, creation time, and image name. The image is stored in Artifact Registry and can be re-used if required.</p> </section> <section> <h3 id="run_pubsub_build-go" track-type="sampleTabNav" track-name="go" track-metadata-position="run_pubsub_build" data-text=" Go " tabindex="-1"> Go </h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>builds<span class="devsite-syntax-w"> </span>submit<span class="devsite-syntax-w"> </span>--tag<span class="devsite-syntax-w"> </span><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub</pre></devsite-code> Replace: <ul> <li><var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> <li><var translate="no">REPOSITORY</var> with the name of the Artifact Registry repository.</li> <li><var translate="no">REGION</var> with the Google Cloud region to be used for the Artifact Registry repository.</li> </ul> <p><code translate="no" dir="ltr">pubsub</code> is the image name.</p> <p>Upon success, you should see a SUCCESS message containing the ID, creation time, and image name. The image is stored in Artifact Registry and can be re-used if required.</p> </section> <section> <h3 id="run_pubsub_build-java" track-type="sampleTabNav" track-name="java" track-metadata-position="run_pubsub_build" data-text=" Java " tabindex="-1"> Java </h3> <ul> <li> Use the <a href="/artifact-registry/docs/docker/authentication#gcloud-helper">gcloud CLI credential helper</a> to authorize Docker to push to your Artifact Registry. <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>auth<span class="devsite-syntax-w"> </span>configure-docker</pre></devsite-code> </li> <li> Use the Jib Maven Plugin to build and push the container to Artifact Registry. <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">mvn<span class="devsite-syntax-w"> </span>compile<span class="devsite-syntax-w"> </span>jib:build<span class="devsite-syntax-w"> </span>-D<span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">image</span><span class="devsite-syntax-o">=</span><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub</pre></devsite-code> Replace: <ul> <li> <var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> <li> <var translate="no">REPOSITORY</var> with the name of the Artifact Registry repository.</li> <li> <var translate="no">REGION</var> with the Google Cloud region to be used for the Artifact Registry repository.</li> </ul> <p><code translate="no" dir="ltr">pubsub</code> is the image name.</p> <p>Upon success, you should see a BUILD SUCCESS message. The image is stored in Artifact Registry and can be re-used if required.</p> </li> </ul> </section> <section> <h3 id="run_pubsub_build-dotnet" track-type="sampleTabNav" track-name="dotnet" track-metadata-position="run_pubsub_build" data-text=" C# " tabindex="-1"> C# </h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>builds<span class="devsite-syntax-w"> </span>submit<span class="devsite-syntax-w"> </span>--tag<span class="devsite-syntax-w"> </span><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub</pre></devsite-code> Replace: <ul> <li> <var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> <li> <var translate="no">REPOSITORY</var> with the name of the Artifact Registry repository.</li> <li> <var translate="no">REGION</var> with the Google Cloud region to be used for the Artifact Registry repository.</li> </ul> <p><code translate="no" dir="ltr">pubsub</code> is the image name.</p> <p>Upon success, you should see a SUCCESS message containing the ID, creation time, and image name. The image is stored in Artifact Registry and can be re-used if required.</p> </section> </div> </li> <li> <p>Deploy your application:</p> <div class="ds-selector-tabs" data-ds-scope="deploy-app"> <section> <h3 id="command-line" data-text="Command line" tabindex="-1">Command line</h3> <ol> <li> <p>Run the following command to deploy your app:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>run<span class="devsite-syntax-w"> </span>deploy<span class="devsite-syntax-w"> </span>pubsub-tutorial<span class="devsite-syntax-w"> </span>--image<span class="devsite-syntax-w"> </span><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub<span class="devsite-syntax-w"> </span>--no-allow-unauthenticated</pre></devsite-code> Replace: <ul> <li> <var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> <li> <var translate="no">REPOSITORY</var> with the name of the Artifact Registry repository.</li> <li> <var translate="no">REGION</var> with the Google Cloud region to be used for the Artifact Registry repository.</li> </ul> <p><code translate="no" dir="ltr">pubsub</code> is the image name and <code translate="no" dir="ltr">pubsub-tutorial</code> is the name of the service. Notice that the container image is deployed to the service and region that you configured previously under <a href="/run/docs/securing/managing-access">Setting up gcloud</a> </p> <p>The <code translate="no" dir="ltr">--no-allow-unauthenticated</code> flag restricts unauthenticated access to the service. By keeping the service private you can rely on Cloud Run's automatic Pub/Sub integration to authenticate requests. See <a href="#integrating-pubsub">Integrate with Pub/Sub</a> for more details on how this is configured. For more details about authentication that is based on Identity and Access Management (IAM), see <a href="/run/docs/securing/managing-access">Managing access using IAM</a>. </p> <p> Wait until the deployment is complete: this can take about half a minute. On success, the command line displays the service URL. This URL is used to configure a Pub/Sub subscription. </p> </li> <li> <p> If you want to deploy a code update to the service, repeat the previous steps. Each deployment to a service creates a new revision and automatically starts serving traffic when ready. </p> </li> </ol> </section> <section> <h3 id="terraform_1" data-text="Terraform" tabindex="-1">Terraform</h3> <p>To create a Cloud Run service, add the following to your existing <code translate="no" dir="ltr">.tf</code> file.</p> <p>Replace the value for <code translate="no" dir="ltr">image</code> with your image URL: <code translate="no" dir="ltr"><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub</code>.</p> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf/main/cloudrun_service_pubsub_service" data-code-snippet="true" data-github-includecode-link="https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf" feedback-context="{"language": "hcl", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf"}" feedback-product="1634365" feedback-bucket="serverless" language="hcl" data-github-path="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf" data-git-revision="main" data-region-tag="cloudrun_service_pubsub_service" dir="ltr" is-upgraded syntax="Terraform"><code translate="no" dir="ltr"><span class="devsite-syntax-kr">resource</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">"google_cloud_run_v2_service"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">"default"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"pubsub-tutorial"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">location</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"us-central1"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">deletion_protection</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-no">false</span><span class="devsite-syntax-c1"> # set to true to prevent destruction of the resource</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">template</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">containers</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">image</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"us-docker.pkg.dev/cloudrun/container/hello"</span><span class="devsite-syntax-c1"> # Replace with newly created image gcr.io/<project_id>/pubsub</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">depends_on</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-nv">google_project_service.cloudrun_api</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> </section> </div> </li> </ol> <h2 id="integrating-pubsub" data-text="Integrate with Pub/Sub" tabindex="-1">Integrate with Pub/Sub</h2> <aside class="special"><strong>Important:</strong><span> If your project was created on or before April 8, 2021, you must grant the <a href="/iam/docs/understanding-roles#iam.serviceAccountTokenCreator"><code translate="no" dir="ltr">iam.serviceAccountTokenCreator</code></a> role to the <a href="/iam/docs/service-agents">service agent</a> <code translate="no" dir="ltr">service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com</code> on the project in order to allow Pub/Sub to create tokens. However, if your project was created after that date, you do not need to grant it this role because it has the <a href="/iam/docs/understanding-roles#pubsub.serviceAgent"><code translate="no" dir="ltr">roles/pubsub.serviceAgent</code></a> role with identical permissions.</span></aside> <p>To integrate the service with Pub/Sub:</p> <div class="ds-selector-tabs" data-ds-scope="code-sample"> <section><h3 id="gcloud_1" data-text=" gcloud " tabindex="-1"> gcloud </h3><ol> <li><p>Create or select a service account to represent the Pub/Sub subscription identity.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>iam<span class="devsite-syntax-w"> </span>service-accounts<span class="devsite-syntax-w"> </span>create<span class="devsite-syntax-w"> </span><var translate="no">cloud-run-pubsub-invoker</var><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>--display-name<span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"<var translate="no">Cloud Run Pub/Sub Invoker</var>"</span></pre></devsite-code> <p>You can use <code translate="no" dir="ltr">cloud-run-pubsub-invoker</code> or replace with a name unique within your Google Cloud project.</p></li> <li><p>Create a Pub/Sub subscription with the service account:</p> <ol> <li><p>Give the invoker service account permission to invoke your <code translate="no" dir="ltr">pubsub-tutorial</code> service:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>run<span class="devsite-syntax-w"> </span>services<span class="devsite-syntax-w"> </span>add-iam-policy-binding<span class="devsite-syntax-w"> </span><var translate="no">pubsub-tutorial</var><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --member<span class="devsite-syntax-o">=</span>serviceAccount:<var translate="no">cloud-run-pubsub-invoker</var>@<var translate="no">PROJECT_ID</var>.iam.gserviceaccount.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --role<span class="devsite-syntax-o">=</span>roles/run.invoker</pre></devsite-code> <p>It can take several minutes for the IAM changes to propagate. In the meantime, you might see <code translate="no" dir="ltr">HTTP 403</code> errors in the service logs.</p></li> <li><p>Allow Pub/Sub to create authentication tokens in your project:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>projects<span class="devsite-syntax-w"> </span>add-iam-policy-binding<span class="devsite-syntax-w"> </span><var translate="no">PROJECT_ID</var><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>--member<span class="devsite-syntax-o">=</span>serviceAccount:service-<var translate="no">PROJECT_NUMBER</var>@gcp-sa-pubsub.iam.gserviceaccount.com<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>--role<span class="devsite-syntax-o">=</span>roles/iam.serviceAccountTokenCreator</pre></devsite-code> <p>Replace:</p> <ul> <li><var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> <li><var translate="no">PROJECT_NUMBER</var> with your Google Cloud project number.</li> </ul> <p>Project ID and project number are listed in the <em>Project info</em> panel in the <a href="https://console.cloud.google.com/">Google Cloud console</a> for your project.</p></li> <li><p>Create a Pub/Sub subscription with the service account:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>pubsub<span class="devsite-syntax-w"> </span>subscriptions<span class="devsite-syntax-w"> </span>create<span class="devsite-syntax-w"> </span>myRunSubscription<span class="devsite-syntax-w"> </span>--topic<span class="devsite-syntax-w"> </span><var translate="no">myRunTopic</var><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --ack-deadline<span class="devsite-syntax-o">=</span><span class="devsite-syntax-m">600</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --push-endpoint<span class="devsite-syntax-o">=</span><var translate="no">SERVICE-URL</var>/<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> --push-auth-service-account<span class="devsite-syntax-o">=</span><var translate="no">cloud-run-pubsub-invoker</var>@<var translate="no">PROJECT_ID</var>.iam.gserviceaccount.com</pre></devsite-code> <p>Replace:</p> <ul> <li><var translate="no">myRunTopic</var> with the topic you <a href="#creating-topic">previously created</a>.</li> <li><var translate="no">SERVICE-URL</var> with the HTTPS URL provided on deploying the service. This URL works even if you have also <a href="/run/docs/mapping-custom-domains">added a domain mapping</a>.</li> <li><var translate="no">PROJECT_ID</var> with your Google Cloud project ID.</li> </ul> <p>The <code translate="no" dir="ltr">--push-auth-service-account</code> flag activates the Pub/Sub push functionality for <a href="/pubsub/docs/authenticate-push-subscriptions">Authentication and authorization</a>.</p> <p>Your Cloud Run service domain is automatically registered for use with Pub/Sub subscriptions.</p> <p>For Cloud Run only, there is a built-in authentication check that the token is valid and an authorization check that the service account has permission to invoke the Cloud Run service.</p></li> </ol></li> </ol> <p>Your service is now fully integrated with Pub/Sub.</p></section> <section><h3 id="terraform_2" data-text="Terraform" tabindex="-1">Terraform</h3><ol> <li><p>Create or select a service account to represent the Pub/Sub subscription identity.</p> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf/main/cloudrun_service_pubsub_sa" data-code-snippet="true" data-github-includecode-link="https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf" feedback-context="{"language": "hcl", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf"}" feedback-product="1634365" feedback-bucket="serverless" language="hcl" data-github-path="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf" data-git-revision="main" data-region-tag="cloudrun_service_pubsub_sa" dir="ltr" is-upgraded syntax="Terraform"><code translate="no" dir="ltr"><span class="devsite-syntax-kr">resource</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">"google_service_account"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">"sa"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">account_id</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"cloud-run-pubsub-invoker"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">display_name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"Cloud Run Pub/Sub Invoker"</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> </li> <li><p>Create a Pub/Sub subscription with the service account:</p> <ol> <li><p>Give the invoker service account permission to invoke your <code translate="no" dir="ltr">pubsub-tutorial</code> service:</p> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf/main/cloudrun_service_pubsub_run_invoke_permissions" data-code-snippet="true" data-github-includecode-link="https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf" feedback-context="{"language": "hcl", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf"}" feedback-product="1634365" feedback-bucket="serverless" language="hcl" data-github-path="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf" data-git-revision="main" data-region-tag="cloudrun_service_pubsub_run_invoke_permissions" dir="ltr" is-upgraded syntax="Terraform"><code translate="no" dir="ltr"><span class="devsite-syntax-kr">resource</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">"google_cloud_run_service_iam_binding"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">"binding"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">location</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">google_cloud_run_v2_service.default.location</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">service</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">google_cloud_run_v2_service.default.name</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">role</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"roles/run.invoker"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">members</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"serviceAccount:${google_service_account.sa.email}"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> </li> <li><p>Allow Pub/Sub to create authentication tokens in your project:</p> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf/main/cloudrun_service_pubsub_token_permissions" data-code-snippet="true" data-github-includecode-link="https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf" feedback-context="{"language": "hcl", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf"}" feedback-product="1634365" feedback-bucket="serverless" language="hcl" data-github-path="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf" data-git-revision="main" data-region-tag="cloudrun_service_pubsub_token_permissions" dir="ltr" is-upgraded syntax="Terraform"><code translate="no" dir="ltr"><span class="devsite-syntax-kr">resource</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">"google_project_service_identity"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">"pubsub_agent"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">provider</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-err">google-beta</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">project</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">data.google_project.project.project_id</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">service</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"pubsub.googleapis.com"</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-kr">resource</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">"google_project_iam_binding"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">"project_token_creator"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">project</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">data.google_project.project.project_id</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">role</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"roles/iam.serviceAccountTokenCreator"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">members</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"serviceAccount:${google_project_service_identity.pubsub_agent.email}"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> </li> <li><p>Create a Pub/Sub subscription with the service account:</p> <div class="github-docwidget-gitinclude-code"> <div></div><devsite-code><pre suppresswarning="suppresswarning" translate="no" class="devsite-click-to-copy" track-metadata-position="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf/main/cloudrun_service_pubsub_sub" data-code-snippet="true" data-github-includecode-link="https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf" feedback-context="{"language": "hcl", "region_tag": "cloudrun_service_pubsub_topic", "snippet_file_url": "https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/run/pubsub/main.tf"}" feedback-product="1634365" feedback-bucket="serverless" language="hcl" data-github-path="terraform-google-modules/terraform-docs-samples/run/pubsub/main.tf" data-git-revision="main" data-region-tag="cloudrun_service_pubsub_sub" dir="ltr" is-upgraded syntax="Terraform"><code translate="no" dir="ltr"><span class="devsite-syntax-kr">resource</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">"google_pubsub_subscription"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">"subscription"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">name</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"pubsub_subscription"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">topic</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">google_pubsub_topic.default.name</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">push_config</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">push_endpoint</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">google_cloud_run_v2_service.default.uri</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">oidc_token</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">service_account_email</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">google_service_account.sa.email</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">attributes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">x-goog-version</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"v1"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-na">depends_on</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-nv">google_cloud_run_v2_service.default</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">}</span></code></pre></devsite-code> </div> </li> </ol></li> </ol> <p>Your service is now fully integrated with Pub/Sub.</p></section> </div> <h2 id="try_it_out" data-text="Try it out" tabindex="-1">Try it out</h2> <p>To test the end-to-end solution:</p> <ol> <li><p>Send a Pub/Sub message to the topic:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>pubsub<span class="devsite-syntax-w"> </span>topics<span class="devsite-syntax-w"> </span>publish<span class="devsite-syntax-w"> </span><var translate="no">myRunTopic</var><span class="devsite-syntax-w"> </span>--message<span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"Runner"</span></pre></devsite-code> <p>You can also publish messages programmatically instead of using the command-line as shown in this tutorial. For more information, see <a href="/pubsub/docs/publisher">Publishing messages</a>.</p></li> <li><p>Navigate to the service logs:</p> <ol> <li>Navigate to the <a href="https://console.cloud.google.com/run">Google Cloud console</a></li> <li>Click the <code translate="no" dir="ltr">pubsub-tutorial</code> service.</li> <li><p>Select the <strong>Logs</strong> tab.</p> <p>Logs might take a few moments to appear. If you don't see them immediately, check again after a few moments.</p></li> </ol></li> <li><p>Look for the "Hello Runner!" message.</p></li> </ol> </section> </div> <section id="cleanup"> <h2 id="clean-up" data-text="Clean up" tabindex="-1">Clean up</h2> <p>To walk through a more in-depth use case of using Cloud Run with Pub/Sub, skip cleanup for now and continue with the <a href="/run/docs/tutorials/image-processing">Image Processing with Cloud Run tutorial</a>.</p> <p>If you created a new project for this tutorial, <a href="#delete-project">delete the project</a>. If you used an existing project and wish to keep it without the changes added in this tutorial, <a href="#delete-resources">delete resources created for the tutorial</a>.</p> <h3 id="delete-project" data-text="Deleting the project" tabindex="-1">Deleting the project</h3> <p> <p> The easiest way to eliminate billing is to delete the project that you created for the tutorial. </p> <p>To delete the project: <ol> <aside class="caution"> <strong>Caution</strong>: Deleting a project has the following effects: <ul> <li> <strong>Everything in the project is deleted.</strong> If you used an existing project for the tasks in this document, when you delete it, you also delete any other work you've done in the project. </li> <li> <strong>Custom project IDs are lost.</strong> When you created this project, you might have created a custom project ID that you want to use in the future. To preserve the URLs that use the project ID, such as an <code translate="no" dir="ltr">appspot.com</code> URL, delete selected resources inside the project instead of deleting the whole project. </li> </ul> <p> If you plan to explore multiple architectures, tutorials, or quickstarts, reusing projects can help you avoid exceeding project quota limits. </p> </aside> <li> In the Google Cloud console, go to the <b>Manage resources</b> page. <p><a href="https://console.cloud.google.com/iam-admin/projects" target="console" track-type="commonIncludes" track-name="consoleLink" track-metadata-end-goal="deleteProject" class="button button-primary">Go to Manage resources</a></p> </li> <li> In the project list, select the project that you want to delete, and then click <b>Delete</b>. </li> <li> In the dialog, type the project ID, and then click <b>Shut down</b> to delete the project. </li> </ol> </p> </p> <h3 id="delete-resources" data-text="Deleting tutorial resources" tabindex="-1">Deleting tutorial resources</h3> <ol> <li><p>Delete the Cloud Run service you deployed in this tutorial:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash">gcloud<span class="devsite-syntax-w"> </span>run<span class="devsite-syntax-w"> </span>services<span class="devsite-syntax-w"> </span>delete<span class="devsite-syntax-w"> </span><var translate="no">SERVICE-NAME</var></pre></devsite-code> <p>Where <var translate="no">SERVICE-NAME</var> is your chosen service name.</p> <p>You can also delete Cloud Run services from the <a href="https://console.cloud.google.com/run">Google Cloud console</a>.</p></li> <li><p>Remove the gcloud default region configuration you added during tutorial setup:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="verilog"><code translate="no" dir="ltr"><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">gcloud</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">config</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">unset</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">run</span><span class="devsite-syntax-o">/</span><span class="devsite-syntax-n">region</span> </code></pre></devsite-code></li> <li><p>Remove the project configuration:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr"> gcloud config unset project </code></pre></devsite-code></li> <li><p>Delete other Google Cloud resources created in this tutorial:</p> <ul> <li><a href="/pubsub/docs/create-topic#pubsub_delete_topic-gcloud">Delete the Pub/Sub topic <code translate="no" dir="ltr">myRunTopic</code></a></li> <li><a href="/pubsub/docs/delete-subscriptions">Delete the Pub/Sub subscription <code translate="no" dir="ltr">myRunSubscription</code></a></li> <li><a href="/container-registry/docs/managing#deleting_images">Delete your container image</a> named <code translate="no" dir="ltr"><var translate="no">REGION</var>-docker.pkg.dev/<var translate="no">PROJECT_ID</var>/<var translate="no">REPOSITORY</var>/pubsub</code> from Artifact Registry.</li> <li><a href="/iam/docs/creating-managing-service-accounts#deleting">Delete the invoker service account <code translate="no" dir="ltr">cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com</code></a></li> </ul></li> </ol> </section> <section id="whatsnext"> <h2 id="whats-next" data-text="What's next" tabindex="-1">What's next</h2> <ul> <li>See <a href="/run/docs/securing/ingress">Restricting ingress</a> for information on increasing production security by using internal ingress controls to limit ingress.</li> <li>Expand the sample service deployed in this tutorial to add <a href="/run/docs/tutorials/image-processing">image processing functionality that modifies images uploaded to Cloud Storage</a>.</li> <li>Learn more about how topics fit into <a href="/pubsub/docs/overview">Pub/Sub architecture</a> and how to <a href="/pubsub/docs/admin#managing_topics">manage topics</a></li> <li>Learn more about Pub/Sub subscriptions in <a href="/pubsub/docs/admin#manage_subs">managing subscriptions</a>.</li> <li> Explore reference architectures, diagrams, and best practices about Google Cloud. Take a look at our <a href="/architecture" track-type="tutorial" track-name="textLink" track-metadata-position="nextSteps">Cloud Architecture Center</a>. </li> </ul> </section> <section id="freetrial"> </section> </div> <devsite-hats-survey class="nocontent" hats-id="mwETRvWii0eU5NUYprb0Y9z5GVbc" listnr-id="83405"></devsite-hats-survey> </div> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-feedback position="footer" project-name="Cloud Run Documentation" product-id="97037" bucket="Documentation" context="" version="t-devsite-webserver-20250211-r00-rc00.466928320959134316" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="footer" class="nocontent" project-feedback-url="https://issuetracker.google.com/issues/new?component=608076" project-icon="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/favicons/onecloud/super_cloud.png" > <button> Send feedback </button> </devsite-feedback> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Except as otherwise noted, the content of this page is licensed under the <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a>, and code samples are licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 License</a>. For details, see the <a href="https://developers.google.com/site-policies">Google Developers Site Policies</a>. Java is a registered trademark of Oracle and/or its affiliates.</p> <p>Last updated 2025-02-14 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-thumb-rating-feedback"> <devsite-feedback position="thumb-rating" project-name="Cloud Run Documentation" product-id="97037" bucket="Documentation" context="" version="t-devsite-webserver-20250211-r00-rc00.466928320959134316" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="thumb-rating" class="nocontent" project-feedback-url="https://issuetracker.google.com/issues/new?component=608076" project-icon="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/favicons/onecloud/super_cloud.png" > <button> Need to tell us more? </button> </devsite-feedback> </template> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-02-14 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Why Google</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/why-google-cloud/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" track-type="footer link"track-name="choosing google cloud"track-metadata-position="footer"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/why-google-cloud/"track-metadata-child_headline="why google"> Choosing Google Cloud </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/trust-center/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" track-metadata-child_headline="why google"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/security/"track-name="trust and security"track-type="footer link"track-metadata-position="footer"> Trust and security </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/modern-infrastructure/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" track-metadata-child_headline="why google"track-type="footer link"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/solutions/modern-infrastructure/"track-name="modern infrastructure cloud"track-metadata-position="footer"> Modern Infrastructure Cloud </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/multicloud/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" track-type="footer link"track-name="multicloud"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/multicloud/"track-metadata-child_headline="why google"track-metadata-position="footer"> Multicloud </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/infrastructure/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/infrastructure/"track-type="footer link"track-metadata-child_headline="why google"track-metadata-position="footer"track-name="global infrastructure"> Global infrastructure </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/customers/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" track-name="customers and case studies"track-metadata-eventDetail="cloud.google.com/customers/"track-metadata-position="footer"track-metadata-module="footer"track-metadata-child_headline="why google"track-type="footer link"> Customers and case studies </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/analyst-reports/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" track-metadata-position="footer"track-metadata-child_headline="why google"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/analyst-reports/"track-type="footer link"track-name="analyst reports"> Analyst reports </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/whitepapers/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 8)" track-metadata-position="footer"track-metadata-eventDetail="cloud.google.com/whitepapers/"track-metadata-module="footer"track-metadata-child_headline="why google"track-name="whitepapers"track-type="footer link"> Whitepapers </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//cloud.google.com/blog/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 9)" track-metadata-eventDetail="cloud.google.com/blog/"track-metadata-module="footer"track-metadata-position="footer"track-metadata-child_headline="engage"track-name="blog"track-type="footer link"> Blog </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Products and pricing</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/pricing/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" track-type="footer link"track-name="google cloud pricing"track-metadata-eventDetail="cloud.google.com/pricing/"track-metadata-module="footer"track-metadata-child_headline="products and pricing"track-metadata-position="footer"> Google Cloud pricing </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//workspace.google.com/pricing.html" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" track-type="footer link"track-metadata-module="footer"track-metadata-eventDetail="workspace.google.com/pricing.html"target="_blank"track-name="google workspace pricing"track-metadata-position="footer"track-metadata-child_headline="products and pricing"> Google Workspace pricing </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/products/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" track-metadata-eventDetail="cloud.google.com/products/"track-metadata-module="footer"track-type="footer link"track-name="see all products"track-metadata-position="footer"track-metadata-child_headline="products and pricing"> See all products </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Solutions</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/solutions/infrastructure-modernization/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" track-metadata-eventDetail="cloud.google.com/solutions/infrastructure-modernization/"track-metadata-module="footer"track-name="infrastructure modernization"track-type="footer link"track-metadata-child_headline="solutions"track-metadata-position="footer"> Infrastructure modernization </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/databases/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" track-type="footer link"track-name="databases"track-metadata-position="footer"track-metadata-child_headline="solutions"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/solutions/databases"> Databases </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/application-modernization/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" track-metadata-position="footer"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/solutions/application-modernization/"track-type="footer link"track-name="application development"track-metadata-child_headline="solutions"> Application modernization </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/smart-analytics/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" track-type="footer link"track-metadata-eventDetail="cloud.google.com/solutions/smart-analytics/"track-name="smart analytics"track-metadata-child_headline="solutions"track-metadata-module="footer"track-metadata-position="footer"> Smart analytics </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/ai/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" track-type="footer link"track-name="artificial intelligence"track-metadata-child_headline="solutions"track-metadata-position="footer"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/solutions/ai/"> Artificial Intelligence </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/security/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" track-metadata-module="footer"track-name="security"track-metadata-child_headline="solutions"track-metadata-position="footer"track-metadata-eventDetail="cloud.google.com/solutions/security/"track-type="footer link"> Security </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://workspace.google.com/enterprise/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" track-metadata-eventDetail="workspace.google.com/enterprise/"track-metadata-module="footer"track-name="productivity and work transformation"target="_blank"track-metadata-child_headline="solutions"track-metadata-position="footer"track-type="footer link"> Productivity & work transformation </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/#industry-solutions" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 8)" track-metadata-child_headline="solutions"track-metadata-position="footer"track-metadata-eventDetail="cloud.google.com/solutions/#industry-solutions"track-metadata-module="footer"track-type="footer link"track-name="industry solutions"> Industry solutions </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/devops/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 9)" track-type="footer link"track-metadata-eventDetail="cloud.google.com/solutions/devops/"track-metadata-module="footer"track-metadata-child_headline="solutions"track-metadata-position="footer"track-name="devops solutions"> DevOps solutions </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/#section-14" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 10)" track-metadata-position="footer"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/solutions/#section-14"track-type="footer link"track-name="small business solutions"track-metadata-child_headline="solutions"> Small business solutions </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/solutions/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 11)" track-name="see all solutions"track-metadata-child_headline="solutions"track-metadata-module="footer"track-metadata-position="footer"track-type="footer link"track-metadata-eventDetail="cloud.google.com/solutions/"> See all solutions </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Resources</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/affiliate-program/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" track-metadata-module="footer"track-metadata-position="footer"track-metadata-child_headline="resources"track-name="google cloud affiliate program"track-metadata-eventDetail="cloud.google.com/affiliate-program/"track-type="footer link"> Google Cloud Affiliate Program </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/docs/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" track-metadata-child_headline="resources"track-metadata-position="footer"track-metadata-module="footer"track-name="google cloud documentation"track-metadata-eventDetail="cloud.google.com/docs/"track-type="footer link"> Google Cloud documentation </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/docs/get-started/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" track-metadata-eventDetail="cloud.google.com/docs/get-started/"track-metadata-child_headline="resources"track-metadata-position="footer"track-type="footer link"track-name="google cloud quickstarts"track-metadata-module="footer"> Google Cloud quickstarts </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/marketplace/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" track-name="google cloud marketplace"track-metadata-eventDetail="cloud.google.com/marketplace/"track-type="footer link"track-metadata-child_headline="resources"track-metadata-position="footer"track-metadata-module="footer"> Google Cloud Marketplace </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/discover/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" track-type="footer link"track-metadata-eventDetail="learn/"track-metadata-module="footer"track-metadata-child_headline="resources"track-metadata-position="footer"track-name="learn about cloud computing"> Learn about cloud computing </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/support-hub/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" track-metadata-eventDetail="cloud.google.com/support-hub/"track-metadata-child_headline="resources"track-metadata-position="footer"track-type="footer link"track-metadata-module="footer"track-name="support"> Support </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/docs/samples" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/docs/samples"track-name="code samples"track-metadata-child_headline="resources"track-metadata-position="footer"track-type="footer link"> Code samples </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/architecture/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 8)" track-name="cloud architecture center"track-metadata-child_headline="resources"track-metadata-position="footer"track-metadata-eventDetail="cloud.google.com/architecture/"track-type="footer link"track-metadata-module="footer"> Cloud Architecture Center </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/learn/training/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 9)" track-metadata-position="footer"track-type="footer link"track-metadata-eventDetail="cloud.google.com/training/"track-metadata-module="footer"track-metadata-child_headline="resources"track-name="training"> Training </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/learn/certification/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 10)" track-name="certifications"track-type="footer link"track-metadata-module="footer"track-metadata-child_headline="resources"track-metadata-eventDetail="cloud.google.com/certification"track-metadata-position="footer"> Certifications </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//developers.google.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 11)" track-metadata-eventDetail="developers.google.com"track-metadata-module="footer"target="_blank"track-type="footer link"track-name="google developers"track-metadata-child_headline="resources"track-metadata-position="footer"> Google for Developers </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/startup/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 12)" track-metadata-position="footer"track-type="footer link"track-name="google cloud for startups"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/startup/"track-metadata-child_headline="resources"> Google Cloud for Startups </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//status.cloud.google.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 13)" track-name="system status"track-metadata-position="footer"track-metadata-module="footer"track-metadata-child_headline="resources"track-metadata-eventDetail="status.cloud.google.com"target="_blank"track-type="footer link"> System status </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/release-notes" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 14)" track-metadata-eventDetail="cloud.google.com/release-notes/"track-metadata-module="footer"track-type="footer link"track-metadata-position="footer"track-name="release notes"track-metadata-child_headline="resources"> Release Notes </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Engage</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/contact/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" track-name="contact sales"track-metadata-eventDetail="cloud.google.com/contact/"track-metadata-module="footer"track-metadata-child_headline="engage"track-metadata-position="footer"track-type="footer link"> Contact sales </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//cloud.google.com/find-a-partner" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" track-metadata-child_headline="engage"track-metadata-module="footer"track-metadata-position="footer"target="_blank"track-type="footer link"track-metadata-eventDetail="cloud.google.com/find-a-partner"track-name="find a partner"> Find a Partner </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/partners/become-a-partner/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" track-type="footer link"track-name="become a partner"track-metadata-child_headline="engage"track-metadata-position="footer"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/partners/become-a-partner/"> Become a Partner </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/events/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" track-type="footer link"track-name="events"track-metadata-child_headline="engage"track-metadata-position="footer"track-metadata-eventDetail="cloud.withgoogle.com/events"track-metadata-module="footer"> Events </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/podcasts/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" track-type="footer link"target="_blank"rel="noopener"track-name="podcasts"track-metadata-position="footer"track-metadata-child_headline="engage"track-metadata-module="footer"track-metadata-eventDetail="cloud.google.com/podcasts/"> Podcasts </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/developers/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" track-metadata-eventDetail="cloud.google.com/developers/"track-metadata-child_headline="engage"track-metadata-position="footer"track-type="footer link"track-metadata-module="footer"track-name="developer center"> Developer Center </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://www.googlecloudpresscorner.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" track-metadata-module="footer"target="_blank"track-name="press corner"rel="noopener"track-metadata-position="footer"track-metadata-child_headline="engage"track-type="footer link"track-metadata-eventDetail="www.googlecloudpresscorner.com"> Press Corner </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.youtube.com/googlecloud" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 8)" track-metadata-eventDetail="www.youtube.com/googlecloud"target="_blank"rel="noopener"track-name="google cloud on youtube"track-type="footer link"track-metadata-module="footer"track-metadata-child_headline="engage"track-metadata-position="footer"> Google Cloud on YouTube </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.youtube.com/googlecloudplatform" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 9)" rel="noopener"track-metadata-eventDetail="www.youtube.com/googlecloudplatform"track-metadata-child_headline="engage"track-type="footer link"track-metadata-position="footer"track-metadata-module="footer"target="_blank"track-name="google cloud tech on youtube"> Google Cloud Tech on YouTube </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//x.com/googlecloud" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 10)" rel="noopener"track-metadata-module="footer"track-metadata-child_headline="engage"track-type="footer link"track-metadata-position="footer"track-name="follow on x"target="_blank"track-metadata-eventDetail="x.com/googlecloud"> Follow on X </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//userresearch.google.com/?reserved=1&utm_source=website&Q_Language=en&utm_medium=own_srch&utm_campaign=CloudWebFooter&utm_term=0&utm_content=0&productTag=clou&campaignDate=jul19&pType=devel&referral_code=jk212693" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 11)" track-metadata-eventDetail="userresearch.google.com/?reserved=1&utm_source=website&Q_Language=en&utm_medium=own_srch&utm_campaign=CloudWebFooter&utm_term=0&utm_content=0&productTag=clou&campaignDate=jul19&pType=devel&referral_code=jk212693"track-metadata-child_headline="engage"track-metadata-position="footer"track-metadata-module="footer"target="_blank"track-type="footer link"track-name="join user research"> Join User Research </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//careers.google.com/cloud" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 12)" track-metadata-eventDetail="careers.google.com/cloud"track-metadata-position="footer"track-metadata-child_headline="engage"track-type="footer link"target="_blank"track-name="we are hiring join google cloud"track-metadata-module="footer"> We're hiring. Join Google Cloud! </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://www.googlecloudcommunity.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 13)" track-metadata-eventDetail="www.googlecloudcommunity.com"track-name="google cloud community"track-metadata-position="footer"track-metadata-module="footer"track-metadata-child_headline="engage"rel="noopener"target="_blank"track-type="footer link"> Google Cloud Community </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//about.google/" data-category="Site-Wide Custom Events" data-label="Footer About Google link" target="_blank" track-name="about google" track-metadata-position="footer" track-type="footer link" track-metadata-module="utility footer" track-metadata-eventDetail="//about.google/" > About Google </a> </li> <li class="devsite-footer-utility-item devsite-footer-privacy-link"> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" track-metadata-position="footer" track-metadata-eventDetail="//policies.google.com/privacy" track-type="footer link" track-metadata-module="utility footer" target="_blank" track-name="privacy" > Privacy </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//www.google.com/intl/en/policies/terms/regional.html" data-category="Site-Wide Custom Events" data-label="Footer Site terms link" track-metadata-module="utility footer" target="_blank" track-name="site terms" track-metadata-position="footer" track-metadata-eventDetail="//www.google.com/intl/en/policies/terms/regional.html" track-type="footer link" > Site terms </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/product-terms/" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud terms link" track-type="footer link" track-name="google cloud terms" track-metadata-position="footer" track-metadata-eventDetail="/product-terms/" track-metadata-module="utility footer" > Google Cloud terms </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" track-metadata-eventDetail="#" aria-hidden="true" track-metadata-module="utility footer" track-type="footer link" track-name="Manage cookies" track-metadata-position="footer" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-carbon-button"> <a class="devsite-footer-utility-link gc-analytics-event" href="/sustainability" data-category="Site-Wide Custom Events" data-label="Footer Our third decade of climate action: join us link" track-type="footer link" track-metadata-module="utility footer" track-metadata-eventDetail="/sustainability/" track-name="Our third decade of climate action: join us" track-metadata-position="footer" > Our third decade of climate action: join us </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Sign up for the Google Cloud newsletter</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/newsletter/" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" track-name="subscribe" track-metadata-eventDetail="/newsletter/" track-metadata-module="utility footer" track-metadata-position="footer" track-type="footer link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [], "ga4p": [], "gtm": [{"id": "GTM-5CVQBG", "purpose": 1}], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "article", "projectName": "Cloud Run Documentation", "signedIn": "False", "tenant": "cloud", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <cloudx-user></cloudx-user> <cloudx-free-trial-eligible-store freeTrialEligible='true'></cloudx-free-trial-eligible-store> <cloudx-pricing-socket></cloudx-pricing-socket> <cloudx-experiments type="TestAACodivertedExperiment" path="/virtual/TestAACodivertedExperiment/configureExperiment" location="SG" variant="variant2" ></cloudx-experiments> <cloudx-experiment-ids userCountry="SG" devsiteExperimentIdList="[39300012, 39300020, 39300118, 39300192, 39300195, 39300241, 39300317, 39300320, 39300325, 39300345, 39300354, 39300363, 39300373, 39300412, 39300421, 39300436, 39300472, 39300487, 39300496, 39300498, 39300569]"> </cloudx-experiment-ids> <script nonce="nsOZLRq6TpbF3wj/JvRZX+e7iIGIdV"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/js/app_loader.js', '[2,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud","https://cloud-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/cloud/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/favicons/onecloud/favicon.ico","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/cloud/images/cloud-logo.svg","https://fonts.googleapis.com/css?family=Google+Sans:400,500,700|Google+Sans+Text:400,400italic,500,500italic,700,700italic|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","cloud.google.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["EngEduTelemetry__enable_engedu_telemetry","DevPro__enable_developer_subscriptions","Profiles__enable_profile_collections","Cloud__enable_legacy_calculator_redirect","MiscFeatureFlags__enable_firebase_utm","Experiments__reqs_query_experiments","Profiles__enable_completecodelab_endpoint","Search__enable_ai_search_summaries","Profiles__require_profile_eligibility_for_signin","MiscFeatureFlags__emergency_css","Search__enable_suggestions_from_borg","Search__enable_ai_eligibility_checks","Analytics__enable_clearcut_logging","Search__enable_dynamic_content_confidential_banner","Cloud__enable_free_trial_server_call","MiscFeatureFlags__developers_footer_image","MiscFeatureFlags__enable_view_transitions","MiscFeatureFlags__enable_explain_this_code","Profiles__enable_recognition_badges","Profiles__enable_dashboard_curated_recommendations","Cloud__enable_cloud_shell","Concierge__enable_concierge_restricted","Search__enable_page_map","Profiles__enable_awarding_url","Profiles__enable_join_program_group_endpoint","MiscFeatureFlags__enable_variable_operator","BookNav__enable_tenant_cache_key","MiscFeatureFlags__enable_project_variables","MiscFeatureFlags__developers_footer_dark_image","Profiles__enable_release_notes_notifications","Profiles__enable_complete_playlist_endpoint","Cloud__enable_cloudx_ping","Profiles__enable_stripe_subscription_management","CloudShell__cloud_shell_button","TpcFeatures__enable_mirror_tenant_redirects","Profiles__enable_developer_profiles_callout","Profiles__enable_public_developer_profiles","Concierge__enable_pushui","Cloud__enable_llm_concierge_chat","Cloud__enable_cloud_facet_chat","Cloud__enable_cloud_shell_fte_user_flow","CloudShell__cloud_code_overflow_menu","TpcFeatures__enable_unmirrored_page_left_nav","DevPro__enable_cloud_innovators_plus","Cloud__enable_cloudx_experiment_ids","Search__scope_to_project_tenant","Profiles__enable_page_saving","Cloud__enable_cloud_dlp_service","Profiles__enable_completequiz_endpoint","Search__enable_ai_search_summaries_restricted"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.clients6.google.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.clients6.google.com",1,4,1,"https://developerprofiles-pa.clients6.google.com",[2,"cloud","Google Cloud","cloud.google.com",null,"cloud-dot-devsite-v2-prod.appspot.com",null,null,[1,1,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,1,[1],[null,null,null,[1,20],"/terms/recommendations"],[1],null,[1],[1,null,1],[1,1,null,null,1,null,["/vertex-ai/"]]],null,[22,null,null,null,null,null,"/images/cloud-logo.svg","/images/favicons/onecloud/apple-icon.png",null,null,null,null,1,1,1,[6,5],[],null,null,[[],[],[],[],[],[],[],[]],null,1,null,null,null,null,[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,22,23,29,37],null,[[null,null,null,null,null,null,[1,[["docType","Choose a content type",[["ApiReference",null,null,null,null,null,null,null,null,"API reference"],["Sample",null,null,null,null,null,null,null,null,"Code sample"],["ReferenceArchitecture",null,null,null,null,null,null,null,null,"Reference architecture"],["Tutorial",null,null,null,null,null,null,null,null,"Tutorial"]]],["category","Choose a topic",[["AiAndMachineLearning",null,null,null,null,null,null,null,null,"Artificial intelligence and machine learning (AI/ML)"],["ApplicationDevelopment",null,null,null,null,null,null,null,null,"Application development"],["BigDataAndAnalytics",null,null,null,null,null,null,null,null,"Big data and analytics"],["Compute",null,null,null,null,null,null,null,null,"Compute"],["Containers",null,null,null,null,null,null,null,null,"Containers"],["Databases",null,null,null,null,null,null,null,null,"Databases"],["HybridCloud",null,null,null,null,null,null,null,null,"Hybrid and multicloud"],["LoggingAndMonitoring",null,null,null,null,null,null,null,null,"Logging and monitoring"],["Migrations",null,null,null,null,null,null,null,null,"Migrations"],["Networking",null,null,null,null,null,null,null,null,"Networking"],["SecurityAndCompliance",null,null,null,null,null,null,null,null,"Security and compliance"],["Serverless",null,null,null,null,null,null,null,null,"Serverless"],["Storage",null,null,null,null,null,null,null,null,"Storage"]]]]]],[1],null,1],[[null,null,null,null,null,["GTM-5CVQBG"],null,null,null,null,null,[["GTM-5CVQBG",2]],1],null,null,null,null,null,1],"mwETRvWii0eU5NUYprb0Y9z5GVbc",4,null,null,null,null,null,null,null,null,null,null,null,null,null,"cloud.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m",1]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>