GAE/Go1.11試行（その2：「"google.golang.org/appengine"パッケージのappengineから取れる情報」）

# お題
[前回](https://qiita.com/sky0621/items/8a42ee24cb417940228c)はGAE/Go(v1.11)のクイックスタートを試してみた。
今回からは公式サイトのドキュメント眺めつつ、いくつかのコンセプトを確認してみる。
で、今回は、表題の通り`appengine`から取れる情報を確認。

# GAE試行Index
- [GAE/Go1.11試行（その1：「クイックスタート」）](https://qiita.com/sky0621/items/8a42ee24cb417940228c)
- [GAE/Go1.9試行（その0：「クイックスタート」）](https://qiita.com/sky0621/items/6d5541e5fa7d2ac349e7)

# 開発環境
### # 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://github.com/sky0621/go-webapi-for-gae-study/tree/aab17658753a64de375129b7efa4a09133883467

## プロジェクト構成

```
$ tree
.
├── Gopkg.lock
├── Gopkg.toml
├── README.md
└── backend
    ├── app.yaml
    ├── index.yaml
    └── server.go
```

### app.yaml

```yaml
runtime: go111
```

### server.go

クイックスタートのソースでは、なぜか、"google.golang.org/appengine" を使わないサンプルソースになっていたが、
v1.11だからといって使えないわけではなかったので、同パッケージの appengine を用いて、取れる情報を表示してみる。

```go
package main

import (
	"fmt"
	"net/http"

	"google.golang.org/appengine"
)

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

func handleRoot(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "Hello, GAE/go")
	c := appengine.NewContext(r)
	fmt.Fprintf(w, "[AppID]: %v\n", appengine.AppID(c))
	fmt.Fprintf(w, "[Datacenter]: %v\n", appengine.Datacenter(c))
	fmt.Fprintf(w, "[DefaultVersionHostname]: %v\n", appengine.DefaultVersionHostname(c))
	fmt.Fprintf(w, "[InstanceID]: %v\n", appengine.InstanceID())
	fmt.Fprintf(w, "[IsAppEngine]: %v\n", appengine.IsAppEngine())
	fmt.Fprintf(w, "[IsDevAppServer]: %v\n", appengine.IsDevAppServer())
	fmt.Fprintf(w, "[IsFlex]: %v\n", appengine.IsFlex())
	fmt.Fprintf(w, "[IsStandard]: %v\n", appengine.IsStandard())
	fmt.Fprintf(w, "[ModuleName]: %v\n", appengine.ModuleName(c))
	fmt.Fprintf(w, "[RequestID]: %v\n", appengine.RequestID(c))
	fmt.Fprintf(w, "[ServerSoftware]: %v\n", appengine.ServerSoftware())
	serviceAccount, _ := appengine.ServiceAccount(c)
	fmt.Fprintf(w, "[ServiceAccount]: %v\n", serviceAccount)
	fmt.Fprintf(w, "[VersionID]: %v\n", appengine.VersionID(c))
}
```

## ■ローカル起動

```
$ dev_appserver.py app.yaml 
INFO     2018-11-14 16:50:04,810 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 16:50:06,918 dispatcher.py:256] Starting module "default" running at: http://localhost:8080
INFO     2018-11-14 16:50:06,919 admin_server.py:152] Starting admin server at: http://localhost:8000
INFO     2018-11-14 16:50:09,764 instance.py:294] Instance PID: 7620
```

うん、もろもろ情報が取れてる。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/180599/c9ab4f38-df6a-8232-c2f0-9f44cb1c0592.png)

## ■デプロイ

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

```
$ gcloud app deploy
Services to deploy:

descriptor:      [/work/src/golang/src/github.com/sky0621/go-webapi-for-gae-study/backend/app.yaml]
source:          [/work/src/golang/src/github.com/sky0621/go-webapi-for-gae-study/backend]
target project:  [【プロジェクトID】]
target service:  [default]
target version:  [20181115t012712]
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。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/180599/fde10023-c8db-b6b6-1668-23beb618d90c.png)

先ほどのローカル起動での取得情報と並べてみる。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/180599/c9ab4f38-df6a-8232-c2f0-9f44cb1c0592.png)

GAE環境にデプロイすると「`IsAppEngine`」が`true`になり、逆にローカル環境で起動すると「`IsDevAppServer`」が`true`になる。

# まとめ
ここで取れた情報を使うと、ローカル起動時のみ（またはGAE環境デプロイ時のみ）行うべき処理の振り分けがソース上でできる。