お題
Google Cloud Functions(Go1.11)のクイックスタートとチュートリアルを通して各機能を確認していく。
今回は、ひとまずクイックスタート。
あと、Goモジュールを使ったプロジェクトのデプロイに関するチュートリアルだけ。
基本的に以下を参考に進めていく。
https://cloud.google.com/functions/docs/
前提
- GCPは知っている。
以下は済んだ上での作業。
- GCPプロジェクトの作成
- Cloud SDKのインストールと初期化・認証
開発環境
# OS
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
# Cloud SDK
$ gcloud version
Google Cloud SDK 244.0.0
# Golang
$ go version
go version go1.11.4 linux/amd64
実践
Quickstart
参考
ソース
[QuickStart/helloworld.go]
package Quickstart
import (
"fmt"
"net/http"
)
func HelloWorld(w http.ResponseWriter, r *http.Request) {
if _, err := fmt.Fprint(w, "Hello, World! (go111)"); err != nil {
fmt.Println(err)
}
}
デプロイと動作確認
$ pwd
/home/sky0621/work/src/go111/src/github.com/sky0621/tips-go/try/gcp/gcfgo/Quickstart
$
$ gcloud functions deploy HelloWorld --runtime=go111 --trigger-http
Deploying function (may take a while - up to 2 minutes)...done.
〜〜 省略 〜〜
$ curl https://us-central1-【GCPプロジェクトID】.cloudfunctions.net/HelloWorld
Hello, World! (go111)
Structured
参考
留意点
Goランタイムの場合、関数はプロジェクトのルートにあるGoパッケージに含まれている必要がある。
関数をmain
パッケージにするのは不可。
サブパッケージは、Goモジュールを使用している場合にのみサポート。
ソース
$ tree
.
├── function.go
├── go.mod
├── go.sum
└── subpkg
└── jsonform.go
[Structured/function.go]
package Structured
import (
"Structured/subpkg"
"encoding/json"
"fmt"
"net/http"
"go.uber.org/zap"
)
var lgr *zap.Logger
func init() {
var err error
lgr, err = zap.NewProduction()
if err != nil {
panic(err)
}
}
func StructuredHello(w http.ResponseWriter, r *http.Request) {
var jf subpkg.JsonForm
if err := json.NewDecoder(r.Body).Decode(&jf); err != nil {
lgr.Error(err.Error())
}
if _, err := fmt.Fprintf(w, "Hello, %s(%s)", jf.Name, jf.ID); err != nil {
lgr.Error(err.Error())
}
}
[Structured/subpkg/jsonform.go]
package subpkg
type JsonForm struct {
ID string `json:"id"`
Name string `json:"name"`
}
デプロイと動作確認
$ pwd
/home/sky0621/work/src/go111/src/github.com/sky0621/tips-go/try/gcp/gcfgo/Structured
$
$ gcloud functions deploy StructuredHello --runtime=go111 --trigger-http
Deploying function (may take a while - up to 2 minutes)...done.
〜〜 省略 〜〜
$ curl -X POST \
> https://us-central1-【GCPプロジェクトID】.cloudfunctions.net/StructuredHello \
> -H 'Content-Type: application/json' \
> -H 'cache-control: no-cache' \
> -d '{
> "id": "001",
> "name": "Sato"
> }'
Hello, Sato(001)