はじめに
今回はAzureが提供する統合ソリューションである「Azure Logic Apps」について説明します。ノンプログラミングでアプリケーションを構築する方法とその概念について説明していきます。
Azure Logic Appsとは
Azure Logic Appsは、企業や組織の間でアプリケーションやデータ、システム、サービスなどを統合する際に使用できるAzureのサービスです。Azure Logic Appsでは、コネクタを繋いで処理フローを作成することで統合アプリケーションを作成していきます。コネクタとは前述したアプリケーションやデータ、システム、サービスなどのコンポーネントのことを指しており、Azure Logic Apps上で扱いやすくするためにコネクタとして粒度が揃えられています。
Azure Logic Appsの最大の特徴は、アプリやシステムの統合をGUI(Azureポータル)上で完結して行うことができる点にあります。従来のようにエンジニアやプログラマがプログラミング言語を駆使して統合を行うのではなく、GUI上でコネクタを組み合わせていくことでアプリケーションを作成していきます。これを可能にしているのが豊富に用意されているコネクタです。現在Azure Logic Appsで使用可能なコネクタは200種類を超えており、各コネクタから提供される設定項目を入力していくことで振る舞いを定義していきます。
Azure Logic Appsで使用できるコネクタの例
前述の通り、Azure Logic Appsで使用できるコネクタは200種類以上あります。コネクタの多くは、Microsoftやサードパーティのアプリケーションやサービスをコネクタとして扱える形にしたものです。Microsoft製のものでは、OutlookやOffice365やOneDriveなどのコネクタがあります。サードパーティ製のものでは、GoogleやTwitter、Salesforce、Dropboxなどのサービスのコネクタが提供されています。
これらのコネクタは、処理の入力元としても出力先としても使用できるようになっており、例えばOneDriveやDropboxなどのクラウドストレージのコネクタの場合は、入力元として使用する際は「ファイルがアップロードされた」ことをきっかけに処理を開始することができ、出力先として使用する際はLogic Appsで処理されたデータを保存するような、通常のストレージとしての使い方ができるようになっています。
また条件分岐や繰り返しなどの処理フローを制御するコネクタがLogic Appsから提供されているため、通常のプログラミング言語を使ったコーディングと同等のアルゴリズムで処理を記述していくことが可能となっています。
Azure Logic Appsを使うシチュエーション
これまでの説明の通り、Azure Logic Appsではコネクタ同士の連携を基本として統合アプリケーションを作成していくことになります。そのため、比較的単純で定型的な作業を自動化したい要望がある場合の選択肢としてマッチします。例えば、申請書や報告書の承認リレーのような社内のワークフロー業務をAzure Logic Apps上に構築することで日々の業務負荷を軽減し、生産性を向上することができるかもしれません。
Azure Logic Appsに類似した統合ソリューションとして、IFTTT(イフト)というサービスがあります。IFTTTもアプリケーションやシステム同士を連携してひとつのアプリケーションを作成していく点はAzure Logic Appsと同じですが、IFTTTはシンプルな連携方法の提供がコンセプトとしてあるため連携元と連携先のアプリを1対1でしか指定できなかったり、中間に処理や制御を差し込めなかったりと制約が多いことが特徴として挙げられます。一方でAzure Logic Appsにはこれらの制約はないため、IFTTTと比較すると柔軟な統合アプリケーションを作成することができます。
Azure Logic Appsを使ってアプリを作ってみよう
ここからは実際にAzureポータル上でAzure Logic Appsを操作して、アプリケーションを作成していきます。
Azure Logic Appsのテンプレートを使ってツイートをSlackに通知してみよう
まずは非常に簡単な連携からはじめましょう。Twitterに投稿されているツイートから検索キーワードに一致するツイートを取得して、Slackに通知するというアプリケーションを作成していきます。この組み合わせは、Azure Logic Appsにテンプレートとして用意されているので、それを使用して作成します。
まずは「ロジック アプリ」というAzure Logic Appsのアプリケーションの枠を作成します。Azureポータルにログインし、左側のメニューから「すべてのサービス」を選択し、検索フィールドに「ロジック」と入力してロジック アプリを選択します。
選択後、画面上部の「追加」ボタンあるいは、画面中央の「ロジック アプリ の作成」ボタンからロジック アプリの新規作成画面に遷移します。
新規作成画面で必須項目を入力していきます。「名前」はこのロジック アプリの名称ですので分かりやすい名前を、「サブスクリプション」はお手持ちのものを選択します。「リソースグループ」は任意のリソースグループを選択あるいは新規作成します。「場所」はAzure Logic Appsが実行されるリージョンですので、任意の場所を選択します。「Log Analytics」はAzure Logic Appsのログの監視に使えるサービスですが今回は「Off」を選択します。ここまで入力したら、画面下部の「作成」ボタンを選択してロジック アプリの作成を開始します。
しばらく待つとロジック アプリの作成が完了します。ロジック アプリの画面に移動すると、「Logic Apps デザイナー」という画面が表示されます。「Logic Apps デザイナー」は、Azureポータル上でロジック アプリの具体的な処理を記述していくためのGUIエディタです。現在はロジック アプリの作成直後で何も処理を記述していないため、作業を開始するためのクイックスタート画面が表示されています。ここでは、処理の開始地点にあたる「トリガー」を選択するか、Azureから提供されているテンプレートを選択して作業を開始することができます。今回はテンプレートの一覧から、「新しいツイートがハッシュタグと一致する場合にSlack投稿する」というテンプレートを選択します。
テンプレートを選択するとテンプレートの説明ダイアログが表示されるので、内容を確認して「このテンプレートを使用する」ボタンを選択します。するとLogic Apps デザイナーの表示内容が更新され、TwitterとSlackのコネクターが表示された画面に切り替わります。
この段階ではTwitterとSlackの双方にログインしていないため、まだロジックアプリを実行することができません。お手持ちのアカウントを使ってそれぞれのサービスにログインします。Logic Apps デザイナーの各コネクタの右側にある「サインイン」ボタンを選択して、サービスにログインします。まずはTwitterの「サインイン」ボタンを選択するとTwitterの認証画面が表示されるので、Twitterで登録したユーザー名かメールアドレスとパスワードを入力して「連携アプリを認証」ボタンを選択します。
認証に成功するとLogic Apps デザイナーに戻ります。Twitterコネクタが認証済みの状態となり、アカウント名が表示されるようになります。同じ要領でSlackへのログインも行います。
Slackはワークスペース単位でアカウントが存在するので、まずはログインするワークスペース名を入力します。その次の画面でメールアドレスとパスワードを入力し、最後にAzure Logic Appsとの連携の確認画面が表示されるので「Authorize」ボタンを選択して連携を完了させます。
以下の図はTwitterとSlackの双方へのログインが完了した後のLogic Apps デザイナーの画面です。双方のコネクタが認証済みとなっており、「続行」ボタンが選択可能な状態になっています。
「続行」ボタンを選択するとTwitterとSlackのコネクターが展開され、詳細な設定を行えるようになります。Twitterのコネクタでは取得したいツイートに含まれる検索キーワードを設定することができます。ここでは、「#Azure」を「検索テキスト」のフィールドに入力します。Slackのコネクタでは取得したツイートの通知先となるチャネルを設定します。「チャネル名」のドロップダウンリストにはログインしたSlackのワークスペースに含まれる公開チャネルの一覧が表示されるので、その中から通知を送りたいチャネルを選択します。
なお、Azure Logic Appsのコネクターは「トリガー」と「アクション」という2種類の役割に分かれています。トリガーは処理の開始点となるコネクタのことで、Azure Logic Appsで処理する元となるデータの取得を行います。アクションはトリガーや他のアクションからデータを受け取ってデータの加工などの処理を行うコネクタです。このトリガーとアクションを繋ぎ合わせて一連のワークフローを構築していく作業が、Azure Logic Appsにおける開発になります。
ここまで入力したら、Logic Apps デザイナーの左上にある「保存」ボタンを選択して設定した内容を保存します。保存をすると同じレーンにある「実行」ボタンが選択できるようになります。実行ボタンを選択すると作成したロジック アプリが実行されます。実行ボタンを選択してロジック アプリを実行してみましょう。しばらく待つとロジック アプリが実行され、Slackに通知が送信されます。
Logic Apps デザイナー上では実行結果が表示されています。各コネクタでかかった実行時間と、処理の成否を確認することができます。またコネクタを選択すると詳細な処理内容を確認することもできます。
ここまででテンプレートを使用してロジック アプリを実行するところまで行うことができました。TwitterとSlackという異なるサービスの連携を、Logic Apps デザイナーを使うことで一切のコーディング作業なしで行うことができることが分かりました。
なお、このロジック アプリは定期的に実行されています。一時的に実行を停止したい場合はロジック アプリのダッシュボード画面の「無効」ボタンを選択することで一時停止することができます。再開したい場合は「有効」ボタンから再開することができます。
ロジック アプリのダッシュボード画面へは、Logic Apps デザイナー画面を左スクロールするか、Azureポータルで「すべてのサービス」からロジック アプリを選択するなどして遷移することができます。
Cognitive Service、Functionsと連携してツイートの感情を分析してみよう
ここからは上記のセクションで作成したTwitterとSlackを連携したロジック アプリを拡張して、ツイートの内容から感情を分析してその分析結果もSlackへ通知できるようにしてみます。
感情の分析を行うために、Azureの人工知能APIである「Cognitive Services」の言語解析APIを使用します。Cognitive Servicesの言語解析APIには、文章からセンチメント(感情)を評価することのできるAPIが用意されているので、それを使用します。なおCognitive Servicesには、言語解析の他にも画像解析や音声解析などの人間のコミュニケーション手段に対する分析を行うことができるAPIが多数用意されています。
Cognitive Servicesの言語解析APIが評価した感情のスコアは数値として出力されるので、分かりやすくするために3段階の評価にマッピングしていきます。良い(GREEN)、普通(YELLOW)、悪い(RED)という評価に数値をマッピングするために、Azure Functionsを使います。Azure FunctionsもAzure Logic Appsと同様に、ある入力値を受け取ると定義されているロジックに従って処理を実行して結果を出力するサービスですが、プログラミング言語によってロジックを定義していく点がAzure Logic Appsと異なります。Azure Logic AppsではAzure Functionsもひとつのコネクタとして使用できるため、プログラミングで処理する方が適している箇所についてはAzure Functionsで行うといった柔軟な対応が可能となっています。
まずは、Cognitive Servicesの作成から行います。Azureポータルから「すべてのサービス」を選択し、検索フォームに「cognitive」と入力するとCognitive Servicesが表示されるので選択します。
Cognitive Servicesの画面に移動したら、左上の「追加」ボタンあるいは画面中央の「cognitive servicesの作成」を選択します。
「AI + Machine Learning」という画面に移動するので、検索フォームで「text」と入力して検索し、「テキスト分析」を選択します。Cognitive Serviceを作成する際は、このように使用するAPIの種類を選択する必要があります。今回は言語解析を行いたいため、対応するText Analytics APIを選択します。選択するとText Analytics APIの説明画面が表示されるので、画面下部の「作成」ボタンを選択します。
Text Analytics APIの作成画面に遷移するので必要な情報を入力します。「Name」には任意の名称を、「サブスクリプション」、「場所」、「Resource group」も任意のものを選択します。「価格レベル」は無料で使用できる「F0」を選択します。
作成画面下部の「作成」ボタンを選択してText Analytics APIの作成を開始します。しばらく待って、作成が完了することを確認します。 続いて、Azure FunctionsでCognitive Servicesで分析した感情のスコア値を3段階の値にマッピングする関数を作成していきます。Azureポータルで「リソースの作成」から「Serverless Function App」を選択します。
Function Appの作成画面が表示されるので、必要な情報を入力していきます。「アプリ名」には任意の名称を、「サブスクリプション」、「リソースグループ」、「場所」には任意のものを選択します。「OS」はWindowsを選択し、「ホスティングプラン」は従量課金プランを選択します。「ランタイム スタック」はコーディングに使用する言語を決める部分です。今回は「JavaScript」を選択します。「Storage」はFunction Appのコードを保存する場所になるので新規作成を選択します。ログの収集や分析に使用する「Application Insights」は今回はオフにします。
項目を入力したら画面下部の「作成」ボタンを選択してFunction Appの作成を開始します。作成が完了したら、Function Appに移動して関数を定義していきます。左側のメニューから「関数」を選択し、「新しい関数」を選択します。
関数のテンプレート選択画面が表示されるので、「HTTP trigger」を選択して関数の名前と承認レベルを選択して「作成」ボタンを選択します。関数の名前には任意の名前を、承認レベルは「Function」を選択します。
関数の作成が完了すると、コードエディタが表示されます。ここに表示されているコードを、以下のリストの内容で置き換えて「保存」ボタンを選択します。
感情のスコア値をカテゴリー名に変換する関数
// Function Appの関数定義・・・①
module.exports = async function (context, req) {
// マッピングされる感情のカテゴリーを初期値「GREEN」で定義・・・②
let category = "GREEN";
// Cognitive ServicesのText Analytics APIから連携された感情のスコア値が「req.body」に含まれているので、値によって感情のカテゴリーを切り替える・・・③
if (req.body < 0.3) {
category = "RED";
} else if (req.body < 0.6) {
category = "YELLOW";
}
// この関数のレスポンスボディに感情のカテゴリをセットする・・・④
context.res = {
body: category
};
};
関数の1行目はFunction App特有の関数定義です(①)。引数になっている「context」はFunction Appで関数を作成する場合に必須となるオブジェクトで、関数間でデータを受け渡す際などに使用します。もうひとつの引数の「req」は、HTTP trigger特有の引数で、HTTPヘッダーやHTTPボディなどのHTTPリクエストに関する情報が含まれています。
この関数では、ツイートの感情をCognitive ServicesのText Analytics APIによって分析した結果(スコア値)を、数値形式で受け取ることができます。値は引数reqのbodyプロパティに含まれます(③)。感情のスコア値は1.0に近いほど良好で、0.0に近くなるほど悪くなるため、0.3未満の場合「RED」、0.3以上0.6未満の場合「YELLOW」、0.6以上の場合「GREEN」というカテゴリーになるように定義しています。カテゴリーは「category」という変数に代入します(②)。
スコア値をカテゴリーに振り分けたら、カテゴリーを関数の外部でも使用できるように関数の戻り値に含めます。Function Appの関数では、通常の関数のようにreturn文で戻り値を返すのではなく、contextオブジェクトにデータをセットすることでデータを関数の外部に連携します(④)。HTTP triggerの場合は、contextのresプロパティにJSONをセットすることでデータを連携することができるようになります。
この関数が正常に動作することをテストするために、コードエディタの右側にある「テスト」メニューを選択します。テストのメニューにある「要求本文」のフィールドにあらかじめ入力されている内容を削除して「0.2」などの値を入力して「実行」ボタンを選択します。実行が完了すると「出力」フィールドに関数の実行結果が表示されます。要求本文の値を変えて、正しくカテゴリーに変換されるかテストしてみて下さい。
テストが正常に実行できれば、Azure Functionsでの作業は完了です。Azure Logic Appsに戻ってCognitive ServicesとAzure Functionsをロジックアプリに追加していきます。
前項で作成したロジック アプリのダッシュボードに移動し、左側のメニューから「ロジック アプリ デザイナー」を選択してデザイナーを表示します。TwitterとSlackのコネクタを繋ぐ矢印上にマウスカーソルを乗せると、「+」マークが現れるので選択すると「アクションの追加」、「並列分岐の追加」の選択ダイアログが表示されます。
ここではまずツイートから感情のスコア値を算出する処理を追加したいので、「アクションの追加」を選択します。するとアクションの選択画面が表示され、追加できるアクションの一覧が表示されます。アクションの検索フォームに「text」と入力して「テキスト分析」のコネクタを選択します。
テキスト分析のコネクタを選択すると、アクションの選択を求められるので「感情の検出」を選択します。
「感情の検出」アクションまで選択すると、Cognitive Servicesの接続情報を入力する項目が表示されます。ここには、先程作成したText Analytics APIの情報を入力していきます。ブラウザの別タブなどでAzureポータルをもう1つ表示して、Cognitive Servicesから先程作成したText Analytics APIのダッシュボードに移動します。まずはここに表示されている「Endpoint」のURLをコピーします。
続いて、ダッシュボードの左側メニューから「Keys」を選択すると、APIのキーを参照することができるので、ここに表示されている「NAME」と「KEY 1」に表示されている文字列をコピーします。
ロジック アプリ デザイナーを表示しているブラウザのタブに戻って、コピーした内容を貼り付けていきます。以下の図のように内容を入力したら、「作成」ボタンを選択します。
作成が完了するとコネクタの内容が変わり、感情を分析する項目を選択できるようになります。入力フィールドをクリックすると、デザイナーの右側に「動的なコンテンツ」の選択画面が表示されます。動的なコンテンツには、ロジック アプリの実行時に値が決まる項目の一覧が表示されています。ここでは、ツイートの内容を分析するので、「ツイート テキスト」を選択します。
これでツイートの内容から感情を分析できるようになりました。次はAzure Functionsのコネクタを追加していきます。「感情の検出」コネクタとSlackコネクタの間の矢印にマウスカーソルを乗せて、「アクションの追加」を選択します。一覧から「Azure Functions」を選択します。
選択すると使用できるFunction Appの一覧が表示されるので、その中から先程作成したFunction Appを選択します。
Function Appを選択するとさらにその中に含まれる関数の一覧が表示されるので、対象の関数を選択します。ここまで選択するとAzure Functionsのコネクタがデザイナー上に表示されるようになります。「要求本文」という箇所の入力フィールドをクリックして「動的なコンテンツ」の選択画面を表示します。この中から、感情の検出の「スコア」を選択します。これによって関数の入力値がText Analytics APIで分析したツイートのスコア値になります。
最後に、Slackのコネクタを編集します。Slackのコネクタをクリックし、「メッセージ テキスト」の入力フィールドをクリックします。「メッセージ テキスト」は、Slackで表示されるメッセージに該当します。ここでは、「感情のカテゴリー (スコア値) ツイート内容」の順番でSlack上にメッセージが表示されるように編集していきます。既にフィールドに入力されている「ツイート テキスト」と「ツイート作成者」は一度「☓」をクリックして削除し、「動的なコンテンツ」から「本文」、「スコア」、「ツイート テキスト」の順に選択していきます。
以下の図は、ここまでの内容を設定したロジック アプリの全体図です。この内容でロジック アプリ デザイナーを保存します。
ロジック アプリ デザイナーの「実行」ボタンからロジック アプリを実行してみましょう。なおロジック アプリを一時停止している場合は有効化してから実行して下さい。実行が完了したら、Slackで通知内容を確認してみましょう。
上の図のように、メッセージの先頭に感情のカテゴリーとスコア値が表示されていれば成功です。分析の精度については改善の余地がありそうですが、比較的容易にテキストの分析ができることが分かりました。
まとめ
今回はAzure Logic Appsについて説明しました。本稿の例では一部コーディングを挟みましたが、基本的にはAzureポータル上のGUIに完結して統合アプリケーションを構築することができることが分かったかと思います。プログラミング箇所を極力減らすことのできるAzure Logic Appsを使うことで、アプリケーション開発の敷居がかなり低くなったのではと思います。
WINGSプロジェクト 秋葉龍一 著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中