特集
» 2017年09月22日 05時00分 公開

特集: Visual Studio 2017で始めるAzure Functions開発:Azure Functionsプロジェクト開発の基本的な流れ (2/3)

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

プロジェクトの新規作成

 VS 2017のメニューバーから[ファイル]−[新規作成]−[プロジェクト]を選択して、[新しいプロジェクト]ダイアログの左側のペーンで[Visual C#]−[Cloud]をクリックすると次のような表示になる。

[新しいプロジェクト]ダイアログで[Azure Functions]プロジェクトテンプレートを選択する [新しいプロジェクト]ダイアログで[Azure Functions]プロジェクトテンプレートを選択する

 ここで[Azure Functions]プロジェクトテンプレートを選択して、プロジェクト名などを適宜入力し、[OK]ボタンをクリックしよう。これでAzure Functionsプロジェクトが新規に作成される。ただし、ソリューションエクスプローラーを見ると分かる通り、プロジェクト作成直後にはC#コードを含んだソースファイルはない。

プロジェクト作成直後のソリューションエクスプローラー プロジェクト作成直後のソリューションエクスプローラー

 Azure Functionsに関係あるファイルは、host.jsonファイルとlocal.settings.jsonファイルの2つだけだ。これらは次の用途で使用する。

  • host.jsonファイル: 関数をホストする構成を記述する
  • local.settings.json: 関数をローカルな開発環境で実行する際の設定を記述する

 host.jsonファイルに記述した構成は、このプロジェクトで記述する関数をAzure上で実行するときと、ローカル環境で実行するときの両者で使用される。一方、local.settings.jsonファイルはあくまでもローカル環境で実行する際の設定を行うためのものだ。host.jsonファイルの内容はデフォルトで空({}のみ)になっている。local.settings.jsonファイルの内容は次のようになっている。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "AzureWebJobsDashboard": ""
  }
}


local.settings.jsonファイルのデフォルトの内容

 IsEncrypted設定は設定内容をローカルマシンのキーを利用して暗号化するかどうかを指定するもの。Azureに発行したAzure Functionsプロジェクトの設定内容をローカル環境にダウンロードする際にIsEncrypted設定がtrueだと、その内容が暗号化される。

 Values設定にはローカル環境で関数を実行する際に使用する設定を記述していく。ただし、多くの場合に必須なのはAzureWebJobsStorage設定だけだ(HTTPをトリガーとして実行される関数では省略可能)。これは関数をAzure Functionsのランタイムで実行する際に使用するAzureストレージアカウントへの接続文字列を指定する。ここに先ほどコピーをした接続文字列をペーストしておく。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "DefaultEnd…… 省略 ……core.windows.net/;",
    "AzureWebJobsDashboard": ""
  }
}


AzureWebJobsStorage設定に接続文字列をペーストする

 AzureWebJobsDashboard設定は関数の実行ログの保存先となるAzureストレージアカウントへの接続文字列を設定する。本稿ではこの設定は省略する。その他の設定項目については「ローカル設定ファイル」ページを参照されたい。

関数の追加

 使用するストレージアカウントを設定したら、C#で関数を記述してみよう。これにはソリューションエクスプローラーでプロジェクトを右クリックして、コンテキストメニューから[追加]−[新しい項目]を選択する。すると、[新しい項目の追加]ダイアログが表示されるので、そこから[Azure Function]を選択して、ファイル名を指定し、[追加]ボタンをクリックする。

[新しい項目の追加]ダイアログ [新しい項目の追加]ダイアログ

 すると、以下のようなダイアログが表示される。

[新しい Azure 関数]ダイアログ [新しい Azure 関数]ダイアログ

 ここでは関数を実行するための「トリガー」と、実行に必要な設定を行う。例えば、[Blob trigger]を選択すると、先ほど設定したストレージアカウントで提供されているBLOBコンテナに何かのファイルがアップロードされたら、関数が実行される。[Timer trigger]を選択すると、一定の時間間隔で関数が実行されるようになる(何らかのバッチ処理を行う際に使えるだろう)。あるいはWebhookを選択すれば、何らかのWebサービスに、関数呼び出しに使用するURLを設定しておくことで、そのWebサービスで特定の事象が発生したら、それをトリガーとして関数を実行できる。

 このように、さまざまなイベントをトリガーとして、単機能の関数を呼び出すのがAzure Functionsの基本的な構造となっている。

 ここでは、上の画像にもあるように一番上の[Blob trigger]をトリガーとした関数を作成してみよう。このときに設定する項目は[Connection]と[Path]の2つとなる(トリガーごとに設定項目は異なる)。

 [Connection]には先ほどストレージアカウントへの接続文字列を設定した「AzureWebJobsStorage」を指定すればよい。[Path]はこの関数の実行時に使用されるストレージアカウントにあるBLOBコンテナを指定するものだ。ここではデフォルトの「samples-workitems」のままとする(ただし、現在の状態では「samples-workitems」コンテナがストレージアカウントに存在しないので、後でこれを作成する必要がある)。

 この状態で[OK]ボタンをクリックすると、C#のソースコードが生成され、ソリューションエクスプローラーに追加される。生成されたコードは次のようになっている(改行を適宜挿入している)。

using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;

namespace FunctionApp1
{
  public static class Function1
  {
    [FunctionName("Function1")]
    public static void Run(
      [BlobTrigger("samples-workitems/{name}",
      Connection = "AzureWebJobsStorage")]Stream myBlob,
      string name, TraceWriter log)
    {
      log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
  }
}

生成されたC#のソースコード

 RunメソッドがAzure Functionsのランタイムによって実行される。FunctionName属性はこの関数の名前だ。Azureへの発行時にはここで指定した属性を基に、Azure上で関数を実行するために必要な情報がfunction.jsonファイルへとまとめられる。

 myBlobパラメーターにも属性が指定されているが、これは先ほど関数を新規作成した際に指定した接続文字列の設定と、Pathの設定が含まれている。BLOBコンテナに追加されたファイルの名前はnameパラメーターでアクセスできる。追加されたファイル本体についてはmyBlobパラメーターでアクセスできる。logパラメーターはログの書き出し先となる。

 ここではこの内容のまま、関数をデバッグ実行してみよう。ただし、その前にCloud Explorerなどで「samples-workitems」という名前のBLOBコンテナを作成しておこう。Cloud Explorerでこれを行うには、Azure Functionsプロジェクトで使用するストレージアカウントを右クリックして、コンテキストメニューから[BLOB コンテナーの作成]を選択して、コンテナの名前を入力する。

「samples-workitems」という名前でBLOBコンテナを作成 「samples-workitems」という名前でBLOBコンテナを作成

 BLOBコンテナを作成すると、次のようにコンテナに保存されているコンテンツを一覧するウィンドウが表示される。が、作成直後なので、まだコンテナには何もない。ウィンドウ上部にはアップロードを行うためのボタン(上向きの矢印)があるので、後でこれを使ってファイルをアップロードすることにしよう。

BLOBコンテナの内容を一覧表示するウィンドウ BLOBコンテナの内容を一覧表示するウィンドウ

 これでデバッグ実行の準備が整ったので、デバッグ実行をしてみよう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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