App EngineのGo 1.11新ランタイムを発表

Announcing App Engine’s New Go 1.11 Runtime by Eno Compton and Tyler Bui-Palsulich

App Engine は2011年にGoの実験的サポートを開始しました。それから数年の間にGoコミュニティは大きく成長し、クラウドベースのアプリケーションにおけるイディオマティックなパターンが定着してきました。本日、Google Cloudは、従量課金、自動スケーリング、マネージドインフラストラクチャといったApp Engineのすべての強みを備えながらイディオマティックなGoをサポートする、App Engineスタンダード環境向けの新しいGo 1.11ランタイムを発表します。

Go 1.11から、App EngineでのGoはアプリケーションの構造、サポートされるパッケージ、context.Context の値、HTTPクライアントに関する制限がなくなりました。好みのやり方でGoアプリケーションを書き、app.yaml ファイルを追加するだけで、App Engineにデプロイする準備が整います。Specifying Dependencies では、新しいランタイムが依存関係管理のためにベンダリングと(実験的な)モジュールをどのようにサポートしているかを説明しています。

Cloud FunctionsのGoサポート(詳細は今後の記事で紹介します)と合わせて、App Engineは基盤となるインフラストラクチャを気にすることなくGoogle Cloud Platform(GCP)上でGoのコードを実行する魅力的な方法を提供します。

App Engine向けの小さなアプリケーションを作成する様子を見てみましょう。ここでの例では GOPATH ベースのワークフローを前提としていますが、Goモジュールも実験的にサポートされています。

まず、GOPATH 内にアプリケーションを作成します。

// このサーバーはApp Engine上で実行できます。
package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }
    http.HandleFunc("/", hello)

    log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}

func hello(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, 世界"))
}

このコードには、「Hello, 世界」と応答する小さなHTTPサーバーのイディオマティックなセットアップが含まれています。以前にApp Engineを使った経験があれば、appengine.Main() の呼び出しがどこにもないことに気づくでしょう。これは今では完全に省略可能になっています。さらに、このアプリケーションのコードは完全にポータブルであり、デプロイ先のインフラストラクチャに一切依存していません。

外部の依存関係を使う必要がある場合は、vendor ディレクトリまたは go.mod ファイルに依存関係を追加できます。新しいランタイムはどちらの方式もサポートしています。

アプリケーションのコードが完成したら、ランタイムを指定する app.yaml ファイルを作成します。

runtime: go111

最後に、Google Cloud Platformのアカウントでマシンをセットアップします。

すべてのセットアップが完了したら、1つのコマンドでデプロイできます。

gcloud app deploy

Goの開発者にとって、App Engine向けの新しいGo 1.11ランタイムは、Goアプリケーションを実行するための選択肢を大きく広げるものになると私たちは考えています。無料枠も用意されています。入門ガイド移行ガイドをチェックして、今日から新しいランタイムにアプリをデプロイしましょう!

By Eno Compton and Tyler Bui-Palsulich