以下は上に見た属性ベースの入出力バインディングの設定と、ほぼ同様な設定を記述したfunction.jsonファイルだ。同様なFunctionsアプリをAzureポータル上で作成し、その設定を引き写している。
{
"bindings": [
{
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "myqueue-items",
"connection": "AzureWebJobsDashboard"
},
{
"type": "blob",
"name": "inputBlob",
"path": "incontainer/{queueTrigger}",
"connection": "AzureWebJobsDashboard",
"direction": "in"
}
],
"disabled": false
}
ここでは2つのバインディングを設定している。最初のものは、関数を起動するトリガーのバインディング設定で、先ほどのコードのmyQueueItemパラメーターの属性に相当する。次は入力バインディングの設定で、上のコードのinputBlobパラメーターの属性に相当する。
ちなみに対応するC#コードは次のようになる。別々に記述する方が簡潔だが、2つのファイルを管理しなければならない。どちらがよいかは、人によるかもしれない。
public static void Run(string myQueueItem, string inputBlob, TraceWriter log)
{
log.Info($"filename: {myQueueItem}, filesize: {inputBlob.Length}");
}
では、function.jsonファイルにある各属性について簡単に説明しておこう。
属性 | 説明 |
---|---|
name | 関数のパラメーター名として使われ、そのトリガー/バインディングにアクセスするために使われる |
type | そのトリガー/バインディングの種類 |
direction | 関数への入力か(in)、関数からの出力かを指定(out) |
connection | 関数が使用するストレージアカウントに対する接続文字列 |
queueName | その関数が使用するキューの名前 |
path | BLOBコンテナ内でのBLOBのパス |
バインディングで指定する属性 |
name属性は上で見た関数のパラメーター名に対応していることが分かるはずだ(myQueueItem/inputBlobパラメーター)。type属性は、トリガーあるいはバインディングの種類を表す。これらは属性ベースのコードにおける「QueueTriger(……)」や「Blob(……)」に相当する。
トリガーのバインディング設定にあるqueueName属性は、その関数が使用するストレージ内のキューを指定するもので、属性ベースのコードの「QueueTrigger("myqueue-items", ……)」に対応する。
一方、入力バインディングの設定にあるpath属性の値は「incontainer/{queueTrigger}」となっている。これはBLOBのincontainerコンテナにある「queueTrigger」で指定される値を意味する。もちろん、属性ベースのコードの「Blob("incontainer/{queueTrigger}", ……)」に相当する部分だ。
direction属性は、バインディングの方向を示すもの。関数への入力ならinに、関数からの出力であればoutを指定する。関数(Runメソッド)のパラメーターリストでは、outパラメーターかどうかを指定する。ここではまだ入力バインディングしか見ていないので、対応するバインディングが出てきていない。outパラメーターは、この後、出力バインディングで使用する。
connection属性はそこで使用するストレージアカウントへの接続文字列を指定する属性だ。
以上を踏まえて、トリガー部分について、上で見たfunction.jsonファイルの属性と見比べられるように表にまとめてみよう。その前に、トリガーのバインディング設定を再掲する。
{
"bindings": [
{
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "myqueue-items",
"connection": "AzureWebJobsDashboard"
},
…… 省略 ……
],
…… 省略 ……
}
対する、属性ベースのコードが以下だ。
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]
string myQueueItem,
これらをまとめると次のようになる。
パラメーターとその属性 | 対応するfunction.jsonファイルの属性 | その値 |
---|---|---|
myQueueItem | name | myQueueItem |
QueueTrigger | type | queueTrigger |
myqueue-items | queueName | myqueue-items |
Connection | connection | AzureWebJobsDashbord/AzureWebJobsStorage |
パラメーターとその属性と対応するfunction.jsonファイルの設定内容 |
なお、属性ベースのコードとfunction.jsonファイルでの設定例では、接続文字列に違いがあるが、これはfunction.jsonのデフォルト値と、VS 2017でのデフォルトの設定であるAzureWebJobsStorageで違いがあるためだ。
入力バインディング(inputBlobパラメーター)についても同様だ。まず、function.jsonファイルの設定内容を再掲しておこう。
{
"bindings": [
…… 省略 ……
{
"type": "blob",
"name": "inputBlob",
"path": "incontainer/{queueTrigger}",
"connection": "AzureWebJobsDashboard",
"direction": "in"
}
]
…… 省略 ……
}
これに対応するのが、RunメソッドのinputBlobパラメーターだ。
[Blob("incontainer/{queueTrigger}", Connection = "AzureWebJobsStorage")]
string inputBlob,
その対応関係は次のようになる。
パラメーターとその属性 | 対応するfunction.jsonファイルの属性 | その値 |
---|---|---|
inputBlob | name | inputBlob |
Blob | type | blob |
incontainer/{queueTrigger} | path | incontainer/{queueTrigger} |
Connection | connection | AzureWebJobsDashbord/AzureWebJobsStorage |
パラメーターとその属性と対応するfunction.jsonファイルの設定内容 |
ここまでの内容が分かれば、出力バインディングの設定は簡単だ。実際のコードを以下に示す。追加した部分は強調書体とした。また、実行結果については割愛する。
[FunctionName("Function1")]
public static void Run(
[QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]
string myQueueItem,
[Blob("incontainer/{queueTrigger}", Connection = "AzureWebJobsStorage")]
string inputBlob,
[Blob("outcontainer/{queueTrigger}", Connection = "AzureWebJobsStorage")]
out string outputBlob,
TraceWriter log)
{
log.Info($"filename: {myQueueItem}, filesize: {inputBlob.Length}");
outputBlob = inputBlob;
}
今度は出力バインディングで使用するoutputBlobパラメーターを追加した。その内容はinputBlobパラメーターとほぼ同様で、outパラメーター指定しているだけだ。また、関数本体ではoutputBlobパラメーターにinputBlobパラメーターを代入することで(手抜き)コピーを行っている。テキストファイルなら、これでコピーできるが、バイナリファイルではうまくコピーできないので、実際に試すときには注意しよう。
本稿ではAzure Functionsアプリの入出力バインディングを使用して、ファイルの簡易コピーを行った。また、VS 2017での属性ベースでのバインディングの記述と、Azureポータルでのfunction.jsonファイルでのバインディングの記述についても比較しながら見た。次回はより実践的な利用例を紹介する予定だ。
Copyright© Digital Advantage Corp. All Rights Reserved.