雑コラBotを作ろう②: Azure FunctionsのQueue Storage バインドでSlack のメッセージをQueue Storageに格納する

LINEで送る
Pocket

Michaelです。

「雑コラBOT」の作成の過程からAzure Functionsの設定方法を紹介する「雑コラBotを作ろう」の2回目です。

前回は、Azure FunctionsでSlackのオウム返しBOTを作成しました。今回は、Azure Functions同士を連携するために、受けたメッセージからURLを抽出してQueue Storageに格納する仕組みを追加します。

 

<h2>構成</h2>

Azure Functionsで受けたSlackのメッセージにURLが含まれる場合に、URLを抽出してメッセージとともにQueue Storageに格納します。

 

 

<h2>バインド設定</h2>

前回作成した関数に出力バインドを追加します。

関数の「統合」メニューで「+新しい出力」をクリックし、「Azure Queue Storage」のバインドを選択します。

「Azure Queue Storage output」の設定でキューを格納するStorage Accountとキュー名を設定し、保存をクリックします。

 

 

 

<h2>パッケージのインストール</h2>

メッセージを連携する画像処理用Functionでは、画像をBlob Storageに保存します。保存パスには、ランダムな文字列としてuuidを設定するため、「uuid」のパッケージをインストールします。

関数の「プラットフォーム機能」メニューで「高度なツール(Kudu)」をクリックします。

 

 

Kuduの画面で「Debug Console」→「CMD」を選択してコンソールを開き、パッケージをインストールする関数のディレクトリまで移動してnpmの初期化を実行します。

 

npm init

 

npmの初期化を行ったら「uuid」のパッケージをインストールします。

 

npm install –save uuid

 

 

<h2>スクリプト</h2>

スクリプトは以下のように作成しました。

<h2>スクリプトの説明</h2>

  1. パッケージの読み込み

必要なパッケージを読み込みます。

 

  1. 特定文字のアンエスケープ関数

クエリのアンパサンド等decodeURIComponentでエスケープされてしまう文字をアンエスケープします。

 

  1. メッセージ内のURLを抽出

正規表現を使って、メッセージ内のすべてのURLを配列として抽出します。

メッセージはURLエンコードされているため、デコードとアンエスケープをしてからURLを抽出します。

 

  1. メッセージ内のURL有無のチェック

メッセージ内にURLがない場合は処理を中断します。

 

  1. メッセージとURLをJSONで配列に格納

メッセージをQueue Storageバインドに渡すために、URLごとにメッセージとURLをJSON化して配列に格納します。

Queue Storageバインドに配列を渡すと、要素ごとにキューを追加できるため、複数URLが投稿された場合でも対応できます。

 

  1. Blob出力パスの設定

URLを解析して画像を保存するBlob Storageのパスを設定します。保存パスは「{uuid}/{ファイル名}」の形になるようにしています。

 

  1. メッセージをQueue Storageに出力

メッセージ内容、URLのJSONをQueue Storageに追加します。

 

 

<h2>実行結果</h2>

Slackの設定したチャンネルにまずはURLでないテキストを投稿します。

前回同様に「テスト」のテキストを投稿しても、BOTからのレスポンスはありません。

 

 

続いてURLを投稿すると、BOTから開始のメッセージが返されました。

 

 

Azure Storageを確認すると、Slackにメッセージを投稿した同時刻に、指定したキューにメッセージが格納されていることがわかりました。

 

 

 

<h2>まとめ</h2>

Queue StorageはAzure Functionsの関数間連携の方法として一般的なものとなります

出力バインドにより容易にメッセージを追加でき、それトリガーに他の関数を発火できるため、関数間連携としてきわめて容易に構成することができます。

次回は、Slackに投稿した画像のURLをもとに画像のダウンロードとBlob Storageへの保存を行う関数を作成し、今回作成したキューメッセージで連携させてみます。

LINEで送る
Pocket