連載
» 2017年07月11日 05時00分 公開

Dev Basics/Keyword:Azure Functions (2/2)

[かわさきしんじ,Insider.NET編集部]
前のページへ 1|2       

バインドを利用した関数

 最後に、もう少し複雑な関数(カスタム関数)を作成してバインドがどんなものかを見てみよう。先ほどと同様に、作成したFunction Appのブレードで[関数]の右隣にある[+]ボタンをクリックして(1つのFunction Appの中に複数の関数を作成可能)、今度は[カスタム関数を作成する]リンクをクリックする。すると、次のようなページが表示される。

使用する言語とシナリオの選択画面 使用する言語とシナリオの選択画面

 上の画像では[言語]に[C#]を、[シナリオ]に[試験段階]を選択している。ここで[ExternalFileTrigger - C#]を選択してみよう。ちなみに、これはDropboxやOneDriveなどのSaaS(あるいはその他のサービス)を介して接続したファイルシステム上で特定のフォルダを監視し、そのフォルダへのファイルの追加をトリガーとして実行される関数を作成するものだ。以下では、Dropboxにテキストファイルを追加すると、それが勝手にOneDriveにもコピーされる関数を作成する。では、[ExternalFileTrigger - C#]タイルをクリックしてみよう。すると、次の画像が表示される。

関数名とバインドの指定 関数名とバインドの指定

 テキストファイルをコピーする、といってもコードを書く必要はない(バイナリファイルも処理しようと思ったら、恐らくはコードを記述する必要があるが、ここでは割愛)。が、そのためには上の画面でトリガー、入力、出力の「バインド」を設定する必要がある。簡単に言うと、トリガーとは関数呼び出しのきっかけとなるもので(トリガーに関する情報は引数として関数に渡される)、入力はその関数呼び出しで必要となる追加の引数に、出力はその関数の戻り値に対応するものだ。

 上の画面では「外部ファイル (プレビュー) trigger (inputFile) 」がトリガーに対するバインドの設定で、「外部ファイル (プレビュー) output ($return)」が出力に対するバインドの設定だ(入力のバインドはここでは行っていない。これは関数を作成した後から、[統合]タブで設定できる)。

 トリガーと出力の双方の設定に「パス」という要素があるが、トリガーの場合、これは外部ファイルの変化を監視するフォルダと監視対象のファイルを関数内で取得するための変数名を組み合わせたものとなる。上の例であれば、「input-cs」フォルダに追加されたファイルの名前を関数内では「name」で参照できる。出力のバインドの場合も同様で、出力先のフォルダとファイル名がここに記述されたパターンで指定されることになる。なお、これについては後で多少変更する。

 「パス」の右側にある[外部ファイル接続]からは使用する外部ファイルシステムの設定を行える。例えば、[新規]リンクをクリックしてOneDriveに接続するように設定するには以下の手順を実行する。

[OneDrive]を選択して[必要な設定の構成]をクリック
[OneDrive]を選択して[必要な設定の構成]をクリック
[新規作成]、[承認する]を続けてクリックする
[新規作成]、[承認する]を続けてクリックする

OneDriveへの接続の構成


 すると、マイクロソフトアカウントへのサインインを求めるウィンドウが表示される。そこでパスワードを入力し、次にAzureからOneDriveへの接続を求めるページが表示されるので、これを許可する。すると、「○○として正常に認証されました」などと表示されるので、最後に[OK]ボタンを2回クリックしておく。同様にしてDropboxにも接続できるように構成をしておこう。

 接続の設定ができたら、トリガーとしてDropboxをバインドし、出力にはOneDriveをバインドするように設定を行う。さらにパスを「input-cs/{name}.txt」および「output-cs/{name}.txt」と変更しておく。こうすることで、Dropboxに.txtファイルが追加されたときにだけ、この関数が実行されるようになる。最終的な設定は次のようになる。

トリガーと出力のバインド トリガーと出力のバインド

 なお、トリガー側のファイルシステムでは「input-cs」フォルダをあらかじめ作成しておく必要がある(ただし、デフォルトの名前では「-」の文字コードが通常の半角マイナスとは異なるようなので、適当な名前をきちんと指定しておくのがよいだろう)。最後に[作成]ボタンをクリックすれば、関数が作成される。ちなみにコードは以下のように極めて単純なものだ。

using System;

public static string Run(string inputFile, string name, TraceWriter log)
{
  log.Info($"C# External trigger function processed file: " + name);
  return inputFile;
}

生成された関数のコード

 この状態でDropboxの「input-cs」フォルダに例えば「devbasicskwd_0075_shinj-k.txt」ファイルをコピーすると、下の[ログ]表示領域に以下のようにログが表示される。

Dropbpoxにファイルを追加したことで、関数が実行された Dropbpoxにファイルを追加したことで、関数が実行された

 「2017-07-10T04:03:06.758 Function completed (Success……」とあるように、関数は成功して実行を完了したことが分かる。また、ファイル名も「C# External trigger function processed file: devbasicskwd_0075_shinj-k.txt」とあるようにしっかりと取得できていることが分かる。また、OneDriveを開くと、次のようにDropbox側に置いたファイルがコピーされていることが分かる。

Dropboxに追加したファイルがOneDriveに自動的にコピーされた Dropboxに追加したファイルがOneDriveに自動的にコピーされた

 これが、先ほど行ったバインドの設定による効能だ。これは先ほど見たように、関数名の指定と同時に行うこともできるし、[Function App]ブレードの[関数]の下に表示される[統合]タブでGUIあるいはテキストエディタを使って設定することも可能だ。


 本稿では極めて簡単な例だけを紹介したが、トリガーやバインドといった機構を使って抽象化された入力を基に、関数でそれに操作を行い、戻り値の形で操作後の値を返すと、それがバインド先のオブジェクトに変換される。関数(アプリ)をこのような構成にすることで、汎用性が高く、さまざまなサービスとの連携が可能なものにできる。

 サーバレスな環境で、トリガーとバインドを利用した汎用的でシンプルなサービスを記述できるのがAzure Functionsの大きなメリットをいえるだろう。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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