Java で HTTP Cloud Functions の関数を作成してデプロイする

Java で HTTP Cloud Functions の関数を作成してデプロイする

このガイドでは、Java ランタイムを使用して Cloud Functions の関数を記述するプロセスを説明します。Cloud Functions の関数には次の 2 つのタイプがあります。

  • HTTP 関数。標準的な HTTP リクエストから呼び出します。
  • イベント ドリブン関数。Pub/Sub トピック上のメッセージや Cloud Storage バケット内の変更など、Cloud インフラストラクチャのイベントによってトリガーされます。

このドキュメントでは、Maven または Gradle のいずれかを使用して、単純な HTTP 関数を作成し、ビルドする方法を説明します。

詳細については、HTTP 関数の作成イベント ドリブン関数の作成をご覧ください。

準備

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud Functions、Cloud Build、Artifact Registry、Cloud Run、and Cloud Logging API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Cloud Functions、Cloud Build、Artifact Registry、Cloud Run、and Cloud Logging API を有効にします。

    API を有効にする

  8. Google Cloud SDK をインストールして初期化します。
  9. 次のコマンドを使用して、gcloud コンポーネントを更新してインストールします。
    gcloud components update
  10. 開発環境を準備します。

    Java 設定ガイドに移動

関数を作成する

このセクションでは、関数を作成する方法について説明します。

Maven

  1. 関数コードで使用するため、ローカル システムにディレクトリを作成します。

    Linux または Mac OS X:

     mkdir ~/helloworld
     cd ~/helloworld
    

    Windows:

     mkdir %HOMEPATH%\helloworld
     cd %HOMEPATH%\helloworld
    
  2. ソース ディレクトリとソースファイルを格納するプロジェクト構造を作成します。

    mkdir -p ~/helloworld/src/main/java/functions
    touch ~/helloworld/src/main/java/functions/HelloWorld.java
    
  3. 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!");
      }
    }

    この例の関数は、「Hello, World!」という挨拶を出力します。

Gradle

  1. 関数コードで使用するため、ローカル システムにディレクトリを作成します。

    Linux または Mac OS X:

     mkdir ~/helloworld-gradle
     cd ~/helloworld-gradle
    

    Windows:

     mkdir %HOMEPATH%\helloworld-gradle
     cd %HOMEPATH%\helloworld-gradle
    
  2. ソース ディレクトリとソースファイルを格納するプロジェクト構造を作成します。

     mkdir -p src/main/java/functions
     touch src/main/java/functions/HelloWorld.java
    
  3. 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!");
      }
    }

    この例の関数は、「Hello, World!」という挨拶を出力します。

依存関係を指定する

次に、依存関係を設定します。

Maven

上記で作成した helloworld ディレクトリにディレクトリを変更し、pom.xml ファイルを作成します。

 cd ~/helloworld
 touch pom.xml

Maven を使用して依存関係を管理するには、プロジェクトの pom.xml ファイル内にある <dependencies> セクションで依存関係を指定します。この演習では、次の内容を pom.xml ファイルにコピーします。

<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>
  <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>
  </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>
    </plugins>
  </build>
</project>

Maven に基づく完全なサンプルについては、helloworld をご覧ください。

Gradle

上記で作成した helloworld-gradle ディレクトリにディレクトリを変更し、build.gradle ファイルを作成します。

 cd ~/helloworld-gradle
 touch build.gradle

Gradle を使用して依存関係を管理するには、プロジェクトの build.gradle ファイル内で依存関係を指定します。この演習では、次の内容を build.gradle ファイルにコピーします。この build.gradle ファイルには、関数をローカルで実行するためのカスタムタスクが含まれています。

apply plugin: 'java'

repositories {
  jcenter()
  mavenCentral()
}
configurations {
    invoker
}

dependencies {
  // Every function needs this dependency to get the Functions Framework API.
  compileOnly 'com.google.cloud.functions:functions-framework-api:1.1.0'

  // To run function locally using Functions Framework's local invoker
  invoker 'com.google.cloud.functions.invoker:java-function-invoker:1.3.1'

  // These dependencies are only used by the tests.
  testImplementation 'com.google.cloud.functions:functions-framework-api:1.1.0'
  testImplementation 'junit:junit:4.13.2'
  testImplementation 'com.google.truth:truth:1.2.0'
  testImplementation 'org.mockito:mockito-core:5.9.0'

}

// Register a "runFunction" task to run the function locally
tasks.register("runFunction", JavaExec) {
  main = 'com.google.cloud.functions.invoker.runner.Invoker'
  classpath(configurations.invoker)
  inputs.files(configurations.runtimeClasspath, sourceSets.main.output)
  args(
    '--target', project.findProperty('run.functionTarget') ?: '',
    '--port', project.findProperty('run.port') ?: 8080
  )
  doFirst {
    args('--classpath', files(configurations.runtimeClasspath, sourceSets.main.output).asPath)
  }
}

Gradle に基づく完全なサンプルについては、helloworld-gradle をご覧ください。

をご覧ください。

関数をローカルでビルドしてテストする

関数をデプロイする前に、ローカルでビルドしてテストできます。

Maven

  1. 次のコマンドを実行して、関数がビルドしたことを確認します。

    mvn compile
    

    もう 1 つのオプションは、mvn package コマンドを使用して、Java コードをコンパイルし、テストを実行して、ターゲット ディレクトリ内の JAR ファイルにコードをパッケージ化するというものです。Maven ビルドのライフサイクルについて詳しくは、こちらをご覧ください。

  2. 次のコマンドで関数を起動します。

    mvn function:run
    
  3. ブラウザで http://localhost:8080 にアクセスするか、別のウィンドウから curl localhost:8080 を実行して、関数をテストします。

    詳細については、ローカル関数にリクエストを送信するをご覧ください。

Gradle

  1. 次のコマンドを実行して、関数がビルドしたことを確認します。

    gradle build
    
  2. 次のコマンドで関数を起動します。

    gradle runFunction -Prun.functionTarget=functions.HelloWorld
    
  3. ブラウザで http://localhost:8080 にアクセスするか、別のウィンドウから curl localhost:8080 を実行して、関数をテストします。

    詳細については、ローカル関数にリクエストを送信するをご覧ください。

関数をデプロイする

関数をデプロイするには、helloworld ディレクトリ(maven を使用している場合)または helloworld-gradle ディレクトリ(gradle の場合)で次のコマンドを実行します。

  gcloud functions deploy java-http-function \
    --gen2 \
    --entry-point=functions.HelloWorld \
    --runtime=java17 \
    --region=REGION \
    --source=. \
    --trigger-http \
    --allow-unauthenticated

REGION は、関数をデプロイする Google Cloud リージョンの名前(例: us-west1)に置き換えます。

オプションの --allow-unauthenticated フラグを使用すると、認証なしで関数にアクセスできます。

java-http-function は、関数が Google Cloud コンソールで識別される登録名で、--entry-point は関数の完全修飾クラス名(FQN)を指定します。

デプロイした関数をテストする

  1. 関数がデプロイされたら、gcloud functions deploy コマンドの出力の uri プロパティをメモするか、次のコマンドを使用して取得します。

    gcloud functions describe java-http-function \
      --region=REGION
    

    REGION は、関数をデプロイした Google Cloud リージョンの名前(例: us-west1)に置き換えます。

  2. ブラウザで、この URL にアクセスします。この関数は、「Hello World!」メッセージを返します。

関数のログを表示する

コマンドライン ツールでログを表示する

関数のログは、Cloud Logging UI または Google Cloud CLI を使用して確認できます。

gcloud CLI を使用して関数のログを表示するには、logs read コマンドを使用します。

    gcloud functions logs read \
      --gen2 \
      --limit=10 \
      --region=REGION \
      java-http-function

REGION は、関数をデプロイした Google Cloud リージョンの名前(例: us-west1)に置き換えます。

出力は次のようになります。

LEVEL: I
NAME: my-first-function
TIME_UTC: 2023-05-29 23:09:57.708
LOG:

LEVEL: I
NAME: my-first-function
TIME_UTC: 2023-05-29 23:05:53.257
LOG: Default STARTUP TCP probe succeeded after 1 attempt for container "my--first--function-1" on port 8080.

LEVEL:
NAME: my-first-function
TIME_UTC: 2023-05-29 23:05:53.248
LOG: 2023-05-29 23:05:53.248:INFO:oejs.Server:main: Started @892ms

ロギング ダッシュボードでログを表示する

ロギング ダッシュボードで関数のログを表示するには、Cloud Functions の概要ページを開き、リストから関数の名前をクリックして、ログタブをクリックします。