> Source: https://www.ymotongpoo.com/works/goblog-ja/appengine-go111/


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

[Announcing App Engine's New Go 1.11 Runtime](https://go.dev/blog/appengine-go111) by Eno Compton and Tyler Bui-Palsulich

[App Engine](https://cloud.google.com/appengine/) は2011年に[Goの実験的サポート](/blog/go-and-google-app-engine)を開始しました。それから数年の間にGoコミュニティは大きく成長し、クラウドベースのアプリケーションにおけるイディオマティックなパターンが定着してきました。本日、Google Cloudは、従量課金、自動スケーリング、マネージドインフラストラクチャといったApp Engineのすべての強みを備えながらイディオマティックなGoをサポートする、App Engineスタンダード環境向けの[新しいGo 1.11ランタイムを発表](https://cloud.google.com/blog/products/application-development/go-1-11-is-now-available-on-app-engine)します。

Go 1.11から、App EngineでのGoはアプリケーションの構造、サポートされるパッケージ、`context.Context` の値、HTTPクライアントに関する制限がなくなりました。好みのやり方でGoアプリケーションを書き、`app.yaml` ファイルを追加するだけで、App Engineにデプロイする準備が整います。[Specifying Dependencies](https://cloud.google.com/appengine/docs/standard/go111/specifying-dependencies) では、新しいランタイムが依存関係管理のために[ベンダリング](/cmd/go/#hdr-Vendor_Directories)と（実験的な）[モジュール](/doc/go1.11#modules)をどのようにサポートしているかを説明しています。

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

App Engine向けの小さなアプリケーションを作成する様子を見てみましょう。ここでの例では `GOPATH` ベースのワークフローを前提としていますが、Goモジュールも[実験的にサポート](https://cloud.google.com/appengine/docs/standard/go111/specifying-dependencies)されています。

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

```go
// このサーバーは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のアカウントでマシンをセットアップします。

* [GCP](https://cloud.google.com) のアカウントを作成する。
* [プロジェクトを作成する](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。
* システムに[Cloud SDK](https://cloud.google.com/sdk/)をインストールする。

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

```
gcloud app deploy
```

Goの開発者にとって、App Engine向けの新しいGo 1.11ランタイムは、Goアプリケーションを実行するための選択肢を大きく広げるものになると私たちは考えています。[無料枠](https://cloud.google.com/free/)も用意されています。[入門ガイド](https://cloud.google.com/appengine/docs/standard/go111/building-app/)や[移行ガイド](https://cloud.google.com/appengine/docs/standard/go111/go-differences)をチェックして、今日から新しいランタイムにアプリをデプロイしましょう！

By Eno Compton and Tyler Bui-Palsulich

