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


お題

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

GAE試行Index

開発環境

# OS

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"

# Golang

$ go version
go version go1.11.2 linux/amd64

バージョンの切り替えはgoenvで行っている。

# gcloud

$ gcloud version
Google Cloud SDK 224.0.0

前提

  • スタンダード環境での開発とする。
  • 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

runtime: go111

server.go

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

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

うん、もろもろ情報が取れてる。

■デプロイ

※当然、「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。

先ほどのローカル起動での取得情報と並べてみる。

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

まとめ

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