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を選ぶ
ストレージアカウントと、Blobのpathを指定する。Blob parameter nameはC#での変数名になる。
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()から抜けると書き出されるようだ。