Logics Appsの紹介と利用例~電子書籍ファイルのOneDriveへの集約

Posted by 技術ブログ by Strawhat.net on Thursday, December 21, 2017

これは、Microsoft Azure Advent Calendar 2017の21日目です。 明日は@kencharosさんが担当されます。

LogicAppsとは

LogicAppsはクラウドやオンプレミスのサービス、システムを統合できるワークフローを提供するAzureのサービスです。

ワークフローには、その開始条件を定義するトリガーと、その後の処理を定義するアクション、そしてアクションの実行を制御するループ・分岐などの制御が含まれます。 トリガーに該当するイベントが発生するとワークフローが実行されて、制御に従いながらアクションを順に実行されます。

ワークフローは、ビジュアルデザイナーで視覚的に定義できて、コードを書く必要がありません。多種多様なテンプレートも提供されているので、それに合えばパラメータを設定するだけでも定義できます。

トリガーとアクション

トリガーおよびアクションは、コネクタと呼ばれるサービスやデータにアクセスする部品を用います。 コネクタはLogicAppsが提供するマネージドコネクタと、自分で開発するカスタムコネクタ・カスタムAPIがありますが、 コネクタの一覧にあるように マネージドコネクタは多くの種類が提供されていて、これを使うだけでも十分かと思います。

たとえば、トリガーには以下のようなものがあります。

  • HTTPのリクエストを受信したとき
  • Twitterで新しいツイートを受信したとき
  • タイマーによる繰り返し
  • 電子メールを受信したとき
  • OneDrive・Dropboxでファイルが作成されたとき
  • ServiceBus・EventHubでメッセージを受信したとき

そして、アクションには以下のようなものがあります。

  • HTTPリクエストを送信する
  • Azure Functionsを呼び出す
  • Azure Blob Storageを操作する
  • SQL Databaseにアクセスする
  • Salesforceにアクセスする
  • JSONを解析する

また、カスタムコネクタ・カスタムAPIはREST APIとして開発すればいいので、それほど難しくないかと思います。 カスタムコネクタ・カスタムAPIの開発はまた別の記事で紹介したいです。

これらを組み合わせることで、例えば「CSVファイルの添付された電子メールを受信したら、添付ファイルを解析して、内容をSQL Databaseに登録して、Slackのチャネルに通知する」ような処理を構築できます。

フロー制御

LogicAppsでのフロー制御として、以下が提供されていて、より複雑なワークフローを定義できます。

  • 条件分岐
  • Switch Case
  • For Each
  • Do Until
  • Scope

これらの制御構造は並列に分岐して実行するバージョンもあります。 例えば、複数のURLに同時にHTTPリクエストを送信することもできます。 詳しくは、別の記事でまとめたいと思います。

LogicAppsの実装例

LogicAppsの実装例として、Dropboxに作成されたファイルをOneDriveに転送するワークフローを定義します。

脱線ですが、このワークフローを定義してみた背景を少々。クラウドストレージに電子書籍を転送してくれる ショップがありますが、対応しているクラウドストレージがDropboxばかりで、Office 365 Soloで1TBの OneDriveを確保している自分にとっては、DropboxとOneDriveの両方を維持することに不便に感じていました。 電子書籍リーダはOneDrive対応のアプリを利用しているので、DropboxからOneDriveへ電子書籍を転送することができれば、 アプリでそれぞれの電子書籍ショップに対応できますし、Dropboxの有料プランを契約しなくてもよくなりコスト的にも助かります。

実は、DropboxからOneDriveへの転送はテンプレートに含まれているのですが、今回はまっさらな状態から作ってみます。

リソースグループにLogicAppsのリソースを作成

まず、リソースグループを作成して、LogicAppsを作成します。 リソース一覧にはLogic Appと出てくるので、検索での絞り込みには注意してください。

作成されたLogicAppsで、テンプレートから「空のロジックアプリ」を選びます。

Dropboxコネクタの配置

次に、最初の箱にdropboxと入力してDropboxコネクタを探します。Dropboxのトリガーとアクションが表示されますが、 トリガーから「ファイルが作成されたとき」を選択します。 作成されたトリガーの箱にサインインボタンが表示された場合は、サインインしてアクセスを承諾します。 もし、トリガーの箱でエラーメッセージが表示された場合は、後述の対策を参照してください。

すると、パラメータを入力する欄が表示されるので、監視対象のフォルダと、監視間隔を設定します。

OneDriveコネクタの配置

「+新しいステップ」から「アクションの追加」を選びます。Dropboxと同様にOneDriveのコネクタを検索して、 「ファイルを作成する」を選択します。もし、サインインを求められたら、サインインしてアクセスを承諾します。

パラメータを設定する欄が表示されたら、作成先のフォルダと、ファイル名、あとファイル内容を指定します。 ファイル名、ファイルコンテンツは、ワークフローで先に実行されるコネクタのプロパティを利用できるので、 「以前の手順からパラメータを挿入」にある「ファイルが作成されたとき」から対応する項目を選択して設定します。

保存ボタンをおせば、ワークフローが完成です。さっそく、実行してみましょう。

O’Reilly Japan Ebook Storeの購入済みの商品からDropboxに送信してみます。

LogicAppsの概要には、トリガーの起動の履歴と、ワークフローの実行結果が表示されます。

実行の履歴に成功と表示されて、無事に動きました!

実行の履歴を選択すると、ワークフローのトリガー・アクションの実行結果をそれぞれ確認できます。

…あれっ?OneDriveの出力の本文で、Nameが化けていますね。

OneDriveのフォルダを見ると、どうもファイル名がおかしいです。

このファイル名の文字化けへの対応策は、次章で説明します。

LogicAppsの不具合への対策

LogicAppsで不具合と思われる現象がいくつか(いくつも?)あります。 今回のDropboxからOneDriveへのファイル転送の例で遭遇する不具合への対策方法を説明します。

APIへの接続でのエラーメッセージ

DropboxやOneDriveなどのコネクタのように、APIに接続するコネクタを、配置したとき、エラーメッセージが 表示されるときがあります。

これは、リソースグループに戻って、それぞれのAPI接続のリソースから接続すると解消されます。

ファイル名の文字化け

Dropboxに日本語のファイル名のファイルが作成されたとき、その情報を元にOneDriveに作成されたファイルのファイル名が文字化けする問題があります。 この問題は、Dropbox-OneDriveの組み合わせだけでなく、他のコネクタの組み合わせでも見られるようです。

この文字化けは、Dropboxコネクタの「ファイルメタデータの取得」アクションを利用して、その結果に含まれるファイル名を利用すると回避できます。

まず、Dropboxコネクタの「ファイルが作成されたとき」トリガーの直後に、Dropboxコネクタの「ファイルメタデータの取得」アクションを追加します。 ファイルのパラメータは、トリガーのファイル識別子を設定します。

そして、OneDriveコネクタの「ファイルの作成」アクションで、ファイル名のパラメータに、「ファイルメタデータの取得」アクションのNameを設定します。

ワークフロー全体はこの通りです。

では、保存してから、Dropboxにファイルを送信してみましょう。

ワークフローの実行の履歴に成功と表示されて、そのアクションの実行履歴には正しく日本語のファイル名が表示されています。

OneDriveのフォルダにも、正しい日本語のファイル名でファイルが作成されました。

最後に

LogicAppsを利用すると、クラウドやオンプレミスのサービスを統合するワークフローを手軽に定義できます。 コネクタが標準で提供されていないサービスとの連携も、コネクタを自作することで対応できますので、応用の幅は広いのではないかと思います。

なお、今回作成したDropboxからOneDriveへのファイル転送ワークフローは、実際にはMicrosoft Flowで定義して利用していますが、 文字化けへの対応は同じ手順を使えますので、参考にしてください。

LogicAppsに関する情報は、また今後の記事で紹介したいと思います。