LoginSignup
7
10

More than 5 years have passed since last update.

App Engine Go

Last updated at Posted at 2016-09-29
1 / 20

自己紹介

スクリーンショット 2016-09-28 23.54.50.png


App Engine とは

  • Googleが提供するPaaS
  • GoogleCloudPlatformの一つ
  • 普通のWebサービスを作る上で必要なものが揃っている
  • 対応言語: Python, Java, PHP, Go
  • Snapchat や メルカリ アッテ が使っている
  • Standard Environment と Flexible Environmentの2つある
  • 今日は Standard Environment の話

App Engine Architecture

00_WebApp_ArchDiagram.png


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でオススメのフレームワーク

labstack/echo

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 で聞いてください
7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10