GAE/Go1.11試行（その1：「クイックスタート」）

# お題
[前回](https://qiita.com/sky0621/items/6d5541e5fa7d2ac349e7)、GAE(Google App Engine)のGolang版（v1.9）のクイックスタートを試してみた。
自分では試していないけど、v1.9版ではVendoring関係でハマるらしい。
ハマりを試してみてもいいのだけど、どうせならじきに Beta 版が外れるであろう v1.11 版でいろいろ試した方が楽しそうなので、急遽、対応バージョンを変更。
まずはクイックスタートを試すけど、せっかくなので v1.9 版のソースを比較してみる。

# 開発環境
### # OS
```
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"
```

### # Golang
```
$ go version
go version go1.11.2 linux/amd64
```

バージョンの切り替えは[goenv](https://github.com/syndbg/goenv)で行っている。

### # gcloud
```
$ gcloud version
Google Cloud SDK 224.0.0
```

# 前提
- [スタンダード環境](https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja)での開発とする。
- GCPプロジェクトは作成済み。
- gcloudコマンドインストール済み。

# 実践

手順は↓に従いつつ、つど、関係するファイルの中身を確認していく。
https://cloud.google.com/appengine/docs/standard/go111/quickstart?hl=ja

## ■サンプルプロジェクト取得

手順通り。

```
$ go get -u -d github.com/GoogleCloudPlatform/golang-samples/appengine/helloworld/...
$
$ ll golang-samples/appengine/helloworld/
合計 16K
-rw-r--r-- 1 koge koge   69 11月 12 02:51 app.yaml
-rw-r--r-- 1 koge koge  391 11月 12 02:51 hello.go
```

### hello.go

なぜか、"google.golang.org/appengine" を使わないサンプルソースになっていた。
使わなくてもいい（冗長になったけど）のか、あえて使っていないだけなのか、現時点で v1.11 に非対応なだけなのかは不明。

#### v1.11版

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

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)
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}

func indexHandler(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	fmt.Fprint(w, "Hello, World!")
}
```

#### v1.9版

```go
package main

import (
	"fmt"
	"net/http"

	"google.golang.org/appengine"
)

func main() {
	http.HandleFunc("/", handle)
	appengine.Main()
}

func handle(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "Hello, world!")
}
```

### app.yaml

App Engineの挙動を決める設定ファイル。
どういう要素を定義するかは↓に記載してある。
https://cloud.google.com/appengine/docs/standard/go111/config/appref?hl=ja

v1.9版のは↓
https://cloud.google.com/appengine/docs/standard/go/config/appref?hl=ja

#### v1.11版

```yaml
runtime: go111
```

URLのハンドリングはGoのソース内で行う方針になったということかな？

#### v1.9版

```yaml
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app
```

## ■ローカル起動

ローカルで起動する時は、起動スクリプトがPythonなのは同じみたい。

```
$ dev_appserver.py app.yaml 
INFO     2018-11-14 00:25:23,158 devappserver2.py:224] Using Cloud Datastore Emulator.
We are gradually rolling out the emulator as the default datastore implementation of dev_appserver.
　　　〜〜〜
INFO     2018-11-14 00:25:25,628 dispatcher.py:256] Starting module "default" running at: http://localhost:8080
INFO     2018-11-14 00:25:25,630 admin_server.py:152] Starting admin server at: http://localhost:8000
2018/11/14 00:25:27 Listening on port 18085
INFO     2018-11-14 00:25:28,359 instance.py:294] Instance PID: 8137
INFO     2018-11-14 00:25:58,565 module.py:434] [default] Detected file changes:
  /work/src/golang/src/github.com/GoogleCloudPlatform/golang-samples/appengine/go11x/helloworld/helloworld.go
2018/11/14 00:25:59 Listening on port 23807
INFO     2018-11-14 00:26:00,645 instance.py:294] Instance PID: 8540
```

うん、起動OK。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/180599/8a501a53-370d-f70a-9a2f-8c68de60264f.png)

## ■デプロイ

※当然、「`gcloud init`」や「`gcloud auth login`」は済んでいる前提。

```
d$ gcloud app deploy
Services to deploy:

descriptor:      [/work/src/golang/src/github.com/GoogleCloudPlatform/golang-samples/appengine/go11x/helloworld/app.yaml]
source:          [/work/src/golang/src/github.com/GoogleCloudPlatform/golang-samples/appengine/go11x/helloworld]
target project:  [【プロジェクトID】]
target service:  [default]
target version:  [20181114t093930]
target url:      [https://【プロジェクトID】.appspot.com]


Do you want to continue (Y/n)?  y

Beginning deployment of service [default]...
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 4 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.                                                                                                                                                                         
Setting traffic split for service [default]...done.                                                                                                                                                        
Deployed service [default] to [https://【プロジェクトID】.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse
```

デプロイOK。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/180599/d6337319-7484-c8f0-3a9c-d7362bb014ea.png)

GCPコンソール上でも、ランタイム「go」のインスタンスがデプロイされていることを確認。
![screenshot-console.cloud.google.com-2018-11-14-09-43-59-758.png](https://qiita-image-store.s3.amazonaws.com/0/180599/a4b17091-5338-f65d-6b2f-9912fba99058.png)

# まとめ
クイックスタートレベルでも、ちょっと違いがあった。
次回は、v1.9版でハマると言われていたVendoringまわりを試してみよう。