手順
1. Github のリポジトリに Functions のコードを準備する
サンプルコードは Pub/Sub で公開されたメッセージと属性を出力するだけの単純な関数。
example/function.go
package example
import (
"context"
"encoding/json"
"log"
"cloud.google.com/go/pubsub"
)
// User JSONデコード用の構造体.
type User struct {
Name string `json:"name"`
}
// HelloPubSub Pub/Subからトリガーされる関数.
func HelloPubSub(ctx context.Context, m *pubsub.Message) error {
// メッセージの出力
var user User
if err := json.Unmarshal(m.Data, &user); err != nil {
log.Fatal(err)
}
log.Println("Hello,", user.Name)
// 属性の出力
if len(m.Attributes) > 0 {
for k, v := range m.Attributes {
log.Println("key:", k)
log.Println("value:", v)
}
}
return nil
}
同じ階層に go.mod も必要。
example/go.mod
module github.com/mt-village/cloud-func-exampl
go 1.11
require cloud.google.com/go/pubsub v1.3.0
サンプルはこちら > mt-village/cloud-func-example
2. GCP のリポジトリに同期する
Cloud Source Repositories の「リポジトリの追加」から作成した Github リポジトリを接続。
接続されたリポジトリは github_mt-village_cloud-func-example
のような名前になる。
これで Github 側に入った変更が GCP 側のリポジトリにも同期されるようになる。
3. Pub/Sub のトピックを作成する
Cloud Pub/Sub の「トピックを作成」から新規トピックを作成。
4. Function を作成する
Cloud Functions の「関数を作成」から上記で作成したトピックやリポジトリを選択して新規 Function を作成。
完成
Functions のログを見ると、期待通りの動作をしていることが確認できる。
リポジトリの変更を自動で検知して関数を再デプロイ、というのはやってくれないので、コードを変更したら関数の編集から手動でデプロイボタンを押す必要がある。(自動にして欲しい)