Azure Functionsの入出力バインディング特集: Visual Studio 2017で始めるAzure Functions開発(3/3 ページ)

» 2017年10月13日 05時00分 公開
[かわさきしんじInsider.NET編集部]
前のページへ 1|2|3       

function.jsonファイル

 以下は上に見た属性ベースの入出力バインディングの設定と、ほぼ同様な設定を記述した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
}


function.jsonファイルでのバインディング設定の例

 ここでは2つのバインディングを設定している。最初のものは、関数を起動するトリガーのバインディング設定で、先ほどのコードのmyQueueItemパラメーターの属性に相当する。次は入力バインディングの設定で、上のコードのinputBlobパラメーターの属性に相当する。

 ちなみに対応するC#コードは次のようになる。別々に記述する方が簡潔だが、2つのファイルを管理しなければならない。どちらがよいかは、人によるかもしれない。

public static void Run(string myQueueItem, string inputBlob, TraceWriter log)
{
  log.Info($"filename: {myQueueItem}, filesize: {inputBlob.Length}");
}

対応するC#コード

 では、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,

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ファイルでのバインディングの記述についても比較しながら見た。次回はより実践的な利用例を紹介する予定だ。

「特集: Visual Studio 2017で始めるAzure Functions開発」のインデックス

特集: Visual Studio 2017で始めるAzure Functions開発

前のページへ 1|2|3       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。