App Engine で Go アプリをビルドする

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r が App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

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

このガイドは、App Engine の使用を開始して、Go アプリの開発、デプロイ、管理に習熟するうえで有用です。

費用

このガイドの実行に伴う費用はありません。このサンプルアプリを実行するだけなら、無料の割り当てを超過することはありません。

開発環境を設定する

ローカルマシンで使い慣れているツールを使用できるほか、Cloud Shell を使用することもできます。Cloud Shell には Google Cloud CLI がすでにインストール済みで、環境がすでに設定済みで、その他の多くの機能を使用できます。

ローカルマシン

Go をインストールして gcloud CLI を設定します。

Cloud Shell

Cloud Shell を起動します。これには、事前にインストールしなければならないツールがすべて備わっています。

Cloud Shell を開く

Google Cloud プロジェクトを作成する

Google Cloud を使用するにはプロジェクトが必要です。プロジェクトは、すべての Google Cloud サービスを使用するための基礎となります。

  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 Cloud Build API.

    Enable the API

  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 Cloud Build API.

    Enable the API

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

    gcloud init
  12. App Engine アプリとその関連リソースを作成します。ロケーションを選択する必要があります。このロケーションは後で変更できません。
    gcloud app create

App Engine 用の基本的なウェブサービスを作成する

ウェブサービスを作成し、ランタイム設定を宣言する方法について説明します。

ファイルを構造化する

サービスのファイル構造は次のようになります。

  • go-app/: Go 1.11 サービスのディレクトリ。
    • app.yaml: サービスの構成。
    • main.go: アプリケーション コード。

app.yaml ファイルの作成

どの App Engine プロジェクトにも、サービスのランタイム環境の設定を指定する app.yaml 構成ファイルがあります。このファイルがないと、サービスはデプロイされません。

  1. Go 1.11 のサービス用に go-app という新しいフォルダを作成します。

    mkdir go-app

  2. go-app/ フォルダ内に、app.yaml というファイルを作成し、次のコンテンツを追加します。

    # Copyright 2019 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
    #
    #     https://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.
    
    runtime: go121
    

    これは App Engine アプリの最も簡単な構成です。Go 1.11 ランタイムを使用することを App Engine に指示しています。app.yaml ファイルでは、ネットワーク設定やスケーリング設定などを指定することもできます。詳細については、app.yaml リファレンスをご覧ください。

main.go ファイルの作成

このサンプルでは、net/http パッケージを使用して「Hello World」を出力する HTTP サーバーを作成します。

main.go ファイルを設定するには:

  1. go-app/ フォルダに main.go ファイルを作成します。

  2. コードを実行可能なプログラムとして扱うために、package main ステートメントを追加します。

    package main
    

    Go 1.11 ランタイムでサービスを正常にデプロイするには、サービスの app.yaml ファイルと同じディレクトリにある少なくとも 1 つの Go ソースファイルの先頭に package main ステートメントを定義する必要があります。

  3. 以下のパッケージをインポートします。

    import (
    	"fmt"
    	"log"
    	"net/http"
    	"os"
    )
    
  4. HTTP ハンドラを定義します。

    
    // indexHandler responds to requests with our greeting.
    func indexHandler(w http.ResponseWriter, r *http.Request) {
    	if r.URL.Path != "/" {
    		http.NotFound(w, r)
    		return
    	}
    	fmt.Fprint(w, "Hello, World!")
    }
    

    http.ResponseWriter オブジェクトは、HTTP サーバーのレスポンスを収集します。この値に書き込むことで、ブラウザにデータを送信します。http.Request オブジェクトは、受信した HTTP リクエストを表すデータ構造です。

  5. HTTP ハンドラを登録します。

    
    func main() {
    	http.HandleFunc("/", indexHandler)
    
    	port := os.Getenv("PORT")
    	if port == "" {
    		port = "8080"
    		log.Printf("Defaulting to port %s", port)
    	}
    
    	log.Printf("Listening on port %s", port)
    	if err := http.ListenAndServe(":"+port, nil); err != nil {
    		log.Fatal(err)
    	}
    }
    

    main 関数は実行可能プログラムのエントリ ポイントであるため、アプリケーションを起動します。これにより、最初に http.HandleFunc 関数が呼び出され、http パッケージに対し、ウェブルート("/")に対するすべてのリクエストを indexHandler 関数で処理するように指示されます。

    PORT 環境変数が設定されていない場合は、ポート 8080 がデフォルトとして使用されます。アプリが App Engine で実行されるときには、PORT 環境変数は自動的に設定されますが、アプリをローカルでテストするときは PORT を任意の値に設定できます。

ウェブサービスを App Engine にデプロイする

  1. app.yaml ファイルがある go-app ディレクトリで、次のコマンドを使用してウェブサービスを App Engine にデプロイします。

    gcloud app deploy

  2. ブラウザを起動して https://PROJECT_ID.REGION_ID.r.appspot.com でウェブサービスを表示するには、次のコマンドを実行します。

    gcloud app browse

これで完了です。サービスを作成して App Engine にデプロイする作業は終わりです。

サービスとバージョン

アプリケーションに最初にデプロイするサービスがデフォルト サービスになります。app.yaml ファイルでサービスの名前を指定できますが、名前を省略すると、default として扱われます。デフォルト サービス以外にも複数のサービスをデプロイできます。

gcloud app deploy コマンドを実行すると、いつでもサービスを更新できます。サービスをデプロイするたびに新しいバージョンが作成され、自動的に最新のバージョンにトラフィックがルーティングされます。

サービスの作成とバージョンのデプロイメントを確認するには:

  1. Google Cloud コンソールで App Engine サービスを表示します。

    サービスを表示

    default という名前のサービスが 1 つ表示されます。このデフォルトのサービスは、次の URL で公開されています。

    https://PROJECT_ID.REGION_ID.r.appspot.com

  2. バージョンを表示します。

    バージョンを表示

    デプロイに対応する、タイムスタンプ付きのバージョンが 1 つ表示されます。

特定のサービスおよびバージョンにリクエストを送信する方法については、リクエストのルーティング方法をご覧ください。

次のステップ

これで、ウェブ アプリケーションを設定して App Engine にデプロイできました。

次は、以下のページを参照して、アプリケーションに他の機能を追加する方法を学びましょう。