AKS + KEDA とTeamsで作るCloud Nativeなアプリケーション

はじめに

Azure Kubernetes Services (AKS) 上にコンテナアプリとして構成し、データベースへの格納と後続処理として処理結果をMicrosoft Teamsへ通知するといったものを作りたいと思います。

本記事は初歩的な内容にはなりますが、応用するとCosmosDBを使ったり、Azure IoT Central からのデータをKEDAで連携させて Azure Synapse Analytics へ渡して分析させたりと幅広い Cloud Native なアプリケーションを組むことができます。

構成

  • Webアプリ
    • WebアプリケーションをDockerコンテナ化してAKSへデプロイ
    • ユーザーからのデータ入力を受け付ける
    • 入力データは Azure Database for MySQL へインサート
    • データ受付して表示させたいメッセージをQueueストレージへインサート
  • Azure Database for MySQL [マネージドサービス]
    • Webアプリで受付したデータの格納用。
  • Queueストレージ [マネージドサービス]
    • WebアプリからTeamsへ通知したいメッセージの格納用。
  • KEDA
    • AKS上でQueueトリガーを利用する
    • QueueトリガーFunctionをAKSへデプロイしてメッセージを取り出す
    • 取り出したメッセージをWebhookでTeamsへ投稿
  • Teams
    • QueueトリガーFunctionからのメッセージを受信してチャネルへ投稿

f:id:tsukatoh:20201211154613p:plain

事前準備(Teams)

incoming webhook をインストールしてTeamsでWebhookを受信できるようにします。

まずTeamsから「…」からアプリを検索で「Incoming Webhook」を選択します。
f:id:tsukatoh:20201211165521p:plain

チームに追加をクリックして通知したいチームを選択します。
f:id:tsukatoh:20201211165722p:plain

通知する対象のチャネルを選択します。
f:id:tsukatoh:20201211165804p:plain

必要事項とアイコンをアップロード(通知されるときに表示されるアイコンになります)して、生成されたURLをコピーしておきます。
これは後ほどアプリ側から通知するのに使います。
f:id:tsukatoh:20201211183700p:plain

Queue Trigger

KEDA で実装するFunctionの構成です。(Webアプリは好みの言語で作ってください)
Queue trigger Functionを作るには以下を参照してください。

tsukatoh.hatenablog.com

作った後に、コードを追記してTeamsへ送信できるようにします。

まずWebhookを扱えるようにrequestをインストールします。

npm install request

func newで作った index.js を以下のように変更します。

module.exports = async function (context, myQueueItem) {
    var request = require('request');

    request.post({
        url: process.env["TeamsWebhookURL"],
        body: JSON.stringify({"text": myQueueItem})
    })

};

local.settings.json には "TeamsWebhookURL" として事前準備で作成したTeamsのWebhook URLを追記します。
以下コマンドを投入してローカルテストします。

func start

待ち状態になったらAzure PortalからQueueを追加して動作確認します。

f:id:tsukatoh:20201211183240p:plain

以下のように投稿されればOKです。

f:id:tsukatoh:20201211184334p:plain

動作に問題なければ前述のリンクのようにfunc kubernetes deploy --nameコマンドを投入してAKSへデプロイしてください。
Webアプリから実行して問題なければKEDAでQueue Triggerの実装が完了です。
Teamsへの投稿はアプリケーションのエラー通知など、管理者への通知にも使えたりと、色々と応用が可能ですので組み合わせを変えたりして実装してみてください。