ここでは「キューにメッセージが追加されたら、その内容をファイル名とするBLOBをコンテナから取得して、その情報を表示する」ように先ほどの関数を修正してみよう。「キューにメッセージが追加されたら」が「トリガー」で、「その内容をファイル名とするBLOBをコンテナから取得」というのが「入力バインディング」となる。最終的にはBLOBの内容を別のコンテナにコピーするが、その設定が出力バインディングとなる。
入力バインディングの設定といっても、実際にはコードを少し追加するだけだ。以下にコードを示す(Runメソッドのみ)。追加/修正したコードは強調書体となっている。
using System.IO;
[FunctionName("Function1")]
public static void Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]
string myQueueItem,
[Blob("incontainer/{queueTrigger}", Connection = "AzureWebJobsStorage")]
string inputBlob,
TraceWriter log)
{
log.Info($"filename: {myQueueItem}, filesize: {inputBlob.Length}");
//log.Info($"C# Queue trigger function processed: {myQueueItem}");
}
VS 2017でAzure Functions and Web Jobs Toolsを使用している場合、「属性」ベースで上記の内容を指定していくのが常道だ(function.jsonファイルは使わない)。これに対して、AzureポータルでFunctionsアプリを作成する場合には、function.jsonファイルと実際のC#コードの2つに分けて、コードとバインディングの設定を行う(後述)。
前ページの最後に掲載したコードと比べると、ここでは強調書体で示したinputBlobパラメーターが増えたので、それに伴ってログに出力する内容も変更している。myQueueItemパラメーターは「キューに追加されたメッセージの内容」を格納している。これは「sample.txt」のようなファイル名を入力してもらうことを前提としている。一方、inputBlobパラメーターはそのファイル名でBLOBコンテナに保存されているBLOBを示すものだ。よって、上のRunメソッドの本体では、そのファイル名とファイルサイズを出力するようになっている。
実行される関数の本体はこのようにとてもシンプルなので、2つのパラメーターに付加されている属性について少し詳しく見ていこう。まずはmyQueueItemパラメーターから。
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]
string myQueueItem,
これは、myQueueItemパラメーターがキュートリガーとバインディングされていること(QueueTrigger)、そのキューの名前がmyqueue-itemsであること、使われるストレージへの接続文字列が「AzureWebJobsStorage」設定に保存されていることを示している(Connection = ……)。なお、AzureWebJobsStorage設定は前ページで設定したこの関数で使用する接続文字列を保存している。そして前述した通り、キューに追加されたメッセージの内容を参照している。
次にinputBlobパラメーターについて見てみよう。
[Blob("incontainer/{queueTrigger}", Connection = "AzureWebJobsStorage")]
string inputBlob,
これはinputBlobの種類がBLOBであること(Blob)、BLOBのコンテナ内でのパスが「incontainer/{queueTrigger}」であること(後述)、使われるストレージへの接続文字列が「AzureWebJobsStorage」設定に保存されていることを示している。なお、ここではstring型のオブジェクトとしてBLOBを扱っている。
「incontainer/{queueTrigger}」というのは、大まかには上で述べた「incontainerコンテナにある、queueTriggerで指定されるファイル」を表す。「{queueTrigger}」は「QueueTrigger」のバインディングであるmyQueueItemパラメーターの値と同じ値となる(例えば、「sample.txt」)。
コードの説明は以上だ。次にこれを実行してみよう。
ここでは何かテキストファイルをBLOBのincontainerコンテナにアップロードしておこう。ここではsample.txtファイルをアップロードした。
この状況でデバッグ実行を始めて、Cloud Explorerなどでmyqueue-itemsキューに、メッセージを追加する。ここではファイル名を指定するのが前提なので、アップロードしたファイル名をメッセージの内容とする。
すると、関数が実行され、コンソールにその名前とサイズが表示される(BLOBのLengthプロパティの値なので、実際のバイト数とは異なる点に注意しよう)。
以上で入力バインディングの設定は完了だ。ここまでが分かれば、出力バインディングの設定も簡単に行える。が、その前に少し寄り道をしよう。今も見たように、VS 2017では属性ベースでAzure Functionsの入出力バインディングを記述していく。一方、Azureポータルではfunction.jsonファイルで入出力バインディングの記述を行い、実際のC#コードは別途記述する。そこで、function.jsonファイルの記述内容について見てみよう。function.jsonファイルの内容を理解すれば、ここでの属性の指定内容がよりハッキリと理解できるはずだ。
Copyright© Digital Advantage Corp. All Rights Reserved.