Go
golang
GoogleCloudPlatform
GoogleCloudFunctions

Google Cloud Functions で Go を使おう!

注意

今 Google Cloud Functions (GCF) はまだベータで、まだアメリカしか使えなくて、まだNodeJSしか使えませんから、将来にいつかこの方法を使えないかもしれませんが、やってみよう!

はじめに

普通に、前に AWS Lambda や GCF みたいな Function as a Service (FaaS) と言うサービスでは Go を使えませんでした。でも、今月 AWS Lambda がアプデイトされて、今 Go を使えますが AWS があまりすきじゃないんだから GCF で Go を使う方法をしらべました。そして、このプロジェクトを見つかりました。

https://github.com/GoogleCloudPlatform/cloud-functions-go

それは日本語で「グーグル・クラウド・ファンクションの非公式の Go のネイティブのランタイム」です。

この方法について

この方法は初めてのリクエストで NodeJS のプロセスを完全に入れ替えて Go のプロセスがリクエストを引き継がせます。そして、新たなリクエストが来た時 NodeJS のプロセスがもうなくて、全部 Go のプロセスが返事します。もっと知りたかったら、このプロジェクトのリードミーを読んでください。

必要こと

  • Linux の開発環境 (デプロイメントする時しか要らないけど、Linux がなければ Docker や Vagrant も ok です)
  • Go v1.5 以上
  • Node.js v0.10 以上
  • node-gyp (npm install -g node-gyp でダウンロードします)
  • Make
  • GCC

コード

先ずはメインのファンクションでフラグズからファイルディスクリプタを読まなければいけません。

flag.Parse()

そして、リクエストのハンドラを準備します。ここで色々なコードが入れられます。

http.HandleFunc(nodego.HTTPTrigger, func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "こんにちは!僕はネイティブのGoです!")
})

// もしロギングが要ったらこのしたのコードを使ってください。

http.HandleFunc(nodego.HTTPTrigger, nodego.WithLoggerFunc(func(w http.ResponseWriter, r *http.Request) {
    log.Println("これはGoのメッセージです!")
}))

最後は、NodeJS のプロセスの役目を続きます。

nodego.TakeOver()

完成の例は examples のフォルダーに入っています。

注目に値すること

このプロジェクトは GOPATH の外で使うにデザインされたから、"./nodego" のインポートは名前の前に ./ があってローカルなんです。他のライブラリーを普通にインポートすればいいです。

テスティング

ターミナルで make godev をしてから、ブラウザで localhost:8080 をみてください。他のポートやアイピーをつかいたかったら、ターミナルで go run main.go -addr=localhost:8080 をしてください。

デプロイメント

ファンクションを準備できたら、ターミナルで make をしてください。そうしたら、自動にコードがコンパイルして、パッケージして、function.zip のファイルが出ます。下の画像で赤い四角形でハイライトしている設定を確認して、"ZIP file" のボックスで先出たファイルを選択して、"Create" のボタンをクリックしてからファンクションがデプロイします。

ja-gcf-screenshot-1.png

まとめ

メリット

  • Go は NodeJS より速くて、安全です。
  • NodeJS の環境で使えない基本機能は Go で使えます。(例えば fs)
  • 他のブートストラップの方法よりきれいで、いいです。

デメリット

  • 今はウェブのトリガーしか使えません。

編集:7月から Storage Bucket や PubSub Topic のトリガーが使えるになりました!https://qiita.com/ssttevee/items/5c72edd24be266a32515

終わり

Thanks for reading!

読んでくれてありがとう!