Isa@Diary

ソフトウェア開発やってます。プログラミングとか、US生活とかについて書きます。

Azure FunctionsからAzure Storage Blobを読み書きする(C#)

Azure Functionsを使ってStatefulなものを作るのにBlobを使ってみたのでそのメモ。

基本的には
1. Function Appのinput/outputにBlobを指定
2. Runのparameterに指定したblobを追加
3. 読み書きする

という流れ

1. input/outputにBlobを指定

GUIから

Integrate -> InputからAzure Storage Blobを選ぶ
f:id:isa_rentacs:20160702214014p:plain

ストレージアカウントと、Blobのpathを指定する。Blob parameter nameはC#での変数名になる。
f:id:isa_rentacs:20160702214142p:plain

outputも同様。

CIから

CIからのdeployにしている場合、このページで直接編集ができなくなる。なので
App folder以下にあるfunctions.json

    {
      "type": "blob",
      "name": "inputBlob",
      "path": "incontainer/input.txt",
      "connection": "<storage connection>",
      "direction": "in"
    }

を足す。

2. Runのparameterに指定したblobを追加

Timer Triggerにした場合はdefaultで

public static void Run(TimerInfo myTimer, TraceWriter log)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");    
}

というメソッドができているはずなので

public static void Run(TimerInfo myTimer, string inputBlob, out string outputBlob, TraceWriter log)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");    
}

とinputBlob, outputBlobを追加する。この時の変数名が1で指定したparameter nameになる。これを指定しないと

2016-07-02T12:52:03.358 warning AF004: Missing binding argument named 'inputBlob'.
2016-07-02T12:52:03.358 warning AF004: Missing binding argument named 'outputBlob'.

とcompiler errorになる。
このときBindできる型については
https://azure.microsoft.com/en-us/documentation/articles/functions-bindings-storage/
を参照。

HttpTriggerにした場合には初めのRunメソッドが

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)

とasyncになっているので、outputを使う場合にはasyncを外してやる必要がある。

3.読み書きする

あとは普通に読み書きしてやればOK。
outputは上記documentにある通り

Object (out T in C# for output blob: creates a blob as null object if parameter value is null when the function ends)
String (out string in C# for output blob: creates a blob only if the string parameter is non-null when the function returns)

基本的にnon-nullの状態でRun()から抜けると書き出されるようだ。