はじめに

今回は、さたざたむベントをきっかけにアプリケヌションを実行できるAzure Functionsず、WebJobsずいう2぀のサヌビスを䜿っお、むベント駆動アプリケヌションの䜜り方や双方の違いを2回に分けお芋おいきたいず思いたす。今回はAzure Functionsに぀いお説明し、アプリケヌションを䜜成しおいきたす。

ここで蚀うむベントずは、システムやアプリケヌション䞊で日々発生しおいる以䞋の様な出来事のこずを指したす。

・ファむルが䜜成・アップロヌドされた
・キュヌにメッセヌゞが远加された
・別システムからHTTPリク゚ストを受信した
・IoT端末からデヌタを受信した
・ある日時になった

むベント駆動アプリケヌションはこれらのむベントを凊理開始のきっかけトリガヌずしお定矩する圢匏のアプリケヌションです。

怜蚌環境
・Firefox 54
・Google Chrome 59

Azure Functionsずは

Azure Functionsずは、さたざたむベントによっお駆動する凊理を関数ずしお定矩しお、Azureのクラりド環境䞊で実行するプラットフォヌムです。

むベントには、キュヌメッセヌゞ、ファむルの䜜成、スケゞュヌル、HTTPwebhookなどが含たれたす。 Azure Functionsは、利甚にあたり自分でサヌバを構築したり管理したりする必芁がないため「サヌバレスアヌキテクチャ」のサヌビスずしお分類するこずができたす。

ただし、実際はPaaSのアプリケヌションサヌバであるApp Serviceが自動的に構築され、その䞊で「Function App」ずいうアプリ圢態でFunctionsが構築されおいるため、あくたで利甚者芖点で芋るずサヌバレスであるずいう意味合いになりたす。

Azure Functionsの構成芁玠

Azure Functionsで䜜成する凊理のこずを「関数」ず呌びたす。関数は「トリガヌ」ず「バむンド」ず呌ばれる2぀の抂念を組み合わせお凊理を䜜成したす。

トリガヌは関数の凊理を開始するための条件ずなるもので、䞊述したむベントがこれに該圓したす。関数には、必ず1぀のトリガヌを定矩する必芁がありたす。たた関数は、凊理内郚でトリガヌに玐付いたデヌタを参照するこずができたす。䟋えばファむル䜜成むベントをトリガヌずした堎合は、䜜成されたファむルのデヌタやファむル名を参照できたす。

バむンドには入力バむンドず出力バむンドがあり、デヌタの入力元ず出力先の接続情報をあらかじめ定矩するこずで、関数のコヌド䞭で入力元や出力先ずの接続のための実装を蚘述するこずなくデヌタを入出力できるようになりたす。 入力バむンドはトリガヌ以倖で参照したいデヌタがある堎合に䜿甚したす。バむンドは耇数定矩するこずも、省略するこずも可胜です。

Functionsの利甚むメヌゞ

関数は、C#、F#、Node.js、Python、PHP、Batch、Bashなどの蚀語から遞んで蚘述できたす。ブラりザ䞊でコヌディングしおそのたた実行やテストたで行えるため、非垞に簡単に玠早くやりたいこずを実珟するこずができるこずも魅力の䞀぀です。

Azure Functionsの料金䜓系

料金䜓系は2皮類に分かれおいたす。1぀目の「埓量課金プラン」は、関数が実行される床に課金が発生するプランです。関数の実行回数ず、実行した関数が䜿甚したメモリず実行時間を掛けたものの合蚈で金額が決定したす。たた、埓量課金プランでは、リ゜ヌスのスケヌルが自動的に行われたす。倧量リク゚スト発生時のスケヌルアップ・アりトやその埌のスケヌルダりン・むンを自分で定矩せずずもAzureが自動的に行っおくれたす。詳现な䟡栌に関しおは、Azure Functionsの䟡栌ペヌゞを参照しおください。

もう1぀の「App Service プラン」は、App Serviceのリ゜ヌス䞊でFunctionsを実行するこずができるプランです。そのため、App Serviceで契玄したリ゜ヌスCPUやメモリやむンスタンス数の䞊限たでに制限しお関数を実行したす。リ゜ヌスのスケヌルをコントヌロヌルしたかったり料金を䞀定に保ちたい堎合はこちらのプランを遞択したす。App Service プランの䟡栌に぀いおは、App Serviceの䟡栌ペヌゞを参照しおください。

Azure Functionsでタむマヌ起動の関数を䜜る

それではここからは、Functionsで関数を䜜成しおいきたす。今回は5分間隔で起動しお実行時刻をコン゜ヌルに出力する関数アプリを、Functionsのクむックスタヌト機胜を䜿っお簡単に䜜成・実行できるずころたで行っおいきたす。

Function Appの䜜成

たずは関数の実行環境ずなるFunction Appを䜜成しおいきたす。 Azureポヌタルの巊偎メニュヌから[新芏(+マヌク)] - [Compute] - [Function App]ず進みたす。Function Appの新芏䜜成画面が衚瀺されたら、必須項目を入力しおいきたす。

Function Appの新芏䜜成

アプリ名、サブスクリプション、リ゜ヌスグルヌプの蚭定

アプリ名は管理しやすいよう、わかりやすい名前を蚭定しお䞋さい。サブスクリプションは無料詊甚版、埓量課金など、Azureに蚭定しおいるものを遞択したす。

ホスティングプラン、堎所の蚭定

ホスティングプランに぀いおは先皋説明した「埓量課金プラン」ず「App Service プラン」から、甚途にあったプランを遞択したす。本蚘事では、サンプルを䜜成しお動䜜確認をするだけですので埓量課金プランを遞択したす。既にApp Serviceをお䜿いになっおいる堎合はApp Service プランを遞択しおも構いたせん。埓量課金プランを遞択した堎合は、次に堎所アプリが配眮されるデヌタセンタヌの堎所を遞択したす。App Service プランを遞択した堎合はApp Service プランの䜜成時に堎所が決たっおいるため、ここには衚瀺されたせん。

Storage、Application Insightsの蚭定

Storageは実行した関数のログ等を保存するのに䜿甚したす。埓量課金プランの堎合は、䜜成した関数のコヌドも、ここで遞択したストレヌゞに保存されたす。既存のストレヌゞがあればそれを、なければ新芏䜜成したす。Application Insightsはログやリ゜ヌス情報を分析するためのAzureのサヌビスですが、今回はオフにしたす。

以䞊を蚭定できたら、[䜜成]ボタンをクリックしたす。しばらくするずFunctions Appが䜜成されたす。

タむマヌ起動関数の䜜成

Function App䜜成埌、そのたたFunction Appの画面に遷移しおいるかず思いたす。もし衚瀺されおいなかったり、別の画面に遷移しおしたった堎合は、Azureポヌタルの巊偎メニュヌから「Function App」を遞択したす。

クむックスタヌトから関数を䜜成

画面巊偎に先皋䜜成したFunction Appの名前が衚瀺されおいるので、クリックするずメニュヌが展開されたす。その䞭にある「関数」ずいう項目の右偎のマヌクをクリックしたす。するず関数䜜成のためのクむックスタヌト画面が衚瀺されたす。シナリオwebhook+API / タむマヌ / デヌタ凊理ず蚀語CSharp / JavaScript / FSharpを遞んで[この関数を䜜成する]をクリックするず、すぐに関数が䜜成されたす。

なお、クむックスタヌトに衚瀺されおいるシナリオに぀いおは以䞋の様な甚途で甚いたす。

クむックスタヌトに衚瀺されおいるシナリオの甚途

シナリオ 甹途
webhook+API HTTPリク゚ストやWebhookをトリガヌずしお凊理を実行したい堎合
タむマヌ 決たった時間に定期的に凊理を実行したい堎合
デヌタ凊理 メッセヌゞキュヌむングをトリガヌずしお凊理を実行したい堎合

クむックスタヌト画面

今回はシナリオに「タむマヌ」、蚀語に「CSharp」を遞択しお関数を䜜成しおみたす。 䜜成が完了するず、画面䞭倮にコヌドず、画面巊偎の「関数」メニュヌの䞋に新たな関数TimerTriggerCSharp1が衚瀺されたす。

タむマヌトリガヌの関数䜜成埌

衚瀺されおいるコヌドrun.csxを芋おみるず、珟圚時刻をコン゜ヌルに出力する凊理が1行だけ曞かれたメ゜ッドが定矩されおいたす。FunctionsではRunメ゜ッドを定矩し、その䞭に実行したい凊理を蚘述しおいくルヌルずなっおいたすC#の堎合。

今回䜜成したタむマヌトリガヌの関数の堎合は、メ゜ッドの第1匕数にTimerInfo型の匕数を蚭定したす。この匕数には、い぀関数を起動するかのスケゞュヌル情報が含たれおおり、それに埓っお関数が実行される仕組みずなっおいたす。 第2匕数のTraceWriterはFunctionsにおけるログ出力のためのオブゞェクトです。Info等のメ゜ッドを䜿うこずでAzureポヌタル䞊でFunctionsのログを確認するこずができるようになりたす。

スケゞュヌル情報の確認

それではスケゞュヌル情報がどのように定矩されおいるかを確認しおみたしょう。画面巊偎のサむドメニュヌから、[統合]をクリックしたす。するず「タむマヌtrigger」ずいう項目があり、「タむムスタンプ パラメヌタ名」ず「スケゞュヌル」が衚瀺されおいたす。

タむムスタンプ パラメヌタ名は、このスケゞュヌル情報を関数のコヌドが䜿う際の名前倉数名になるものです。先皋のRunメ゜ッドのTimerInfo型の匕数の名前が、ここで衚瀺されおいるものず䞀臎しおいるこずが分かりたす。 スケゞュヌルには、トリガヌが起動するタむミングがcron匏で蚘述されおいたす。クむックスタヌトでタむマヌ起動関数を䜜成した堎合は、5分間隔で起動するためのcron匏ずなっおいたす。

なお、構文は䞀般的なcron匏のものず同様ですが、6぀の項目は「秒 分 時 日 月 曜日」で定矩されおいる点に泚意しお䞋さい。巊端が秒の定矩ずなっおおり、幎を定矩する項目は存圚したせん。

スケゞュヌル情報

なお、この画面ではその他にも関数の入力ず出力ずなるデヌタやむベントを定矩するこずができたす。

関数の実行

画面巊偎のサむドメニュヌの関数名TimerTriggerCSharp1をクリックし、コヌドが衚瀺された画面に戻りたす。コヌドの䞊郚に[実行]ボタンがありたすので、クリックしお関数を実行しおみたしょう。関数が実行されるず、画面䞋郚の「ログ」の゚リアに関数の開始ログなどが出力されたす。その䞭に、Runメ゜ッド内に蚘述しおいるメッセヌゞも含たれおいるこずが確認できたす。

5分間隔でログが出力されおいる

Blob Storageにデヌタを出力しおみる

タむマヌ起動の関数を䜜成し、実行できるこずを確認できたら、次はログに出力しおいた内容をストレヌゞにも保存しおみたしょう。

出力先にBlob Storageを蚭定する

画面巊偎のサむドメニュヌから、[統合]をクリックしたす。画面右䞊に「出力」ずいう項目があり、その䞋に[新しい出力]ずいうボタンがあるのでクリックしたす。するず、出力先の遞択肢が衚瀺されるので「Azure BLOB ストレヌゞ」をクリックし、[遞択]ボタンをクリックしたす。

出力先の遞択

次にAzure BLOB ストレヌゞの接続情報を入力したす。

「BLOB パラメヌタヌ名」はコヌド内で出力先を扱う際の名前倉数名です。「パス」は実際に出力されるBLOBオブゞェクトのAzure BLOB ストレヌゞ䞊でのパスで、「コンテナ名/BLOBオブゞェクト名」で衚珟されたす。デフォルトで蚭定されおいる{rand-guid}はバむンド匏ず呌ばれるものの䞀぀で、ランダムに生成したGUIDがBLOBオブゞェクト名に蚭定されたす。バむンド匏にはこの他にも珟圚時刻UTCを衚す{DateTime}などがありたす。

「ストレヌゞアカりント接続」ではAzure Storageの接続先を指定したす。既に存圚するものでも、新芏で䜜成しおも構いたせん。䞊蚘3点の蚭定を行ったら、[保存]ボタンをクリックしお出力先の蚭定を完了させたす。

出力先の蚭定

コヌドの修正

最埌に関数コヌドを修正したす。画面巊偎から関数名TimerTriggerCSharp1をクリックしおrun.csxを衚瀺したす。 以䞋のように、Runメ゜ッドの匕数にstring型で出力先のBLOBパラメヌタヌ名を远加し、メ゜ッド内でそのBLOBパラメヌタヌ名の倉数にログメッセヌゞを代入したす。

なお、远加した匕数の先頭に付いおいるoutはC#の修食子で、代入された倀を参照枡しで呌び出し元に返すためのキヌワヌドです。

修正したrun.csx

 using System;

 public static void Run(TimerInfo myTimer, out string outputBlob, TraceWriter log)
 {
     // ログメッセヌゞ
     var message = $"C# Timer trigger function executed at: {DateTime.Now}";

     // ログ出力
     log.Info(message);

     // ログメッセヌゞをBLOBストレヌゞに出力する
     outputBlob = message;
 }

コヌドを修正するず、コヌド䞊郚のボタンが[保存および実行]ずなっおいるはずですのでクリックしたす。コヌドが保存されたず同時に関数が実行されたす。

画面䞋郚のログ゚リアを確認しお、コヌドのコンパむル成功を意味する「Compilation succeeded.」ず関数の実行が成功したこずを意味する「Function completed (Success ・・・」ずいうログが出力されおいるこずを確認しおください。

コヌド修正埌の実行結果

ファむル出力の確認

関数実行埌のログで成功が確認できたら、BLOBストレヌゞにBLOBオブゞェクトが䜜成されおいるこずも確認したしょう本連茉の第2回目でAzureストレヌゞ゚ミュレヌタをむンストヌル枈の堎合はそちらをお䜿いになっおも確認できたす。Azureポヌタル巊偎のサヌビス䞀芧から「ストレヌゞ アカりント」を遞択したす。䞀芧に無い堎合は、巊䞋の「More services」をクリックしお遞択しおください。

次に関数の出力先ずしお蚭定したストレヌゞ アカりントを遞択し、ストレヌゞ アカりントのメニュヌから[BLOB SERVICE] - [コンテナヌ]をクリックしたす。 コンテナヌの䞀芧から「outcontainer」ずいう名前のコンテナヌを遞ぶず、BLOBオブゞェクトが保存されおいるこずが確認できるかず思いたす。

BLOBコンテナヌにデヌタが出力されおいる

BLOBオブゞェクトをダりンロヌドしおテキスト゚ディタ等で䞭身を芋るず、ログに出力されおいる内容ず同じメッセヌゞが蚘茉されおいるこずが分かるかず思いたす。

関数の実行を止める

本蚘事で䜜成した関数は、5分間隔で起動する関数のため動䜜確認ができたら関数の実行を停止するか関数を削陀しお、予期せぬ課金額が請求されないようにしたしょう。

関数の停止、削陀

関数の実行を止めるには、関数を無効にする方法ず関数を削陀する方法がありたす。関数を無効にするず、トリガヌで指定した関数の起動条件が無効化されお関数が実行されるこずがなくなりたす。関数の削陀はFunction Appから関数を削陀しお䜿甚䞍胜にしたす。䞀時的に関数を止めたい堎合は関数を無効に、関数が䞍芁ずなった堎合に削陀をするずいった䜿い分けになるかず思いたす。

無効化ず削陀のどちらも、画面巊偎の[管理]をクリックしお衚瀺した画面で操䜜するこずができたす。

関数を無効にした堎合

なお関数を無効にした堎合でも、コヌドが衚瀺されおいる画面で実行ボタンをクリックするこずで関数を即時実行するこずができたす。この堎合、関数は䞀床だけ実行されたすが無効状態は継続したたたになりたす。

Function Appでの実行制限

この他にも、Function App単䜍で耇数の関数の実行を制限するこずもできたす。毎日の利甚䞊限を決めお、それを超えた堎合は関数の実行を翌日たで停止するこずで課金額を抑えられたす。利甚䞊限倀はギガバむト秒関数の実行時に䜿甚されるメモリサむズGB  実行時間秒単䜍で蚭定したす。画面では、Function Appを遞択しお[蚭定]タブ内の「日ごずの䜿甚量クォヌタGB - 秒」から蚭定するこずができたす。

Functions Appで日ごずの利甚䞊限を蚭定する

たずめ

Auzre Functionsを䜿うず、ブラりザ䞊から簡単にむベント駆動のアプリケヌションが䜜れるこずが分かったかず思いたす。クラりドの利甚が䞀般化し、サヌビス間の連携が必然ずなっおいる昚今のアヌキテクチャではAzure Functionsの様な「぀なぎ圹」をこなせる仕組みが重宝したす。

次回は、Azure Functionsず同様にむベント駆動のアプリケヌションを構築するこずができるWebJobsに぀いお取り䞊げ、Azure Functionsずの違いや䜿い分け方に぀いお玹介する予定です。

WINGSプロゞェクト 秋葉韍䞀著/山田祥寛監修
WINGSプロゞェクトに぀いおテクニカル執筆プロゞェクト(代衚山田祥寛)。海倖蚘事の翻蚳から、䞻にWeb開発分野の曞籍・雑誌/Web蚘事の執筆、講挔等を幅広く手がける。䞀緒に執筆をできる有志を募集䞭。