빠른 시작: gcloud CLI를 사용하여 Cloud Run에 함수 배포

이 페이지에서는 Cloud Run을 사용하여 gcloud CLI로 HTTP 함수를 배포하는 방법을 보여줍니다.

시작하기 전에

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Cloud Run Admin API, and Cloud Logging APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry, Cloud Build, Cloud Run Admin API, and Cloud Logging APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Cloud Run 서비스의 기본 프로젝트를 설정하려면 다음 명령어를 실행합니다.
     gcloud config set project PROJECT_ID
    PROJECT_ID를 이 빠른 시작에서 만든 프로젝트 이름으로 바꿉니다.
  13. 프로젝트에서 인증되지 않은 호출을 제한하는 도메인 제한 조직 정책이 적용되는 경우 비공개 서비스 테스트의 설명대로 배포된 서비스에 액세스해야 합니다.

  14. Cloud Build가 소스를 빌드할 수 있게 하려면 다음을 실행하여 Compute Engine 기본 서비스 계정에 Cloud Build 서비스 계정 역할을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudbuild.builds.builder

    PROJECT_NUMBER를 Google Cloud 프로젝트 번호로, PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다. 프로젝트 ID와 프로젝트 번호를 찾는 방법은 프로젝트 만들기 및 관리를 참조하세요.

    Compute Engine 기본 서비스 계정에 Cloud Build 서비스 계정 역할을 부여하려면 전파하는 데 몇 분 정도 걸립니다.

샘플 함수 작성

애플리케이션을 작성하려면 다음 단계를 따르세요.

Node.js

  1. helloworld이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.

       mkdir helloworld
       cd helloworld
    

  2. helloworld 디렉터리에 package.json 파일을 만들어 Node.js 종속 항목을 지정합니다.

    {
      "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"
      }
    }
    
  3. 다음 Node.js 샘플을 사용하여 helloworld 디렉터리에 index.js 파일을 만듭니다.

    const functions = 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

  1. helloworld이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.

       mkdir helloworld
       cd helloworld
    

  2. helloworld 디렉터리에 requirements.txt 파일을 만들어 Python 종속 항목을 지정합니다.

    functions-framework==3.5.0
    flask==3.0.3
    google-cloud-error-reporting==1.9.1
    MarkupSafe==2.1.3
    

    그러면 샘플에 필요한 패키지가 추가됩니다.

  3. 다음 Python 샘플을 사용하여 helloworld 디렉터리에 main.py 파일을 만듭니다.

    import functions_framework
    
    @functions_framework.http
    def hello_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

  1. helloworld이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.

       mkdir helloworld
       cd helloworld
    

  2. go.mod 파일을 만들어 Go 모듈을 선언합니다.

    module github.com/GoogleCloudPlatform/golang-samples/functions/functionsv2/helloworld
    
    go 1.21
    
    require github.com/GoogleCloudPlatform/functions-framework-go v1.8.1
    
    require (
    	github.com/cloudevents/sdk-go/v2 v2.15.2 // indirect
    	github.com/google/go-cmp v0.6.0 // indirect
    	github.com/google/uuid v1.6.0 // indirect
    	github.com/json-iterator/go v1.1.12 // indirect
    	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
    	github.com/modern-go/reflect2 v1.0.2 // indirect
    	go.uber.org/multierr v1.11.0 // indirect
    	go.uber.org/zap v1.27.0 // indirect
    	golang.org/x/time v0.5.0 // indirect
    )
    
  3. 다음 Go 코드 샘플을 사용하여 helloworld 디렉터리에 hello_http.go 파일을 만듭니다.

    
    // Package helloworld provides a set of Cloud Functions samples.
    package helloworld
    
    import (
    	"fmt"
    	"net/http"
    
    	"github.com/GoogleCloudPlatform/functions-framework-go/functions"
    )
    
    func init() {
    	functions.HTTP("HelloGet", helloGet)
    }
    
    // helloGet is an HTTP Cloud Function.
    func helloGet(w http.ResponseWriter, r *http.Request) {
    	fmt.Fprint(w, "Hello, World!")
    }
    

자바

  1. helloworld이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.

       mkdir helloworld
       cd helloworld
    

  2. 소스 디렉터리와 소스 파일을 포함하도록 다음과 같은 프로젝트 구조를 만듭니다.

    mkdir -p ~/helloworld/src/main/java/functions
    touch ~/helloworld/src/main/java/functions/HelloWorld.java
    
  3. 다음 Java 코드 샘플로 HelloWorld.java 파일을 업데이트합니다.

    
    package functions;
    
    import com.google.cloud.functions.HttpFunction;
    import com.google.cloud.functions.HttpRequest;
    import com.google.cloud.functions.HttpResponse;
    import java.io.BufferedWriter;
    import java.io.IOException;
    
    public class HelloWorld implements HttpFunction {
      // Simple function to return "Hello World"
      @Override
      public void service(HttpRequest request, HttpResponse response)
          throws IOException {
        BufferedWriter writer = response.getWriter();
        writer.write("Hello World!");
      }
    }
  4. helloworld 디렉터리에 pom.xml 파일을 만들고 다음 Java 종속 항목을 추가합니다.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!--
      Copyright 2020 Google LLC
    
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
      http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
    -->
    
    <project xmlns="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>
        <!-- Required for Function primitives -->
        <dependency>
          <groupId>com.google.cloud.functions</groupId>
          <artifactId>functions-framework-api</artifactId>
          <version>1.1.0</version>
          <scope>provided</scope>
        </dependency>
    
        <!-- The following dependencies are only required for testing -->
        <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>
            <!--
              Google Cloud Functions Framework Maven plugin
    
              This plugin allows you to run Cloud Functions Java code
              locally. Use the following terminal command to run a
              given function locally:
    
              mvn function: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>
            <!-- version 3.0.0-M4 does not load JUnit5 correctly -->
            <!-- see https://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

  1. helloworld이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.

       mkdir helloworld
       cd helloworld
    

  2. app.rb라는 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.

    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!"
    end
  3. Gemfile이라는 파일을 만들고 이 파일에 다음을 복사하여 붙여넣습니다.

    source "https://rubygems.org"
    
    gem "functions_framework", "~> 1.4"
  4. Bundler 2.0 이상이 설치되어 있지 않은 경우 Bundler를 설치합니다.

  5. 다음을 실행하여 Gemfile.lock 파일을 생성합니다.

    bundle install
    

PHP

  1. helloworld이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.

       mkdir helloworld
       cd helloworld
    

  2. index.php라는 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.

    
    use Psr\Http\Message\ServerRequestInterface;
    
    function helloGet(ServerRequestInterface $request): string
    {
        return 'Hello, World!' . PHP_EOL;
    }
    
  3. Cloud Shell을 사용하지 않는 경우 composer.json 파일을 만들고 다음 코드를 붙여넣습니다.

    {
        "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

  1. .NET SDK 6.0을 설치합니다. 이 빠른 시작은 .NET 버전 6에서만 작동합니다.

  2. 콘솔에서 dotnet 명령어를 사용하여 빈 웹 프로젝트를 새로 만듭니다.

    dotnet new web -o helloworld-csharp
    
  3. 디렉터리를 helloworld-csharp로 변경합니다.

  4. 프로젝트 파일 helloworld-csharp.csproj의 샘플 코드를 다음으로 바꿉니다.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Google.Cloud.Functions.Hosting" Version="2.2.1" />
      </ItemGroup>
    </Project>
  5. Program.cs 파일의 샘플 코드를 다음으로 바꿉니다.

    
    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);
        }
    }

함수 배포하기

중요: 이 빠른 시작에서는 빠른 시작에 사용 중인 프로젝트에 소유자 역할이나 편집자 역할이 있다고 가정합니다. 그렇지 않은 경우 소스에서 Cloud Run 리소스를 배포하는 데 필요한 권한은 Cloud Run 소스 개발자 역할을 참조하세요.

Cloud Run 함수를 배포하려면 다음 단계를 따르세요.

  1. 샘플 코드가 포함된 디렉터리에서 다음 명령어를 실행하여 함수를 배포합니다.

    Node.js

    gcloud beta run deploy nodejs-http-function \
          --source . \
          --function helloGET \
          --base-image nodejs20 \
          --region REGION \
          --allow-unauthenticated
    

    REGION을 함수를 배포하려는 서비스의 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

    Python

    gcloud beta run deploy python-http-function \
          --source . \
          --function hello_get \
          --base-image python312 \
          --region REGION \
          --allow-unauthenticated
    

    REGION을 함수를 배포하려는 서비스의 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

    Go

    gcloud beta run deploy go-http-function \
           --source . \
           --function HelloGet \
           --base-image go122 \
           --region REGION \
           --allow-unauthenticated
    

    REGION을 함수를 배포하려는 서비스의 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

    자바

    pom.xml 파일이 포함된 디렉터리에서 다음 명령어를 실행합니다.

    gcloud beta run deploy java-http-function \
           --source . \
           --function functions.HelloWorld \
           --base-image java21 \
           --region REGION \
           --allow-unauthenticated
    

    REGION을 함수를 배포하려는 서비스의 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

    Ruby

    gcloud beta run deploy ruby-http-function \
           --source . \
           --function hello_get \
           --base-image ruby33 \
           --region REGION \
           --allow-unauthenticated
    

    REGION을 함수를 배포하려는 서비스의 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

    PHP

    gcloud beta run deploy php-http-function \
           --source . \
           --function helloGet \
           --base-image php83 \
           --region REGION \
           --allow-unauthenticated
    

    REGION을 함수를 배포하려는 서비스의 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

    .NET

    gcloud beta run deploy csharp-http-function \
          --source . \
          --function HelloWorld.Function \
          --base-image dotnet6 \
          --region REGION \
          --allow-unauthenticated
    

    REGION을 함수를 배포하려는 서비스의 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

  2. 배포가 완료되면 Google Cloud CLI에 서비스가 실행 중인 URL이 표시됩니다. 브라우저에서 URL을 열어 함수의 출력을 확인합니다.

함수에 Eventarc 트리거를 추가하는 방법을 알아보려면 함수 배포 가이드를 참고하세요.

삭제

Cloud Run에서는 서비스를 사용하지 않을 때 비용이 청구되지 않지만 Artifact Registry에 컨테이너 이미지를 저장하는 데 요금이 청구될 수 있습니다. 비용이 청구되지 않도록 컨테이너 이미지를 삭제하거나 Google Cloud 프로젝트를 삭제할 수 있습니다. Google Cloud 프로젝트를 삭제하면 프로젝트 내에서 사용되는 모든 리소스에 대한 비용 청구가 중지됩니다.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계