2019年1月24日木曜日

[GCP][Go][PubSub] Google Cloud FunctionsにGo言語を用いてPubSubからのメッセージをペイロードありで受信

Google Cloud FunctionsにGo言語がきた

公式リリース

上記の公式リリースの通り、Go言語がまだbeta対応であるが、Google Cloud Functionsにやってきた

Cloud functionsはサーバーレスで簡単な関数を実行してくれる仕組みで大変便利です

公式サンプル@githubには、pubsubとGoogle Cloud Functionsを組み合わせた例は無いです

公式チュートリアルには、組み合わせはあるがペイロードを受信する方法が無いです


Google PubSubにTopicを作成

gcloudからコマンドでも実行できるが、今回はAPIを有効化するために、コントロールパネルから実行

有効化したらトピック名を指定して作成

projects/{プロジェクト名}/topics/{トピック名}というトピックが出来上がるので、ここで放置


FunctionsのコードをGo言語で用意する

今回のコードは以下のようなコード

package hello

import (
    "encoding/json"
    "context"
    "log"
)

type PubSubMessage struct {
    Data []byte `json:"data"`
    Attributes map[string]string `json:"attributes"`
}
type Info struct {
    Test1  string `json:"test1"`
    Test2 string `json:"test2"`
}
func HelloPubSub(ctx context.Context, m PubSubMessage) error {
    var i Info

    err := json.Unmarshal(m.Data, &i)

    if err != nil {
        log.Printf("Error:%T message: %v", err, err)
        return nil
    }
    log.Printf("Data: %s:%s", i.Test1, i.Test2)
    log.Printf("Attributes %v", m.Attributes)

    return nil
}

gcloudコマンドでFunctionをアップロード

今回のトピック名はsample_pubsubとしています

gcloud functions deploy HelloPubSub --runtime go111 --trigger-topic sample_pubsub

実行とログ確認

実行コマンド

gcloud pubsub topics publish sample_pubsub --message '{"test1":"Test1" ,"test2":"Test2"}' --attribute name=wrench,name1=name

attributeの設定がわかりづらかったです。キーネームペアで=で結び、カンマで複数設定ができました

ログ確認

gcloud functions logs read --limit 50

ログにDataとAttributeの値が出たら終わりです