App Engine フレキシブル環境での Java のクイックスタート

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。既存のアプリでは省略可能ですが、まもなく、新しいアプリのすべてにおいて App Engine の URL に REGION_ID.r を含めることが必須となる予定です。

移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL の更新や他の変更を行う必要はありません。

詳しくは、リージョン ID をご覧ください。

このクイックスタートでは、短いメッセージを表示する小さな App Engine アプリを作成する方法について説明します。

始める前に

このクイックスタートでは、Java SE 8 Development Kit(JDK)がインストール済みであることを前提としています。

このクイックスタートを実行してデプロイする前に、Cloud SDK をインストールして、App Engine 用に Cloud プロジェクトを設定します。

  1. Cloud SDK をダウンロードしてインストールします。

    SDK をダウンロード

    : Cloud SDK がすでにインストールされている場合は、次のコマンドを実行して更新します。

    gcloud components update
    
  2. 新しいプロジェクトを作成します。

    gcloud projects create [YOUR_PROJECT_ID] --set-as-default
    

    [YOUR_PROJECT_ID] は、プロジェクトを一意に識別する文字列に置き換えます。例: my-project-24

    プロジェクトが作成されたことを確認します。

    gcloud projects describe [YOUR_PROJECT_ID]
    

    次のようなプロジェクトの詳細が表示されます。

    createTime: year-month-hour
    lifecycleState: ACTIVE
    name: project-name
    parent:
    id: '433637338589'
    type: organization
    projectId: project-name-id
    projectNumber: 499227785679
    
  3. プロジェクトで App Engine アプリケーションを初期化し、そのリージョンを選択します。

    gcloud app create --project=[YOUR_PROJECT_ID]
    

    プロンプトが表示されたら、App Engine アプリケーションを配置するリージョンを選択します。

  4. プロジェクトで課金が有効になっていることを確認します。アプリケーションを App Engine にデプロイするには、課金アカウントをプロジェクトにリンクする必要があります。

    課金を有効にする

    フレキシブル環境でデプロイすると、有効である間は費用が発生します。完了するごとにプロジェクトをクリーンアップして、継続的な費用が発生しないようにしてください。

  5. 次の前提条件でインストールします。

App Engine のロケーション

App Engine はリージョナルです。つまり、アプリを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google が管理しています。

レイテンシ、可用性、耐久性の要件を満たすことが、アプリを実行するリージョンを選択する際の主な要素になります。一般的には、アプリのユーザーに最も近いリージョンを選択できますが、App Engine が使用可能なロケーションと、アプリが使用するその他の Google Cloud プロダクトおよびサービスのロケーションを考慮する必要があります。使用するサービスが複数のロケーションにまたがっていると、アプリのレイテンシだけでなく、料金にも影響する可能性があります。

設定したアプリのリージョンは変更できません。

すでに App Engine アプリケーションを作成している場合は、次のいずれかの方法でそのリージョンを表示できます。

Hello World アプリをダウンロードする

Java 用のシンプルな Hello World アプリが用意されており、Google Cloud へのアプリのデプロイをすぐに試すことができます。

  1. Hello World サンプルアプリ リポジトリのクローンをローカルマシンに作成します。

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples
    

    または、zip 形式のサンプルをダウンロードして、ファイルを抽出します。

  2. サンプルコードが含まれているディレクトリに移動します。

    cd java-docs-samples/flexible/helloworld
    

ローカルマシン上で Hello World を実行する

ローカルのパソコンで Hello World アプリを実行するには:

  1. Jetty Maven プラグインを使用してローカルの Jetty ウェブサーバーを起動します。
    mvn jetty:run-exploded
  2. ウェブブラウザに次のアドレスを入力します。

    http://localhost:8080/

サンプル アプリケーションから Hello World というメッセージがページに表示されます。ターミナル ウィンドウで Ctrl+C キーを押してウェブサーバーを終了します。

Hello World を App Engine にデプロイして実行する

App Engine フレキシブル環境にアプリをデプロイするには:

  1. helloworld ディレクトリで次のコマンドを実行して、Hello World アプリをデプロイします。

    gcloud app deploy

    オプションのフラグをご覧ください。

    共通の gcloud コマンドフラグ

    • アプリのバージョンを一意に識別する ID を指定するには --version フラグを含めます。このフラグを含めない場合は自動的に生成されます。例: --version [YOUR_VERSION_ID]
    • gcloud ツールでデフォルトとして初期設定したものに代わる Cloud プロジェクト ID を指定するには、--project フラグを指定します。例: --project [YOUR_PROJECT_ID]

    例:

    gcloud app deploy --version pre-prod-5 --project my-sample-app

    コマンドラインからアプリをデプロイする方法については、アプリのテストとデプロイをご覧ください。すべてのコマンドフラグの一覧については、gcloud app deploy リファレンスをご覧ください。

  2. ブラウザを起動し、https://PROJECT_ID.REGION_ID.r.appspot.com にアクセスしてアプリを表示します。

    gcloud app browse
    ここで PROJECT_ID は、Google Cloud プロジェクト ID です。

今回、Hello World メッセージが表示されるページは、App Engine インスタンスで実行されているウェブサーバーから配信されます。

これで完了です。 App Engine フレキシブル環境に最初の Java アプリをデプロイできました。

アプリケーションのデプロイでエラーが発生した場合は、トラブルシューティングのヒントをご覧ください。

クリーンアップの詳細については、以下の説明をご覧ください。また、活用できる次のステップへのリンクも併せてご覧ください。

クリーンアップ

課金されないようにするには、Cloud プロジェクトを削除してプロジェクト内のすべてのリソースへの課金を停止します。

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ

プラットフォーム全体について学習する

App Engine アプリの開発とデプロイについて概要を理解した後は、Google Cloud の残りの部分についても確認します。すでに Cloud SDK がインストールされているため、Cloud SQL、Cloud Storage、Firestore などと連携するツールの利用が可能になっています。

App Engine だけでなくプラットフォーム全体を使用するアプリの作成方法を学ぶチュートリアルについては、Bookshelf アプリの作成に関するクイックスタートをご覧ください。

App Engine フレキシブル環境について学習する

App Engine についてさらに理解を深めるためのトピックをご紹介します。

Hello World のコードレビュー

Hello World は、サービスが 1 つだけ含まれ、バージョンも 1 つだけで、すべてのコードがアプリケーションのルート ディレクトリにあるという、最もシンプルな App Engine アプリケーションです。このセクションでは、このアプリの各ファイルを詳しく説明します。

HelloServlet.java

HelloServlet.java ファイルでは、アプリがリクエストをリッスンする場所を記述する URL パターンを指定し、すべてのリクエストに対して「Hello World」というメッセージで応答します。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "helloworld", value = "")
@SuppressWarnings("serial")
public class HelloServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    PrintWriter out = resp.getWriter();
    out.println("Hello, world - App Engine Flexible");
  }
}

app.yaml

app.yaml ファイルには、アプリのデプロイ構成が記述されています。

runtime: java
env: flex

handlers:
- url: /.*
  script: this field is required, but ignored

この例では、このアプリによって使用されるランタイムを app.yaml で指定しています。また、env: flex を設定することで、このアプリがフレキシブル環境を使用することを指定しています。

pom.xml

Hello World には pom.xml ファイルも含まれており、ここには依存関係やビルド ターゲットなどのプロジェクト情報が記述されています。

<!--
  Copyright 2016 Google Inc.

  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>
  <modelVersion>4.0.0</modelVersion>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <groupId>com.example.flexible</groupId>
  <artifactId>flexible-helloworld</artifactId>

  <!--
    The parent pom defines common style checks and testing strategies for our samples.
    Removing or replacing it should not affect the execution of the samples in anyway.
  -->
  <parent>
    <groupId>com.google.cloud.samples</groupId>
    <artifactId>shared-configuration</artifactId>
    <version>1.0.21</version>
  </parent>

  <properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>

    <failOnMissingWebXml>false</failOnMissingWebXml> <!-- REQUIRED -->

    <appengine.maven.plugin>2.4.0</appengine.maven.plugin>
    <jetty>9.4.32.v20200930</jetty>
  </properties>

  <dependencies>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <type>jar</type>
      <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>
    <!-- for hot reload of the web application -->
    <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
    <plugins>

      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>appengine-maven-plugin</artifactId>
        <version>${appengine.maven.plugin}</version>
        <configuration>
          <projectId>GCLOUD_CONFIG</projectId>
          <version>GCLOUD_CONFIG</version>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty}</version>
      </plugin>

    </plugins>
  </build>
</project>