Azure Blob をトリガーとする Azure Functions を作成する

マイクロソフトのサーバレスコンピューティングの一つ Azure Functions は様々なトリガーが用意されています。またサーバーレスコンピューティングは使用した分だけ課金される形になるので非常に便利です。今回は Azure Functions で Blob Storage にアップロードされたことをトリガーとして実行する関数を作成します。

#Azure Functions のトリガー一覧
まず最初に Azure Functions でサポートされているトリガーを整理します。Azure Functions では様々なトリガーがサポートされていますが、一般的なものには以下の様なトリガーがあります。

種類 | 目的
---|---
タイマー | 設定した間隔で関数を実行します。
HTTP | HTTP 要求を受信したときに関数を実行します。
Blob | Azure Blob Storage 内にファイルがアップロードされたとき、または Azure Blob Storage 内のファイルが更新されたときに、関数を実行します。
キュー | Azure Storage キューにメッセージが追加されたときに、関数を実行します。
Azure Cosmos DB | コレクション内のドキュメントが変更されたときに、関数を実行します。
イベント ハブ | イベント ハブで新しいイベントが受信されたときに、関数を実行します。

今回は Blob にファイルがアップロードされたときをトリガーとする関数を作成します。

#Azure Portal で Functions を作成する
Portal から `リソースの作成` から `Functions App` を検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/3d291e10-76bc-5c21-ca59-568a123f37c3.png)
作成を選択すると、必要な値を入力する画面になるので、任意の必要事項を入力して `レビューと作成` を押して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/38476277-2922-b24b-ac28-77d37be1efd0.png)
作成されリソースに移動し、左側のメニューの `Functions` から `+ New Functions` を選択します。選択すると、開発環境を選ぶ画面に代わるので、`in Portal` を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/4e52d68e-2820-6dcc-82cd-d8cecda5695f.png)
トリガーを選択する画面に遷移すると `HTTP trigger` と `Time trigger` が出てきますが、今回は `More Triggers` を選び `Azure Blob Storage Trigger` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/00c4c083-0d0f-e8be-5c91-afe7a53359c0.png)
選択すると、Functions の名前と、Azure Blob Storage trigger の設定値である、`Path` と `Storage Account Connection` を入力する Windows が出てきます。ここで Storage Account Connection の右側にある `New` を選択し、この同じリソースグループにある　Storage Account を設定します。この設定をすることで自動的に Connection String を設定することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8dbe7636-76c8-56fb-f923-bdd6c74f2bfb.png)

#Blob Storage を設定する
先程 Connection String で設定したこの Functions が監視している Storage Account は、同じリソースグループの Storage Account になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/418d0161-ec82-25cf-43e5-dec01bad4cf2.png)
この Storage Account に対して、`samples-workitems` という Blob Container を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/64bb02af-0830-c639-1044-c021ed1946fd.png)
これで Blob 側の設定は完了です。

#Functions を実行する
Functions は既に実行になっているので、Storage Explorer から `samples-workitems` Container に対してファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/4289e7a8-8782-39af-2b40-03b63095cf95.png)
ファイルをアップロードすると、Functions のトリガーが実行され、Azure Portal の Logs に結果が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b091fdee-0a14-ee1d-c1b4-bd8609709149.png)

Log の出力結果は以下のような感じです。

```
2020-03-30T08:29:46  Welcome, you are now connected to log-streaming service. The default timeout is 2 hours. Change the timeout with the App Setting SCM_LOGSTREAM_TIMEOUT (in seconds). 
2020-03-30T08:30:22.582 [Information] Executing 'Functions.BlobTrigger2' (Reason='New blob detected: samples-workitems/analyze-form-input-data.png', Id=85e1478d-7bb7-4b76-a728-XXXXXXXXXXX)
2020-03-30T08:30:22.591 [Information] C# Blob trigger function Processed blob
 Name:analyze-form-input-data.png 
 Size: 40711 Bytes
2020-03-30T08:30:22.592 [Information] Executed 'Functions.BlobTrigger2' (Succeeded, Id=85e1478d-7bb7-4b76-a728-XXXXXXXXXX)
```
これで Blob にファイルがアップロードされたことをトリガーとする Functions を作成できました。
次回は、Functions をトリガーとして、Cognitive Service を呼び出す関数と連携させてみようと思います。