Cloud Pub/Sub のチュートリアル

このシンプルなチュートリアルでは、Cloud Pub/Sub トリガーを用いてCloud Functions のバックグラウンド関数で書き込み、デプロイ、トリガーを行う方法について説明します。

Pub/Sub を初めて使用する場合、詳細については Pub/Sub のドキュメント、特にトピックとサブスクリプションの管理をご覧ください。Cloud Functions での Pub/Sub トピックとサブスクリプションの使用に関する概要については、Google Cloud Pub/Sub トリガーをご覧ください。

目標

費用

このチュートリアルでは、以下を含む、Cloud Platform の有料コンポーネントを使用します。

  • Cloud Functions
  • Pub/Sub

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。

新しい Cloud Platform ユーザーは無料トライアルをご利用いただけます。

始める前に

    https://cloud.google.com/functions/docs/tutorials/pubsub beta cloudfunctions,pubsub Cloud Functions and Cloud Pub/Sub no_credentials
  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud SDK をインストールし、初期化します
  5. gcloud コンポーネントを更新します。
    gcloud components update
  6. 開発環境を準備します。

アプリケーションの準備

  1. ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    または、ZIP ファイル形式のサンプルをダウンロードし、展開します。

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    または、ZIP ファイル形式のサンプルをダウンロードし、展開します。

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git

    または、ZIP ファイル形式のサンプルをダウンロードし、展開します。

  2. Pub/Sub にアクセスするための Cloud Functions サンプルコードがあるディレクトリに移動します。

    Node.js

    cd nodejs-docs-samples/functions/helloworld/

    Python

    cd python-docs-samples/functions/helloworld/

    Go

    cd golang-samples/functions/helloworld/

  3. サンプルコードを見てみましょう。

    Node.js

    /**
         * Background Cloud Function to be triggered by Pub/Sub.
         * This function is exported by index.js, and executed when
         * the trigger topic receives a message.
         *
         * @param {object} data The event payload.
         * @param {object} context The event metadata.
         */
        exports.helloPubSub = (data, context) => {
          const pubSubMessage = data;
          const name = pubSubMessage.data
            ? Buffer.from(pubSubMessage.data, 'base64').toString()
            : 'World';
    
          console.log(`Hello, ${name}!`);
        };

    Python

    def hello_pubsub(event, context):
            """Background Cloud Function to be triggered by Pub/Sub.
            Args:
                 event (dict):  The dictionary with data specific to this type of
                 event. The `data` field contains the PubsubMessage message. The
                 `attributes` field will contain custom attributes if there are any.
                 context (google.cloud.functions.Context): The Cloud Functions event
                 metadata. The `event_id` field contains the Pub/Sub message ID. The
                 `timestamp` field contains the publish time.
            """
            import base64
    
            print("""This Function was triggered by messageId {} published at {}
            """.format(context.event_id, context.timestamp))
    
            if 'data' in event:
                name = base64.b64decode(event['data']).decode('utf-8')
            else:
                name = 'World'
            print('Hello {}!'.format(name))

    Go

    
        // Package helloworld provides a set of Cloud Functions samples.
        package helloworld
    
        import (
        	"context"
        	"log"
        )
    
        // PubSubMessage is the payload of a Pub/Sub event.
        type PubSubMessage struct {
        	Data []byte `json:"data"`
        }
    
        // HelloPubSub consumes a Pub/Sub message.
        func HelloPubSub(ctx context.Context, m PubSubMessage) error {
        	name := string(m.Data)
        	if name == "" {
        		name = "World"
        	}
        	log.Printf("Hello, %s!", name)
        	return nil
        }
        

関数のデプロイ

Pub/Sub トリガーで関数をデプロイするには、サンプルコードがあるディレクトリで次のコマンドを実行します。

Node.js

gcloud functions deploy helloPubSub --runtime nodejs8 --trigger-topic YOUR_TOPIC_NAME
優先する Node.js のバージョンを指定するには、--runtime フラグに次の値を使用します。
  • nodejs6(非推奨)
  • nodejs8
  • nodejs10(ベータ版)

Python

gcloud functions deploy hello_pubsub --runtime python37 --trigger-topic YOUR_TOPIC_NAME

Go

gcloud functions deploy HelloPubSub --runtime go111 --trigger-topic YOUR_TOPIC_NAME
優先する Go バージョンを指定するには、--runtime フラグに次の値を使用します。
  • go111
  • go113(ベータ版)

ここで、YOUR_TOPIC_NAME は関数の登録先となる Pub/Sub トピックの名前です。

YOUR_TOPIC_NAME がまだ存在しない場合、このコマンドにより作成されます。Cloud Console または次の gcloud コマンドを使用して、deploy コマンドを実行する前にトピックを作成することもできます。

gcloud pubsub topics create YOUR_TOPIC_NAME

関数のトリガー

  1. メッセージを Pub/Sub トピックに公開します。この例では、メッセージは関数が挨拶に含める名前です。

    gcloud pubsub topics publish YOUR_TOPIC_NAME --message YOUR_NAME

    YOUR_TOPIC_NAME を Pub/Sub トピックの名前に置き換え、YOUR_NAME を任意の文字列に置き換えます。

  2. 実行した内容が完了していることをログで確認します。

        gcloud functions logs read --limit 50
        

関数内からメッセージを Pub/Sub トピックに公開することもできます。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには、次のようにします。

    console
  1. GCP Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

Cloud 関数の削除

Cloud Functions を削除しても、Cloud Storage に保存されたリソースは削除されません。

このチュートリアルで作成した Cloud 関数を削除するには、次のコマンドを実行します。

Node.js

gcloud functions delete helloPubSub 

Python

gcloud functions delete hello_pubsub 

Go

gcloud functions delete HelloPubSub 

Google Cloud Console から Cloud Functions を削除することもできます。