本記事の内容
Cloud FunctionsでGo言語を使用してCloud Pub/Subへ送信されたデータを受信します。
動機
2019/1/17にCloud Functions環境でのGo言語のサポートが発表された。リンク先にはCloud Pub/Subからデータを拾うサンプルがなかったので、実際に作成してみました。
開発環境
プロジェクトに付属しているCloud Shellを使用します。
まずはバージョンの確認です。
$ go version
go version go1.11 linux/amd64
次はgcloudツールのアップデートとベータ版ツールのインストールをします。
# gcloud components update && gcloud components install beta
実装
Pub/Subトピックの作成
まずはCloud Pub/Subでトピックを作成します。
$ gcloud pubsub topics create YOUR_TOPIC
Created topic [projects/YOUR_PROJECT/topics/YOUR_TOPIC].
「APIを有効にしてください」的なエラーが出た場合はWEBのコンソールより有効にしてください。
Cloud Functionsへのデプロイ
ソース格納用のディレクトリ作成します。
$ mkdir testpubsub && cd testpubsub
Goの実装をします。
package sample
import (
"context"
"log"
"encoding/json"
)
//Pub/Subからのメッセージは"data"にバイト列で入るらしい。構造体のバインドをもっと上手に
//やる方法を模索中
type PubSubMessage struct {
Data []byte `json:"data"`
}
type Info struct {
Name string `json:"name"`
Place string `json:"place"`
}
// Pub/Subからメッセージを受診したらこの関数が起動する
func HelloFromPubSub(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("こんにちは、%sさん!%sへCloud Pub/SubからFunctions経由で愛をこめて。", i.Name, i.Place)
return nil
}
main関数をGCPで実行する感じで実装していけます。Pub/SubからはJSON形式のテキストメッセージが来ると想定して実装しています。
実装が終わったらデプロイしていきます。
$ gcloud functions deploy HelloFromPubSub --runtime go111 --trigger-topic YOUR_TOPIC
・・・(省略)
status: ACTIVE
・・・(省略)
「APIを有効にしてください」的なエラーが出た場合はWEBのコンソールより有効にしてください。
status: ACTIVEと出て入れば準備オッケーです。だいたい2分くらいでデプロイが完了します。
お次はPub/Subへメッセージを投げてみましょう。
$ gcloud pubsub topics publish YOUR_TOPIC --message '{"name":"YOUR_TOPIC" ,"place":"YOUR_PLACE"}'
messageIds:
- 'XXXXXXXXXXXXXXX'
最後にログメッセージを確認します。
$ gcloud functions logs read --limit 50
LEVEL NAME EXECUTION_ID TIME_UTC LOG
D HelloFromPubSub 365626939064089 2019-01-23 07:57:47.764 Function execution started
HelloFromPubSub 365626939064089 2019-01-23 07:57:47.765 2019/01/23 07:57:47 こんにちは、YOUR_NAMEさん!YOUT_PLACEへCloud Pub/SubからFunctions経由で愛をこめて。
D HelloFromPubSub 365626939064089 2019-01-23 07:57:47.766 Function execution took 2 ms, finished with status: 'ok'
出力できていることが確認できました。
所感
デプロイがものすごく早くてびっくりしました。思っていたより簡単に作成できます。
ログを見る限りPub/Subからメッセージを拾ってくるだけであれば0.02秒で完了しています。
Goとは関係なくCloud Funtionsの特徴ですが、Pub/Subにメッセージが無い時はリソースが消費されないのが素晴らしいですね。今までは定期的にメッセージが無いか確認をしていたのでどうしてもコンピューティングリソースが発生し課金を行っていました。Dataflowで作っている一部の処理をCloud Functionsへ移管を検討したいと思いました。