チュートリアル: イベント サブスクリプションを使用して BLOB コンテナーで Azure Functions をトリガーする

Azure Functions で以前のバージョンの Blob Storage トリガーを使用していると、そのトリガーによって更新プログラム用の BLOB コンテナーがポーリングされるため、多くの場合は実行が遅延します。 同じコンテナーへのイベント サブスクリプションを使用して関数をトリガーすることにより待機時間を削減できます。 イベント サブスクリプションは、Event Grid インフラストラクチャを使って、コンテナー内の変更が発生したときにそれを転送します。 この機能は、最新の Azure Functions 拡張機能を使って実装できます。

この記事では、BLOB がコンテナーに追加されたときに発生するイベントに基づいて実行される関数を作成する方法について説明します。 Visual Studio Code は、ローカル開発のためと、Azure にプロジェクトをデプロイする前にその関数がローカルで機能することを確認するために使用します。

  • Azure Storage で汎用ストレージ v2 アカウントを作成します。
  • BLOB ストレージ内にコンテナーを作成します。
  • イベント ドリブン Blob Storage によってトリガーされる関数を作成します。
  • BLOB コンテナーへのイベント サブスクリプションを作成します。
  • ファイルをアップロードして、ngrok を使用してローカルでデバッグします。
  • Azure にデプロイし、フィルター処理されたイベント サブスクリプションを作成します。

重要

この記事では、タブを使用して、Node.js プログラミング モデルの複数のバージョンに対応しています。 v4 モデルは一般提供されており、JavaScript と TypeScript の開発者にとって、より柔軟で直感的なエクスペリエンスが得られるように設計されています。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

前提条件

  • ローカルで実行されている関数を Azure が呼び出す方法を提供する ngrok ユーティリティ。

  • Visual Studio Code 用の Azure Storage 拡張機能 (少なくともバージョン 5.x)。

注意

Visual Studio Code 用の Azure Storage 拡張機能は、現在プレビュー段階です。

ストレージ アカウントの作成

Azure Storage でイベント サブスクリプションを使用するには、汎用 v2 ストレージ アカウントが必要になります。 既定では、このストレージ アカウントは、Azure Storage 拡張機能をインストールするときに Visual Studio Code プロジェクトから作成できます。

  1. Visual Studio Code で、コマンド パレットを開き (F1 キーを押し)、「Azure Storage: Create Storage Account...」と入力します。 プロンプトで、次の情報を指定します。

    Prompt アクション
    新しいストレージ アカウントの名前を入力してください グローバルに一意な名前を付けます。 ストレージ アカウント名は、3 - 24 文字の長さで、小文字と数字のみが含まれている必要があります。 簡単に識別できるように、リソース グループ名と関数アプリ名に同じ名前を使用します。
    Select a location for new resources (新しいリソースの場所を選択してください) パフォーマンスを向上させるために、最寄りのリージョンを選択してください。

    この拡張機能により、指定された名前を持つ汎用 v2 ストレージ アカウントが作成されます。 このストレージ アカウントを含むリソース グループにも同じ名前が使用されます。

  2. ストレージ アカウントを作成したら、コマンド パレットを開き (F1 キーを押し)、「Azure Storage: Create Blob Container...」と入力します。 プロンプトで、次の情報を指定します。

    Prompt アクション
    リソースの選択 作成したストレージ アカウントを選択します。
    新しい BLOB コンテナーの名前を入力してください samples-workitems」と入力します。これは、コード プロジェクトで参照されるコンテナー名です。

これで BLOB コンテナーが作成されたので、このコンテナーでトリガーする関数と、その関数にイベントを配信するイベント サブスクリプションの両方を作成できます。

BLOB によってトリガーされる関数を作成する

Visual Studio Code を使用して、BLOB Storage によってトリガーされる関数を作成する場合は、新しいプロジェクトも作成します。 通常のポーリングされたコンテナーを使用するのではなく、ソースとしてイベント サブスクリプションを使用するように関数を編集する必要があります。

  1. Visual Studio Code で、関数アプリを開きます。

  2. コマンド パレットを開き (F1 キーを押し)、「Azure Functions: Create Function...」と入力して [新しいプロジェクトの作成] を選択します。

  3. プロジェクト ワークスペースで、ディレクトリの場所を選択します。 新しいフォルダーを作成するか、またはプロジェクト ワークスペースの空のフォルダーを選択するようにしてください。

    既にワークスペースの一部になっているプロジェクト フォルダーは選択しないでください。

  4. プロンプトで、次の情報を指定します。

    Prompt アクション
    言語を選択する [C#] を選択します。
    Select a .NET runtime (.NET ランタイムを選択してください) 分離されたワーカー プロセスで実行する場合は .NET 6.0 Isolated LTS を、インプロセスで実行する場合は .NET 6.0 LTS を選択します。
    Select a template for your project's first function (プロジェクトの最初の関数のテンプレートを選択してください) [Azure Blob Storage trigger] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Provide a namespace (名前空間を指定してください) My.Functions」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    ストレージ アカウントを選んでください 一覧から、作成したストレージ アカウントを選択します。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 samples-workitems を受け入れます。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) [Open in current window] を選択します。
    Prompt アクション
    言語を選択する [Python] を選択します。
    仮想環境を作成する Python インタープリターを選択する 好みの Python インタープリターを選択します。 オプションが表示されない場合は、Python バイナリへの完全なパスを入力します。
    Select a template for your project's first function (プロジェクトの最初の関数のテンプレートを選択してください) [Azure Blob Storage trigger] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    ストレージ アカウントを選んでください 一覧から、作成したストレージ アカウントを選択します。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 samples-workitems を受け入れます。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) [Open in current window] を選択します。
    Prompt アクション
    言語を選択する [Java] を選択します。
    Select a version of Java (Java のバージョンを選択してください) Java 11 または Java 8 (Azure で関数が実行される、ローカルで確認した Java のバージョン) を選択します。
    Provide a group ID (グループ ID を指定してください) [com.function] を選択します。
    Provide an artifact ID (成果物 ID を指定してください) [BlobTriggerEventGrid] を選択します。
    Provide a version (バージョンを指定してください) [1.0-SNAPSHOT] を選択します。
    Provide a package name (パッケージ名を指定してください) [com.function] を選択します。
    Provide an app name (アプリ名を指定してください) BlobTriggerEventGrid で始まる生成された名前を受け入れます。
    Select the build tool for Java project (Java プロジェクトのビルド ツールを選択してください) [Maven] を選択します。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) [Open in current window] を選択します。
    Prompt アクション
    Select a language for your function project (関数プロジェクトの言語を選択してください) [TypeScript] を選択します。
    TypeScript プログラミング モデルを選択する [Model V4] を選択します。
    Select a template for your project's first function (プロジェクトの最初の関数のテンプレートを選択してください) [Azure Blob Storage trigger] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    ストレージ アカウントを選んでください 作成したストレージ アカウントを選択します。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 samples-workitems を受け入れます。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) [Open in current window] を選択します。
    Prompt アクション
    Select a language for your function project (関数プロジェクトの言語を選択してください) [JavaScript] を選択します。
    JavaScript プログラミング モデルを選択する [Model V4] を選択します。
    Select a template for your project's first function (プロジェクトの最初の関数のテンプレートを選択してください) [Azure Blob Storage trigger] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    ストレージ アカウントを選んでください 作成したストレージ アカウントを選択します。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 samples-workitems を受け入れます。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) [Open in current window] を選択します。
    Prompt アクション
    Select a language for your function project (関数プロジェクトの言語を選択してください) [PowerShell] を選択します。
    Select a template for your project's first function (プロジェクトの最初の関数のテンプレートを選択してください) [Azure Blob Storage trigger] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    ストレージ アカウントを選んでください 作成したストレージ アカウントを選択します。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 samples-workitems を受け入れます。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) [Open in current window] を選択します。
  5. プロンプトが表示されたら、[ストレージ アカウントの選択]>[ワークスペースに追加] の順に選択します。

簡単のために、このチュートリアルでは、関数アプリで同じストレージ アカウントを再利用します。 ただし、運用環境では、関数アプリで別のストレージ アカウントを使用することが必要になる場合があります。 詳細については、「Azure Functions のストレージに関する考慮事項」を参照してください。

Storage 拡張機能をアップグレードする

Event Grid ベースの Blob Storage トリガーを使用するには、関数に Storage 拡張機能の少なくともバージョン 5.x が必要です。

プロジェクトを必要な拡張機能バージョンでアップグレードするには、ターミナル ウィンドウで、コマンド dotnet add package を実行します。

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs --version 6.1.0
  1. host.json プロジェクト ファイルを開き、extensionBundle 要素を検査します。

  2. extensionBundle.version3.3.0 以上でない場合は、extensionBundle を次のバージョンに置き換えます。

    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[4.0.0, 5.0.0)"
    }
    

イベントを使用するように関数を更新する

BlobTriggerEventGrid.cs ファイルで、BLOB トリガー属性のパラメーターに Source = BlobTriggerSource.EventGrid を追加します。次に例を示します。

[Function("BlobTriggerCSharp")]
public async Task Run([BlobTrigger("samples-workitems/{name}", Source = BlobTriggerSource.EventGrid, Connection = "<NAMED_STORAGE_CONNECTION>")] Stream myBlob, string name, FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("BlobTriggerCSharp");
    logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Size: {myBlob.Length} Bytes");
}

関数を作成したら、function.json 構成ファイルで、myBlob バインドに "source": "EventGrid" を追加します。次に例を示します。

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myblob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "samples-workitems/{name}",
      "source": "EventGrid",
      "connection": "<NAMED_STORAGE_CONNECTION>"
    }
  ]
}
  1. 生成された Function.java ファイルの内容を次のコードに置き換え、ファイルの名前を BlobTriggerEventGrid.java に変更します。

    package com.function;
    
    import com.microsoft.azure.functions.annotation.*;
    import com.microsoft.azure.functions.*;
    
    /**
    * Azure Functions with Azure Blob trigger.
    */
    public class BlobTriggerEventGrid {
        /**
        * This function will be invoked when a new or updated blob is detected at the specified path. The blob contents are provided as input to this function.
        */
        @FunctionName("BlobTriggerEventGrid")
        @StorageAccount("glengatesteventgridblob_STORAGE")
        public void run(
            @BlobTrigger(name = "content", path = "samples-workitems/{name}", dataType = "binary", source = "EventGrid" ) byte[] content,
            @BindingName("name") String name,
            final ExecutionContext context
        ) {
              context.getLogger().info("Java Blob trigger function processed a blob. Name: " + name + "\n  Size: " + content.length + " Bytes");
          }
    }
    
  2. 新しいトリガーの種類には適用されなくなった、関連付けられている単体テスト ファイルを削除します。

関数を作成したら、TypeScript ファイルの options オブジェクトに source: "EventGrid" を追加します。以下に例を示します。

import { app, InvocationContext } from '@azure/functions';

export async function storageBlobTrigger1(blob: Buffer, context: InvocationContext): Promise<void> {
    context.log(
        `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
    );
}

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    source: 'EventGrid',
    handler: storageBlobTrigger1,
});

関数を作成したら、JavaScript ファイルの options オブジェクトに source: "EventGrid" を追加します。以下に例を示します。

const { app } = require('@azure/functions');

app.storageBlob('storageBlobTrigger1', {
    path: 'samples-workitems/{name}',
    connection: 'MyStorageAccountAppSetting',
    source: 'EventGrid',
    handler: (blob, context) => {
        context.log(
            `Storage blob function processed blob "${context.triggerMetadata.name}" with size ${blob.length} bytes`
        );
    },
});

関数を作成したら、function.json 構成ファイルで、myBlob バインドに "source": "EventGrid" を追加します。次に例を示します。

{
    "bindings": [
        {
            "name": "myblob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "source": "EventGrid",
            "connection": "<NAMED_STORAGE_CONNECTION>"
        }
    ]
}

ローカル デバッグを開始する

Azure portal でイベント サブスクリプションを作成すると、Event Grid によりエンドポイント URL が検証されます。 この検証は、ローカル デバッグ用のイベント サブスクリプションを作成する前に、ngrok ユーティリティでリモート アクセスを有効にして関数をローカルで実行する必要があることを意味します。 ローカル関数コードが実行されておらず、Azure にアクセスできない場合、イベント サブスクリプションを作成できません。

BLOB トリガー エンドポイントを決定する

関数がローカルで実行されている場合、イベント ドリブン BLOB ストレージ トリガーに使用される既定のエンドポイントは、次の URL のようになります。

http://localhost:7071/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid
http://localhost:7071/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid

このパスを保存します。これは後でイベント サブスクリプションのエンドポイント URL を作成するために使用します。 Blob Storage によってトリガーされる関数に別の名前を使用した場合は、クエリ文字列の functionName 値を変更する必要があります。

Note

エンドポイントでは Blob Storage トリガーのイベントが処理されるため、エンドポイント パスには blobs が含まれます。 Event Grid トリガーのエンドポイント URL では、代わりに eventgrid がパスに含まれます。

ngrok を実行する

マシン上でデバッグ中の関数を中断するには、Azure Event Grid がローカル コンピューターで実行されている関数と通信する方法を提供する必要があります。

ngrok ユーティリティは、ランダムに生成されたプロキシ サーバー アドレスへの外部要求を、ローカル コンピューターの特定のアドレスとポートに転送します。 お使いのマシンで実行されている関数の Webhook エンドポイントを呼び出します。

  1. 次のコマンドを使用して ngrok を起動します。

    ngrok.exe http http://localhost:7071
    

    ユーティリティを起動すると、次のスクリーンショットのようなコマンド ウィンドウが表示されます。

    Screenshot that shows the Command Prompt after starting the

  2. ngrok が実行されたときに生成される HTTPS URL をコピーします。 この値は、ngrok を使用して公開されるお使いのコンピューター上の Webhook エンドポイントを決定するために使用されます。

重要

この時点で、ngrok を停止しないでください。 ngrok を起動するたびに、HTTPS URL が異なる値で再生成されます。 イベント サブスクリプションのエンドポイントは変更できないため、ngrok を実行するたびに新しいイベント サブスクリプションを作成する必要があります。

ngrok アカウントを作成しない限り、ngrok セッションの最大時間は 2 時間に制限されます。

エンドポイント URL を作成する

イベント サブスクリプションで使用されるエンドポイントは、3 つの異なる部分 (プレフィックス付きサーバー名、パス、クエリ文字列) で構成されます。 次の表に、これらの部分を説明します。

URL の部分 説明
プレフィックスとサーバー名 関数がローカルで実行される場合、https:// プレフィックスが付いたサーバー名は、ngrok によって生成された転送 URL から取得されます。 localhost URL では、http://localhost:7071ngrok URL に置き換えられます。 Azure で実行する場合は、代わりに公開された関数アプリ サーバーを使用します。これは通常、https://<FUNCTION_APP_NAME>.azurewebsites.net の形式です。
Path エンドポイント URL のパス部分は、前にコピーした localhost URL から取得され、Blob Storage トリガーの /runtime/webhooks/blobs のようになります。 Event Grid トリガーのパスは、/runtime/webhooks/EventGrid のようになります
クエリ文字列 .NET Isolated を含むすべての言語で、クエリ文字列の functionName=Host.Functions.BlobTriggerEventGrid パラメーター (.NET インプロセスを除く。その場合は functionName=BlobTriggerEventGrid) により、イベントを処理する関数の名前が設定されます。 関数に別の名前を使用した場合は、この値を変更する必要があります。 ローカルで実行する場合、関数キーは必要ありません。 Azure で実行する場合は、ポータルから取得できるキーを含む code= パラメーターを URL に含める必要もあります。

次のスクリーンショットは、BlobTriggerEventGrid という名前の Blob Storage トリガーを使用した場合の最終的なエンドポイント URL の例を示しています。

Endpoint selection

デバッグを開始する

ngrok が既に実行されている状態で、次のようにローカル プロジェクトを開始します。

  1. ログを処理する行の関数にブレークポイントを設定します。

  2. デバッグ セッションを開始します。

    新しいターミナルを開き、次の mvn コマンドを実行してデバッグ セッションを開始します。

    mvn azure-functions:run -DenableDebug
    

    F5 キーを押してデバッグ セッションを開始します。

コードを実行し、ngrok によって要求が転送されたら、BLOB コンテナーへのイベント サブスクリプションを作成します。

イベント サブスクリプションを作成する

Azure Event Grid を利用したイベント サブスクリプションにより、リンクされた BLOB コンテナーの変更に基づいてイベントが発生します。 このイベントは、その後、関数のトリガーで Webhook エンドポイントに送信されます。 イベント サブスクリプションを作成した後は、エンドポイント URL を変更することはできません。 つまり、ローカル デバッグが完了した後 (または ngrok を再起動した場合) は、イベント サブスクリプションを削除して再作成する必要があります。

  1. Visual Studio Code のアクティビティ バーで Azure アイコンを選択します。 [リソース] でサブスクリプションを展開し、[ストレージ アカウント] を展開して、前に作成したストレージ アカウントを右クリックし、[ポータルで開く] を選びます。

  2. Azure portal にサインインし、ご自分のストレージ アカウントのリソース グループを書き留めておきます。 同じグループ内に他のリソースを作成して、完了時にリソースを簡単にクリーンアップできるようにします。

  3. 左側のメニューから [イベント] オプションを選びます。

    Add storage account event

  4. [イベント] ウィンドウで、[+ イベント サブスクリプション] ボタンを選び、次の表の値を [基本] タブに入力します。

    設定 提案された値 Description
    名前 myBlobLocalNgrokEventSub イベント サブスクリプションを識別する名前。 この名前を使用すると、イベント サブスクリプションをすばやく見つけることができます。
    イベント スキーマ イベント グリッド スキーマ イベントには既定のスキーマを使用します。
    [システム トピック名] samples-workitems-blobs コンテナーを表すトピックの名前。 トピックは最初のサブスクリプションで作成され、今後のイベント サブスクリプションに使用します。
    イベントの種類のフィルター 作成された BLOB
    エンドポイントの種類 Web Hook BLOB ストレージ トリガーでは、Web hook エンドポイントが使用されます。 Event Grid トリガーには Azure Functions を使用します。
    エンドポイント ngrok ベースの URL エンドポイント 前に決定した ngrok ベースの URL エンドポイントを使用します。
  5. [選択の確認] を選び、エンドポイント URL を検証します。

  6. [作成] を選び、イベント サブスクリプションを作成します。

コンテナーにファイルをアップロードする

イベント サブスクリプションが配置され、コード プロジェクトと ngrok がまだ実行されている状態で、ファイルをストレージ コンテナーにアップロードして関数をトリガーできるようになりました。 Visual Studio Code を使用して、お使いのコンピューターから BLOB ストレージ コンテナーにファイルをアップロードできます。

  1. Visual Studio Code で、コマンド パレットを開き (F1 キーを押す)、Azure Storage: Upload Files... と入力します。

  2. [開く] ダイアログ ボックスでファイル (できれば大きすぎないバイナリ イメージ ファイル) を選び、[アップロード] を選びます。

  3. プロンプトで、次の情報を入力します。

    設定 提案された値 説明
    リソースの選択 ストレージ アカウント名 前の手順で作成したストレージ アカウントの名前を選びます。
    リソースの種類を選択する BLOB コンテナー BLOB コンテナーにアップロードしています。
    BLOB コンテナーを選択する samples-workitems この値は、前の手順で作成したコンテナーの名前です。
    このアップロードの宛先ディレクトリを入力する default コンテナー ルートである / の既定値をそのまま使用します。

このコマンドは、お使いのコンピューターから Azure のストレージ コンテナーにファイルをアップロードします。 この時点で、実行中の ngrok インスタンスで、要求が転送されたことが報告されます。 デバッグ セッションの func.exe 出力にも、関数が開始されたことが表示されます。 この時点で、ブレークポイントを設定した場所でデバッグ セッションが待機していると便利です。

Azure にプロジェクトを発行する

関数コードをローカルで正常に検証したので、次は Azure の新しい関数アプリにプロジェクトを発行します。

Function App の作成

次の手順では、Azure で必要なリソースを作成し、プロジェクト ファイルをデプロイします。

  1. コマンド パレットに「Azure Functions: Create function app in Azure...(Advanced)」と入力します。

  2. プロンプトに従って、次の情報を入力します。

    Prompt [選択]
    関数アプリにグローバルで一意の名前を入力します。 新しい関数アプリを識別するグローバルに一意の名前を入力し、Enter キーを選択します。 関数アプリ名の有効な文字は、a-z0-9- です。 この名前を書き留めます。これは、後で新しいエンドポイント URL を作成するときに必要になります。
    ランタイム スタックを選択します。 ローカルで実行している言語バージョンを選択してください。
    OS を選択します。 Linux または Windows を選択してください。 Python アプリは Linux で実行する必要があります。
    新しいリソース用のリソース グループの選択。 ストレージ アカウントで作成したリソース グループの名前 (前にポータルで書き留めたもの) を選びます。
    新しいリソースの場所の選択。 自分の近く、または関数がアクセスする他のサービスの近くのリージョン内の場所を選択します。
    Select a hosting plan. (ホスティング プランを選択してください。) サーバーレスの従量課金プラン ホスティングの場合は [Consumption] (従量課金プラン) を選択します。この場合、関数が実行されているときにのみ課金されます。
    ストレージ アカウントを選択します。 使用している既存のストレージ アカウントの名前を選びます。
    Select an Application Insights resource for your app. (アプリの Application Insights のリソースを選択してください。) [Application Insights リソースの新規作成] を選択し、プロンプトで、関数の実行時データを格納するためのインスタンスの名前を入力します。

    関数アプリが作成され、展開パッケージが適用されると、通知が表示されます。 この通知の [View Output](出力の表示) を選択すると、作成済みの Azure リソースなど、作成とデプロイの結果が表示されます。

関数コードをデプロイする

重要

既存の関数アプリにデプロイすると、Azure にあるそのアプリの内容が常に上書きされます。

  1. Azure アクティビティの [リソース] 領域で、先ほど作成した関数アプリ リソースを見つけて、リソースを右クリックし、[関数アプリにデプロイ] を選択します。

  2. 前のデプロイの上書きを求められたら、[デプロイ] を選択して、関数コードを新しい関数アプリ リソースにデプロイします。

  3. デプロイの完了後、[View Output] (出力の表示) を選択すると、作成済みの Azure リソースなど、作成とデプロイの結果が表示されます。 通知を見逃した場合は、右下隅にあるベル アイコンを選択して、再度確認します。

    Screenshot of the View Output window.

アプリケーション設定を発行する

local.settings.json のローカル設定は自動的に発行されないため、関数が Azure で正しく実行されるように、それらを今すぐアップロードする必要があります。

コマンド パレットに「Azure Functions: ローカル設定のアップロード...」と入力し、リソースの選択 プロンプトで関数アプリの名前を選びます。

イベント サブスクリプションを再作成する

関数アプリが Azure で実行されるようになったので、新しいイベント サブスクリプションを作成する必要があります。 この新しいイベント サブスクリプションでは、Azure の関数のエンドポイントが使用されます。 また、イベント サブスクリプションにフィルターを追加して、コンテナーに JPEG (.jpg) ファイルが追加されたときにのみ関数がトリガーされるようにします。 Azure では、エンドポイント URL にもアクセス キーが含まれており、Event Grid 以外のアクターがエンドポイントにアクセスするのをブロックするのに役立ちます。

BLOB 拡張機能キーを取得する

  1. Visual Studio Code のアクティビティ バーで Azure アイコンを選択します。 [リソース] でサブスクリプションを展開し、[関数アプリ] を展開して、作成した関数アプリを右クリックし、[ポータルで開く] を選びます。

  2. 左側のメニューの [関数] で、[アプリ キー] を選びます。

  3. [システム キー] で、blobs_extension という名前のキーを選び、キーのをコピーします。

この値は、新しいエンドポイント URL のクエリ文字列に含めます。

エンドポイント URL を作成する

次の例に基づいて、Blob Storage トリガーの新しいエンドポイント URL を作成します。

https://<FUNCTION_APP_NAME>.azurewebsites.net/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid&code=<BLOB_EXTENSION_KEY>
https://<FUNCTION_APP_NAME>.azurewebsites.net/runtime/webhooks/blobs?functionName=Host.Functions.BlobTriggerEventGrid&code=<BLOB_EXTENSION_KEY>

この例で、<FUNCTION_APP_NAME> を関数アプリの名前に置き換え、<BLOB_EXTENSION_KEY> をポータルから取得した値に置き換えます。 関数に別の名前を使用した場合は、必要に応じて functionName クエリ文字列を変更する必要もあります。

フィルター処理されたイベント サブスクリプションを作成する

イベント サブスクリプションのエンドポイント URL は変更できないため、新しいイベント サブスクリプションを作成する必要があります。 また、以前のイベント サブスクリプションは再利用できないため、この時点で削除する必要があります。

今回は、JPEG ファイル (*.jpg) のみが関数をトリガーするように、イベント サブスクリプションにフィルターを含めます。

  1. Visual Studio Code のアクティビティ バーで Azure アイコンを選択します。 [リソース] でサブスクリプションを展開し、[ストレージ アカウント] を展開して、前に作成したストレージ アカウントを右クリックし、[ポータルで開く] を選びます。

  2. Azure portal で、左側のメニューから [イベント] オプションを選びます。

  3. [イベント] ウィンドウで、以前の ngrok ベースのイベント サブスクリプションを選び、[削除]>[保存] を選びます。 このアクションにより、以前のイベント サブスクリプションが削除されます。

  4. [+ イベント サブスクリプション] ボタンを選び、次の表の値を [基本] タブに入力します。

    設定 提案された値 Description
    名前 myBlobAzureEventSub イベント サブスクリプションを識別する名前。 この名前を使用すると、イベント サブスクリプションをすばやく見つけることができます。
    イベント スキーマ イベント グリッド スキーマ イベントには既定のスキーマを使用します。
    イベントの種類のフィルター 作成された BLOB
    エンドポイントの種類 Web Hook BLOB ストレージ トリガーでは、Web hook エンドポイントが使用されます。 Event Grid トリガーには Azure Functions を使用します。
    エンドポイント 新しい Azure ベースの URL エンドポイント 作成した URL エンドポイント (キー値を含む) を使用します。
  5. [選択の確認] を選び、エンドポイント URL を検証します。

  6. [フィルター] タブを選び、[サブジェクト フィルター][サブジェクト フィルタリングを有効にする] チェック ボックスをオンにして、[次で終わるサブジェクト].jpg を入力します。 これにより、イベントが JPEG ファイルのみにフィルター処理されます。

    Add filter

  7. [作成] を選び、イベント サブスクリプションを作成します。

Azure で関数を検証する

これでトポロジ全体で Azure が実行されるようになったので、次はすべてが正しく動作していることを確認します。 既にポータルを開いているので、そこからファイルをアップロードするのが最も簡単です。

  1. ポータルのストレージ アカウント ページで、[コンテナー] を選び、samples-workitems コンテナーを選びます。

  2. [アップロード] ボタンを選んで右側のアップロード ページを開き、ローカル ファイル システムを参照してアップロードする .jpg ファイルを見つけ、[アップロード] ボタンを選んで BLOB をアップロードします。 これで、コンテナーのアップロード イベントに基づいて関数が実行されたことを確認できます。

  3. ストレージ アカウントで [イベント] ページに戻り、[イベント サブスクリプション] を選ぶと、イベントが配信されたことがわかります。

  4. ポータルの関数アプリ ページに戻り、[関数][関数] を選び、関数を選択すると、少なくとも 1 つの合計実行回数が表示されます。

  5. [開発者][監視] を選ぶと、正常に実行された関数から書き込まれたトレースが表示されます。 イベントは Application Insights によって処理されるため、最大 5 分間の遅延が発生する可能性があります。

リソースをクリーンアップする

この後、次の手順に進んで Azure Storage キュー バインドを関数に追加する場合、既存の作業をベースにするので、リソースはすべてそのままにしておく必要があります。

それ以外の場合は、追加コストの発生を避けるために、次の手順に従って関数アプリとその関連リソースを削除してください。

  1. Visual Studio Code で、F1 キーを押してコマンド パレットを開きます。 コマンド パレットで、Azure: Open in portal を検索して選択します。

  2. 関数アプリを選択し、Enter キーを押します。 その関数アプリのページが Azure portal で開きます。

  3. [概要] タブで、 [リソース グループ] の横にある名前付きリンクを選択します。

    Screenshot of select the resource group to delete from the function app page.

  4. [リソース グループ] ページで、含まれているリソースの一覧を確認し、削除するものであることを確認します。

  5. [リソース グループの削除] を選択し、指示に従います。

    削除には数分かかることがあります。 実行されると、通知が数秒間表示されます。 ページの上部にあるベルのアイコンを選択して、通知を表示することもできます。

Functions のコストについて詳しくは、「従量課金プランのコストの見積もり」を参照してください。

次のステップ