LoginSignup
25
18

More than 5 years have passed since last update.

Cloud FunctionsでGo言語を使ってCloud Pub/Subから値を取得する

Last updated at Posted at 2019-01-23

本記事の内容

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の実装をします。

hello_from_pubsub.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へ移管を検討したいと思いました。

25
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
18