Azure Blob Storage を Azure Logic Apps でモニタリングする方法

02 April 2018
#Azure#Azure Logic Apps#Azure Functions#Azure Blob Storage

やりたいこと

Azure Blob Storage でブロブが作成・更新されたときに Azure Logic Apps の処理を開始したい。 特に、指定したコンテナのサブフォルダ以下も監視対象にしたい。

方法

Azure Functions を使用します。

流れとしては、Blob Storage の変更を Functions でトリガーして、その変更内容を JSON データとして Logic Apps に POST します。

一応、Logic Apps には Blob Storage のコネクタが用意されていて、「BLOB が追加または変更されたとき」というトリガーがあります。

しかし、このトリガーはポーリングトリガーなのと、指定したコンテナ直下以外で発生したイベントを補足することができないようです(例えば、サブフォルダでのイベントを拾うことができない)。

というわけで、Functions でトリガした変更内容を Logic Apps に渡す方針でいきます。

Azure Logic Apps の設定

はじめに、Azure Logic Apps 側を設定していきます。

ロジックアプリを作成したら、ロジックアプリデザイナーでトリガーとアクションを追加します。

ロジックアプリデザイナーの全体図は次のような感じです。

トリガーには、Functions から POST リクエストを受けたときに発火するように「HTTP要求の受診時」を設定しました。

JSON スキーマは以下の通りです。今回は、ブロブの名前、ブロブの場所、サイズ、更新日時を受け取ります。

{
    "type": "object",
    "properties": {
        "Name": {
            "type": "string"
        },
        "AbsolutePath": {
            "type": "string"
        },
        "Length": {
            "type": "number"
        },
        "LastModified": {
            "type": "string"
        }
    }
}

また、アクションとして、今回は取得した情報を Slack に投げるようにしました。

ロジックアプリを保存すると HTTP POST の URL が発行されるのでメモしてください。Azure Functions の設定に使用します。

以上で Azure Logic Apps の設定は終了です。

Azure Functions の設定

つづいて、Azure Functions 側を設定していきます。 まず、Function App を作成したら、カスタム関数を選択します。

そして、Blob trigger を選択します。言語はC#を使用します。

そして、run.csx ファイルを以下のように編集します。

#r "Microsoft.WindowsAzure.Storage"
#r "Newtonsoft.Json"
#r "System.Net"

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using Newtonsoft.Json;
using System.Net.Http;
using System.Text;

[FunctionName("BlobTriggerCSharp")]
public static void Run([BlobTrigger("mycontainer/{name}")] CloudBlockBlob myBlob, string name, TraceWriter log)
{
    var url = "ロジックアプリでメモしたURL";

    var properties = new
    {
        myBlob.Name,
        myBlob.Uri.AbsolutePath,
        myBlob.Properties.Length,
        myBlob.Properties.LastModified
    };
    var json = JsonConvert.SerializeObject(properties);
    var content = new StringContent(json, Encoding.UTF8, "application/json");

    using (var httpClient = new HttpClient())
    {
        httpClient.PostAsync(url, content).Wait();
    }
}

また、function.json を以下のように編集します。

    "disabled": false,
    "bindings": [
        {
            "name": "myBlob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "mycontainer/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

アプリケーション設定の接続文字列には、MyStorageAccountAppSetting という名前に対して、監視したい Blob Storage の接続文字列(ストレージアカウントのアクセスキーを参照)を追加します。

以上で Azure 上での設定は終了です。

動作確認

Blob Storage の mycontainer に適当なファイルをアップロードしてみると……

次のような感じで、Slack にブロブの情報が飛んできます。

また、ブロブの名前変更やフォルダ内へのアップロードに対しても、トリガーされることが確認できますね。

参考

Azure Functions における Azure Blob Storage のバインド | Microsoft Docs

Webカメラ + Azure Logic Apps + Azure Face API で訪問記録 - Qiita

4423.ch