特集
» 2017年10月13日 05時00分 公開

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

[かわさきしんじ,Insider.NET編集部]

入力バインディングの設定

 ここでは「キューにメッセージが追加されたら、その内容をファイル名とする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パラメーターとその属性

 これは、myQueueItemパラメーターがキュートリガーとバインディングされていること(QueueTrigger)、そのキューの名前がmyqueue-itemsであること、使われるストレージへの接続文字列が「AzureWebJobsStorage」設定に保存されていることを示している(Connection = ……)。なお、AzureWebJobsStorage設定は前ページで設定したこの関数で使用する接続文字列を保存している。そして前述した通り、キューに追加されたメッセージの内容を参照している。

 次にinputBlobパラメーターについて見てみよう。

[Blob("incontainer/{queueTrigger}", Connection = "AzureWebJobsStorage")]
string inputBlob,

inputBlobパラメーターとその属性

 これはinputBlobの種類がBLOBであること(Blob)、BLOBのコンテナ内でのパスが「incontainer/{queueTrigger}」であること(後述)、使われるストレージへの接続文字列が「AzureWebJobsStorage」設定に保存されていることを示している。なお、ここではstring型のオブジェクトとしてBLOBを扱っている。

 「incontainer/{queueTrigger}」というのは、大まかには上で述べた「incontainerコンテナにある、queueTriggerで指定されるファイル」を表す。「{queueTrigger}」は「QueueTrigger」のバインディングであるmyQueueItemパラメーターの値と同じ値となる(例えば、「sample.txt」)。

 コードの説明は以上だ。次にこれを実行してみよう。

関数を実行してみる

 ここでは何かテキストファイルをBLOBのincontainerコンテナにアップロードしておこう。ここではsample.txtファイルをアップロードした。

incontainerコンテナにファイルをアップロードしたところ incontainerコンテナにファイルをアップロードしたところ

 この状況でデバッグ実行を始めて、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.

RSSについて

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

メールマガジン登録

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