自己紹介
App Engine とは
- Googleが提供するPaaS
- GoogleCloudPlatformの一つ
- 普通のWebサービスを作る上で必要なものが揃っている
- 対応言語: Python, Java, PHP, Go
- Snapchat や メルカリ アッテ が使っている
- Standard Environment と Flexible Environmentの2つある
- 今日は Standard Environment の話
App Engine Architecture
App Engine を 使う理由
- インフラのめんどうを見る必要がない
- Googleと同じインフラを使える。(Google.comが落ちなければ落ちない)
- 突然のトラフィックもオートスケールで対応してくれる(※デフォルト設定なら)
- 豊富な無料枠がある <- 重要
App Engine の 辛いところ
- 外部との通信はAPIベース
- ローカルに書き込めない
- スケールを意識した書き方を強制させられる(そのおかげでできた時には負荷対策が完了)
- 好きなポートにListenできない
- などなど
App Engine で Goを選ぶ理由
- スピンアップが40ms!! Python,PHPも結構速い
- ピュアGoで書かれているライブラリならほぼ使える (Cとかsyscallとかunsafe使ってるとダメ)
- 他の言語はバージョンが低い python2.7, Java7, PHP5.5.34 (2016/9/28)
- Goなら1.6!!
App Engine の 主なサービス
- Cloud Datastore - スキーマーのないオブジェクトデーターベース
- Cloud Storage - 1プロジェクト 5GBまで無料のストレージ 画像の保存などに
- Task Queue - TaskをQueueに入れて成功するまでリトライしてくれるサービス
- Search API - 全文検索エンジン
- Edge Cache - 無料で使える静的コンテンツのキャッシュサーバ
- ほか、認証系のサービスやMemcachedやCronなどもある
Hello World
インストール
- Macならhomebrewで一発で入れられる
$ brew install app-engine-go-64
app.yaml
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
app.go
package main
import (
"fmt"
"net/http"
)
func init() {
http.HandleFunc("/", handle)
}
func handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello world")
}
Dev Server
app.yamlがあるディレクトリで以下のコマンドを使う
$ goapp serve
http://localhost:8080/ に立ち上がる
Deploy
以下のコマンドでデプロイできる
$ goapp deploy -application <projectID> -version 1
Cloud consoleにアクセスしてprojectIDを作る
App Engine Tips
App Engine Go では contextが大事
各種サービスを呼び出すのにcontextを要求する
function handle(w http.ResponseWriter, r *http.Request) {
ctx := appengine.NewContext(r)
appID := appengine.AppID(ctx)
log.Infof(ctx, "handle: appID %s", appID)
fmt.Fprintf(w, "AppID %s", appID)
}
外部とHTTP通信するのもcontextが必要
function handle(w http.ResponseWriter, r *http.Request) {
ctx := appengine.NewContext(r)
hc := urlfetch.Client(ctx)
resp, err := hc.Get("https://example.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
io.Copy(w, resp.Body)
}
使いたいライブラリが App Engine で使えないパッケージを使ってた場合
forkしてBuild Constraintsでappengineを指定して処理を分けてPR!!
// +build appengine
package hogehoge
App Engineで使いたいという熱い思いをこめてIssueを作っておくといいです。
個人的に App Engineでオススメのフレームワーク
contextをいい感じに包んでるので扱いやすいしパフォーマンスもいい
e := echo.New()
e.Use(AppContext()) // . github.com/k2wanko/echo-appengine
e.GET("/", func(c echo.Context) error {
return c.String(200, "AppID %s", appengine.AppID(c))
})
Init(e)
まとめ
- 余程のことがなければクラウド死はないと思うので気軽に使おう
- App EngineはGoとWebの技術を試すのにいい遊び場
- App Engineの癖さえわかれば最高のプラットフォーム
- App Engineで足りないところはGCEなど他のサービスでなんとかなる!
- わからないことは 懇親会やGCPUG で聞いてください