Cloud Pub/SubをトリガーにしたCloud Functionsを作りたい

2022.04.11

以前のブログにてBigQueryのデータ転送の結果をslackに通知することを試してみました。

Pub/Subのトピックにサブスクリプションを登録して外部にあるプログラムを実行する形でした(Push型)

今回はCloud FunctionsとPub/Subを連携してslackに通知することを試していきます。

Cloud Functionsで関数を作成

コンソールから関数を作成します。

トリガーにCloud Pub/Subを選び、トピックにはBigqueryのデータ転送に設定したものを選択します。

ランタイム環境変数にSlackのWebhook URLを設定しました。 あとはデフォルトにして先に進みます。

※ ビルド、接続、セキュリティなどの設定は必要に応じて変更します

設定後にソースコードを記述できるエディタのページに遷移します。

お好きなランタイムを選択してコードを記述します。

サンプル)

以前の記事と同じく、messageをデコードしたあとに送信テキストを作成し、@slack/webhookでSlackに送信してみました。

const { IncomingWebhook } = require('@slack/webhook');

exports.helloPubSub = (event, context) => {
  const message = event.data
    ? Buffer.from(event.data, 'base64').toString()
    : 'Hello, World';
  console.log(message);

  const custom_text = `[Cloud Functions] Bigquery データ転送完了通知\nデータソース: ${message.dataSourceId}\n転送先: ${message.destinationDatasetId}->${message.params.destination_table_name_template}\n結果: ${message.state}\n\nPubsubTopic: ${message.notificationPubsubTopic}\n実行開始時間: ${message.startTime}`;

  (async () => {
        await webhook.send({
            text: custom_text,
        });
    })();

  console.log('bigquery transfer completed.')
};

Pub/Subでメッセージを受信後、きちんとトリガーされて上記のように通知されました。

FunctionsのCloud Pub/Subのトリガーですが、GCPの内部ではPush型のサブスクリプションを作成していました。

エンドポイントを外部のリソースを使わずにGCPのサービスを使うことができるのでこちらの方が便利かなという印象です。