Help us understand the problem. What is going on with this article?

Google Cloud FunctionsでJava11を使う

はじめに

2020年5月にGoogle Cloud FunctionsでJava11がβ版ですがサポートされました。こちら
当記事ではHTTPリクエストをトリガーに動くJava11アプリケーションを実際にデプロイをするまでを解説しています。

操作にはCloud Shellを使っています。

Mavenの準備

まずはMavenに必要なpomファイルから用意します。Cloud Functionsで動かすのに必要なfunctions-framework-apiへの依存性と
ローカルで動かすために必要なプラグインの記述をします。

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>example</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>
    <!--  Functions Framework for Javaを依存関係に入れる -->
    <dependency>
      <groupId>com.google.cloud.functions</groupId>
      <artifactId>functions-framework-api</artifactId>
      <version>1.0.1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <!-- Function Maven プラグインを入れ、ローカル実行できるようにする -->
        <groupId>com.google.cloud.functions</groupId>
        <artifactId>function-maven-plugin</artifactId>
        <version>0.9.3</version>
        <configuration>
          <functionTarget>CloudFunctionsForJava</functionTarget>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

プログラム

次にプログラムの準備をします。HTTPリクエストをトリガーに動かす場合、functions-framework-apiのcom.google.cloud.functions.HttpFunction
インターフェースを実装する必要があります。実装するメソッドはserviceメソッドのみで、このメソッドに処理したい内容を記載します。

当記事では、Qiita APIで私のユーザIDを叩いた時の結果を返すアプリケーションにしてあります。Java11っぽくするためになるべくローカル変数に型推論を使い、java.net.http.HttpRequestを使ってリクエストを飛ばしてあります。

serviceメソッドの引数であるcom.google.cloud.functions.HttpRequestにCloud Functionsを呼び出した時のリクエストパラメータ等が格納されます。同様にパラメータのcom.google.cloud.functions.HttpResponseに値を書き出すことで、呼び出し元へレスポンスを返せます。

CloudFunctionsForJava.java
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;

public class CloudFunctionsForJava implements HttpFunction {

  @Override
  public void service(HttpRequest request, HttpResponse response)
      throws IOException, InterruptedException {

    //Qiita APIを呼び出す準備
    var httpClient = HttpClient.newHttpClient();
    var requestFromGCF = java.net.http.HttpRequest
            .newBuilder(URI.create("https://qiita.com/api/v2/users/shuichiro"))
            .header("Content-Type", "application/json; charset=utf-8")
            .build();

    //呼び出しを実行
    var responseFromQiita
        = httpClient.send(requestFromGCF,java.net.http.HttpResponse.BodyHandlers.ofString());

    //Content-Typeの設定、日本語を表示するため
    response.setContentType("application/json; charset=utf-8");

    //Qiita APIから取得した値をCloud Functionを呼び出した相手へに
    var writer = response.getWriter();
    writer.write(responseFromQiita.body());
  }
}

作成したプログラムとpomの場所は以下の通りです。

$ tree
.
├── pom.xml
└── src
    └── main
        └── java
            └── CloudFunctionsForJava.java

テスト

まずはコンパイルをします。

$ mvn compile

少し時間がかかりますが、「BUILD SUCCESS」と出れば成功です。
コンパイルが通ったら、ローカル環境で実行します。

$ mvn function:run

実行するとターミナルにスタートしたログが出るので別のターミナルを開いてcurlを実行します。

$ curl localhost:8080
{"description": ~~~略~~~~~ "website_url":""}

Qiita APIの結果が表示されているのが解ります。

デプロイ

最後に実際にCloud Functionsにデプロイをします。以下のコマンドでデプロイを行いいます。トリガーをHTTPリクエストにし、認証無しで実行可能にしています。

$ gcloud functions deploy java-function --entry-point CloudFunctionsForJava --runtime java11 --trigger-http --memory 512MB --allow-unauthenticated

数分するとデプロイが終わるので、デプロイ時に表示されるURLを叩きます。

$ curl https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/java-function 
{"description": ~~~略~~~~~ "website_url":""}

Java11で作成したアプリケーションがCloud Functionsにデプロイできたのが確認できました。

shuichiro
社内の研修を企画したり、新しいものを試したりしています。 悩んだことを残していこうと思います。 投稿する記事の内容は個人の意見であり、所属する企業の見解を代表するものではありません。
japan-systems
「2019年に50周年を迎えたIT企業です。最先端の技術により全国の企業、官公庁、自治体に多くの実績があります。」
https://www.japan-systems.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした