Quickstart: Deploy a Cloud Run function using the gcloud CLI
This page shows you how to deploy an HTTP Cloud Run function using the gcloud CLI.
Before you begin
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get 300ドル in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloudinit
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run Admin API, and Cloud Logging APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloudservicesenableartifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com logging.googleapis.com -
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/run.sourceDeveloper, roles/run.admin, roles/logging.viewergcloudprojectsadd-iam-policy-bindingPROJECT_ID--member="user:USER_IDENTIFIER"--role=ROLE
Replace the following:
PROJECT_ID: Your project ID.USER_IDENTIFIER: The identifier for your user account. For example,myemail@example.com.ROLE: The IAM role that you grant to your user account.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloudinit
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run Admin API, and Cloud Logging APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloudservicesenableartifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com logging.googleapis.com -
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/run.sourceDeveloper, roles/run.admin, roles/logging.viewergcloudprojectsadd-iam-policy-bindingPROJECT_ID--member="user:USER_IDENTIFIER"--role=ROLE
Replace the following:
PROJECT_ID: Your project ID.USER_IDENTIFIER: The identifier for your user account. For example,myemail@example.com.ROLE: The IAM role that you grant to your user account.
- To set the default project for your Cloud Run service:
Replace PROJECT_ID with the name of the project you created for this quickstart.gcloudconfigsetprojectPROJECT_ID If you are under a domain restriction organization policy restricting unauthenticated invocations for your project, you will need to access your deployed service as described under Testing private services.
-
Make sure that you have the Service Account User role granted on the service identity. By default, the service identity is the Compute Engine default service account.
Grant the roles
To grant access on the service identity resource, use the
gcloud iam service-accounts add-iam-policy-bindingcommand, replacing the highlighted variables with the appropriate values:gcloudiamservice-accountsadd-iam-policy-bindingSERVICE_ACCOUNT_EMAIL\ --member=user:PRINCIPAL\ --role=roles/iam.serviceAccountUser
Replace the following:
- SERVICE_ACCOUNT_EMAIL: the service account email address
you are using as the service identity, such as:
- The Compute Engine default service account:
PROJECT_NUMBER-compute@developer.gserviceaccount.com - A service account that you created:
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
- The Compute Engine default service account:
- PRINCIPAL: the user identifier. This is typically the email address that is deploying the Cloud Run resource.
- SERVICE_ACCOUNT_EMAIL: the service account email address
you are using as the service identity, such as:
- Grant the Cloud Build service account the following IAM role.
Click to view required roles for the Cloud Build service account
Cloud Build automatically uses the Compute Engine default service account as the default Cloud Build service account to build your source code and Cloud Run resource, unless you override this behavior. For Cloud Build to build your sources, ask your administrator to grant Cloud Run Builder (
roles/run.builder) to the Compute Engine default service account on your project:gcloudprojectsadd-iam-policy-bindingPROJECT_ID\ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com\ --role=roles/run.builder
Replace
PROJECT_NUMBERwith your Google Cloud project number, andPROJECT_IDwith your Google Cloud project ID. For detailed instructions on how to find your project ID, and project number, see Creating and managing projects.Granting the Cloud Run builder role to the Compute Engine default service account takes a couple of minutes to propagate.
- Review Cloud Run pricing or estimate costs with the pricing calculator.
Write the sample function
To write an application, follow these steps:
Node.js
Create a new directory named
helloworldand change directory into it:mkdir helloworld cd helloworldCreate a
package.jsonfile in thehelloworlddirectory to specify Node.js dependencies:{ "name":"nodejs-docs-samples-functions-hello-world-get", "version":"0.0.1", "private":true, "license":"Apache-2.0", "author":"Google Inc.", "repository":{ "type":"git", "url":"https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git" }, "engines":{ "node":">=16.0.0" }, "scripts":{ "test":"c8 mocha -p -j 2 test/*.test.js --timeout=6000 --exit" }, "dependencies":{ "@google-cloud/functions-framework":"^3.1.0" }, "devDependencies":{ "c8":"^10.0.0", "gaxios":"^6.0.0", "mocha":"^10.0.0", "wait-port":"^1.0.4" } }Create an
index.jsfile in thehelloworlddirectory with the following Node.js sample:constfunctions=require('@google-cloud/functions-framework'); // Register an HTTP function with the Functions Framework that will be executed // when you make an HTTP request to the deployed function's endpoint. functions.http('helloGET',(req,res)=>{ res.send('Hello World!'); });
Python
Create a new directory named
helloworldand change directory into it:mkdir helloworld cd helloworldCreate a
requirements.txtfile in thehelloworlddirectory, to specify Python dependencies:functions-framework==3.9.2 flask==3.0.3 google-cloud-error-reporting==1.11.1 MarkupSafe==2.1.3This adds packages needed by the sample.
Create a
main.pyfile in thehelloworlddirectory with the following Python sample:importfunctions_framework @functions_framework.http defhello_get(request): """HTTP Cloud Function. Args: request (flask.Request): The request object. <https://flask.palletsprojects.com/en/1.1.x/api/#incoming-request-data> Returns: The response text, or any set of values that can be turned into a Response object using `make_response` <https://flask.palletsprojects.com/en/1.1.x/api/#flask.make_response>. Note: For more information on how Flask integrates with Cloud Functions, see the `Writing HTTP functions` page. <https://cloud.google.com/functions/docs/writing/http#http_frameworks> """ return "Hello World!"
Go
Create a new directory named
helloworldand change directory into it:mkdir helloworld cd helloworldCreate a
go.modfile to declare the go module:modulegithub.com/GoogleCloudPlatform/golang-samples/functions/functionsv2/helloworld go1.24.0 requiregithub.com/GoogleCloudPlatform/functions-framework-gov1.8.1 require( github.com/cloudevents/sdk-go/v2v2.15.2// indirect github.com/google/go-cmpv0.6.0// indirect github.com/google/uuidv1.6.0// indirect github.com/json-iterator/gov1.1.12// indirect github.com/modern-go/concurrentv0.0.0-20180306012644-bacd9c7ef1dd// indirect github.com/modern-go/reflect2v1.0.2// indirect github.com/stretchr/testifyv1.10.0// indirect go.uber.org/multierrv1.11.0// indirect go.uber.org/zapv1.27.0// indirect golang.org/x/timev0.9.0// indirect )Create an
hello_http.gofile in thehelloworlddirectory with the following Go code sample:// Package helloworld provides a set of Cloud Functions samples. packagehelloworld import( "fmt" "net/http" "github.com/GoogleCloudPlatform/functions-framework-go/functions" ) funcinit(){ functions.HTTP("HelloGet",helloGet) } // helloGet is an HTTP Cloud Function. funchelloGet(whttp.ResponseWriter,r*http.Request){ fmt.Fprint(w,"Hello, World!") }
Java
Create a new directory named
helloworldand change directory into it:mkdir helloworld cd helloworldCreate the following project structure to contain the source directory and source file:
mkdir -p ~/helloworld/src/main/java/functions touch ~/helloworld/src/main/java/functions/HelloWorld.javaUpdate the
HelloWorld.javafile with the following Java code sample:packagefunctions; importcom.google.cloud.functions.HttpFunction; importcom.google.cloud.functions.HttpRequest; importcom.google.cloud.functions.HttpResponse; importjava.io.BufferedWriter; importjava.io.IOException; publicclass HelloWorldimplementsHttpFunction{ // Simple function to return "Hello World" @Override publicvoidservice(HttpRequestrequest,HttpResponseresponse) throwsIOException{ BufferedWriterwriter=response.getWriter(); writer.write("Hello World!"); } }Create a
pom.xmlfile in thehelloworlddirectory, and add the following Java dependencies:<?xmlversion="1.0"encoding="UTF-8"?> <!-- Copyright2020GoogleLLC LicensedundertheApacheLicense,Version2.0(the"License"); youmaynotusethisfileexceptincompliancewiththeLicense. YoumayobtainacopyoftheLicenseat http://www.apache.org/licenses/LICENSE-2.0 Unlessrequiredbyapplicablelaworagreedtoinwriting,software distributedundertheLicenseisdistributedonan"AS IS"BASIS, WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied. SeetheLicenseforthespecificlanguagegoverningpermissionsand limitationsundertheLicense. --> <projectxmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.functions</groupId> <artifactId>functions-hello-world</artifactId> <version>1.0.0-SNAPSHOT</version> <parent> <groupId>com.google.cloud.samples</groupId> <artifactId>shared-configuration</artifactId> <version>1.2.0</version> </parent> <dependencyManagement> <dependencies> <dependency> <artifactId>libraries-bom</artifactId> <groupId>com.google.cloud</groupId> <scope>import</scope> <type>pom</type> <version>26.32.0</version> </dependency> </dependencies> </dependencyManagement> <properties> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.source>11</maven.compiler.source> </properties> <dependencies> <!--RequiredforFunctionprimitives--> <dependency> <groupId>com.google.cloud.functions</groupId> <artifactId>functions-framework-api</artifactId> <version>1.1.0</version> <scope>provided</scope> </dependency> <!--Thefollowingdependenciesareonlyrequiredfortesting--> <dependency> <groupId>com.google.truth</groupId> <artifactId>truth</artifactId> <version>1.4.0</version> <scope>test</scope> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava-testlib</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>5.10.0</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <!-- GoogleCloudFunctionsFrameworkMavenplugin ThispluginallowsyoutorunCloudFunctionsJavacode locally.Usethefollowingterminalcommandtoruna givenfunctionlocally: mvnfunction:run-Drun.functionTarget=your.package.yourFunction --> <groupId>com.google.cloud.functions</groupId> <artifactId>function-maven-plugin</artifactId> <version>0.11.0</version> <configuration> <functionTarget>functions.HelloWorld</functionTarget> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <!--version3.0.0-M4doesnotloadJUnit5correctly--> <!--seehttps://issues.apache.org/jira/browse/SUREFIRE-1750 --> <version>3.2.5</version> <configuration> <includes> <include>**/*Test.java</include> </includes> <skipTests>${skipTests}</skipTests> <reportNameSuffix>sponge_log</reportNameSuffix> <trimStackTrace>false</trimStackTrace> </configuration> </plugin> </plugins> </build> </project>
Ruby
Create a new directory named
helloworldand change directory into it:mkdir helloworld cd helloworldCreate a file named
app.rband paste the following code into it:require"functions_framework" FunctionsFramework.http"hello_get"do|_request| # The request parameter is a Rack::Request object. # See https://www.rubydoc.info/gems/rack/Rack/Request # Return the response body as a string. # You can also return a Rack::Response object, a Rack response array, or # a hash which will be JSON-encoded into a response. "Hello World!" endCreate a file named
Gemfileand copy the following into it:source"https://rubygems.org" gem"base64","~> 0.2" gem"functions_framework","~> 1.4"If you don't have Bundler 2.0 or greater installed, install Bundler.
Generate a
Gemfile.lockfile by running:bundle install
PHP
Create a new directory named
helloworldand change directory into it:mkdir helloworld cd helloworldCreate a file named
index.phpand paste the following code into it:use Psr\Http\Message\ServerRequestInterface; function helloGet(ServerRequestInterface $request): string { return 'Hello, World!' . PHP_EOL; }If you aren't using Cloud Shell, create a
composer.jsonfile and paste the following code into it:{ "require": { "google/cloud-functions-framework": "^1.0" }, "scripts": { "start": [ "Composer\\Config::disableProcessTimeout", "FUNCTION_TARGET=helloGet php -S localhost:${PORT:-8080} vendor/google/cloud-functions-framework/router.php" ] } }
.NET
Install .NET SDK.
From the console, create a new empty web project using the dotnet command.
dotnet new web -o helloworld-csharpChange directory to
helloworld-csharp:Replace the sample code in the project file
helloworld-csharp.csprojwith the following:<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Google.Cloud.Functions.Hosting" Version="3.0.1" /> </ItemGroup> </Project>Replace the sample code in
Program.csfile with the following:using Google.Cloud.Functions.Framework; using Microsoft.AspNetCore.Http; using System.Threading.Tasks; namespace HelloWorld; public class Function : IHttpFunction { public async Task HandleAsync(HttpContext context) { await context.Response.WriteAsync("Hello World!", context.RequestAborted); } }
Deploy the function
Important: This quickstart assumes that you have owner or editor roles in the project you are using for the quickstart. Otherwise, refer to the Cloud Run Source Developer role for the required permissions for deploying a Cloud Run resource from source.
To deploy your Cloud Run function, follow these steps:
Deploy the function by running the following command in the directory that contains the sample code:
Node.js
gcloud run deploy nodejs-http-function \ --source . \ --function helloGET \ --base-image nodejs22 \ --region REGION \ --allow-unauthenticatedReplace REGION with the Google Cloud region of the service where you want to deploy your function. For example,
europe-west1.Python
gcloud run deploy python-http-function \ --source . \ --function hello_get \ --base-image python313 \ --region REGION \ --allow-unauthenticatedReplace REGION with the Google Cloud region of the service where you want to deploy your function. For example,
europe-west1.Go
gcloud run deploy go-http-function \ --source . \ --function HelloGet \ --base-image go125 \ --region REGION \ --allow-unauthenticatedReplace REGION with the Google Cloud region of the service where you want to deploy your function. For example,
europe-west1.Java
Run the following command in the directory that contains the
pom.xmlfile:gcloud run deploy java-http-function \ --source . \ --function functions.HelloWorld \ --base-image java21 \ --region REGION \ --allow-unauthenticatedReplace REGION with the Google Cloud region of the service where you want to deploy your function. For example,
europe-west1.Ruby
gcloud run deploy ruby-http-function \ --source . \ --function hello_get \ --base-image ruby34 \ --region REGION \ --allow-unauthenticatedReplace REGION with the Google Cloud region of the service where you want to deploy your function. For example,
europe-west1.PHP
gcloud run deploy php-http-function \ --source . \ --function helloGet \ --base-image php84 \ --region REGION \ --allow-unauthenticatedReplace REGION with the Google Cloud region of the service where you want to deploy your function. For example,
europe-west1..NET
gcloud run deploy csharp-http-function \ --source . \ --function HelloWorld.Function \ --base-image dotnet8 \ --region REGION \ --allow-unauthenticatedReplace REGION with the Google Cloud region of the service where you want to deploy your function. For example,
europe-west1.When the deployment is complete, the Google Cloud CLI displays a URL where the service is running. Open the URL in your browser to see the output of your function.
Clean up
To avoid additional charges to your Google Cloud account, delete all the resources you deployed with this quickstart.
Delete your repository
Cloud Run doesn't charge you when your deployed service isn't in use. However, you might still be charged for storing the container image in Artifact Registry. To delete Artifact Registry repositories, follow the steps in Delete repositories in the Artifact Registry documentation.
Delete your service
Cloud Run services don't incur costs until they receive requests. To delete your Cloud Run service, follow one of these steps:
Console
To delete a service:
In the Google Cloud console, go to the Cloud Run Services page:
Locate the service you want to delete in the services list, and click its checkbox to select it.
Click Delete. This deletes all revisions of the service.
gcloud
To delete a service, run the following command:
gcloud run services delete SERVICE --region REGION
Replace the following:
- SERVICE: name of your service.
- REGION: Google Cloud region of the service.
Delete your test project
Deleting your Google Cloud project stops billing for all resources in that project. To release all Google Cloud resources in your project, follow these steps:
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
What's next
To deploy a sample function to Cloud Run using the Google Cloud console, see Quickstart: Deploy a function to Cloud Run using the Google Cloud console.
To deploy functions and create triggers using the Google Cloud console and the Google Cloud CLI, see Deploy functions.
To view and delete existing functions, see Manage service revisions.
To build function containers in your own toolchain and deploy it to Cloud Run, see Build functions.
To create triggers with Eventarc, see Create triggers with Eventarc.