次の方法で共有


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

以前のバージョンの Azure Functions Blob Storage トリガーは、変更についてストレージ コンテナーをポーリングします。 さらに新しいバージョン (5.x 以降) の Blob Storage 拡張機能は、代わりにコンテナーで Event Grid イベント サブスクリプションを使用します。 このイベント サブスクリプションでは、サブスクライブしているコンテナーで変更が発生するとすぐに関数がトリガーされるので、待ち時間が短縮されます。

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

  • 新しいプロジェクトで Blob Storage によってトリガーされるイベント ベースの関数を作成します。
  • ローカル環境の Visual Studio Code 内で Azurite エミュレーターを使って検証します。
  • Azure の新しいストレージ アカウントに Blob Storage コンテナーを作成します。
  • Flex 従量課金プランで関数アプリを作成します (プレビュー)。
  • 新しい BLOB コンテナーへのイベント サブスクリプションを作成します。
  • Azure に関数コードをデプロイして検証します。

この記事は、Azure Functions の Node.js プログラミング モデルのバージョン 4 に対応しています。

この記事は、Azure Functions の Python プログラミング モデルのバージョン 2 に対応しています。

この記事で作成する C# アプリは分離ワーカー モードで実行され、.NET 8.0 をサポートします。

重要

このチュートリアルでは、現在プレビュー段階の Flex 従量課金プランを使います。 Flex 従量課金プランでは、BLOB ストレージ トリガーのイベント ベースのバージョンのみがサポートされます。 このチュートリアルは、関数アプリの他のホスティング プランを使って完了できます。

前提条件

Note

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

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 8.0 Isolated LTS] を選択します。
    Select a template for your project's first function (プロジェクトの最初の関数のテンプレートを選択してください) [Azure Blob Storage trigger (using Event Grid)] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Provide a namespace (名前空間を指定してください) My.Functions」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    サブスクリプションを選択してください サブスクリプションを選択します。
    ストレージ アカウントを選んでください ローカル ストレージには Azurite エミュレーターを使います。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 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 (using Event Grid)] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    サブスクリプションを選択してください サブスクリプションを選択します。
    ストレージ アカウントを選んでください ローカル ストレージには Azurite エミュレーターを使います。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 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 (using Event Grid)] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    サブスクリプションを選択してください サブスクリプションを選択します。
    ストレージ アカウントを選んでください ローカル ストレージには Azurite エミュレーターを使います。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 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 (using Event Grid)] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    サブスクリプションを選択してください サブスクリプションを選択します。
    ストレージ アカウントを選んでください ローカル ストレージには Azurite エミュレーターを使います。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 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 (using Event Grid)] を選択します。
    Provide a function name (関数名を指定してください) BlobTriggerEventGrid」と入力します。
    Select setting from "local.settings.json" ("local.settings.json" から設定を選択する) [Create new local app setting] を選択します。
    サブスクリプションを選択してください サブスクリプションを選択します。
    ストレージ アカウントを選んでください ローカル ストレージには Azurite エミュレーターを使います。
    これは、トリガーが監視するストレージ アカウント内のパスです 既定値 samples-workitems を受け入れます。
    Select how you would like to open your project (プロジェクトを開く方法を選択してください) [Open in current window] を選択します。

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

Event Grid ベースの Blob Storage トリガーを使うには、Azure Functions Storage 拡張機能のバージョン 5.x 以降が必要です。

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

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

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

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

ローカル ストレージ エミュレーションを準備する

ローカル環境で実行するときは、Visual Studio Code は Azurite を使って Azure Storage サービスをエミュレートします。 ローカル環境での開発とテストの間は、Azurite を使って Azure Blob Storage サービスをエミュレートします。

  1. まだ行っていない場合は、Visual Studio Code 用の Azurite v3 拡張機能をインストールします。

  2. local.settings.json ファイルで AzureWebJobsStorage に対して "UseDevelopmentStorage=true" が設定されていることを確認します。これは、ローカル環境で実行するときは、実際のストレージ アカウント接続ではなく Azurite を使うよう Core Tools に指示します。

  3. F1 キーを押してコマンド パレットを開き、「Azurite: Start Blob Service」と入力して Enter キーを押すと、Azurite Blob Storage サービス エミュレーターが起動します。

  4. アクティビティ バーで Azure アイコンを選び、[ワークスペース]>[接続されているストレージ アカウント]>[ローカル エミュレーター] を展開します。[BLOB コンテナー] を右クリックして [BLOB コンテナーの作成] を選び、名前「samples-workitems」を入力して Enter キーを押します。

    Visual Studio Code のローカル エミュレーションで [BLOB コンテナーの作成] を選ぶ方法を示すスクリーンショット。

  5. [BLOB コンテナー]>samples-workitems を展開して、[ファイルのアップロード] を選びます。

    Visual Studio Code のローカル エミュレーションの samples-workitems コンテナーで [ファイルのアップロード] を選ぶ方法を示すスクリーンショット。

  6. ローカル環境でエミュレートされたコンテナーにアップロードするファイルを選びます。 このファイルは、関数コードを検証してデバッグするため、後で関数によって処理されます。 テキスト ファイルは、BLOB トリガー テンプレート コードで最適に動作する場合があります。

関数をローカルで実行する

エミュレートされたストレージ内のファイルを使うと、関数を実行して、Event Grid サブスクリプションによって発生するイベントをシミュレートできます。 トリガーに渡されるイベント情報は、ローカル コンテナーに追加するファイルによって異なります。

  1. ブレークポイントを設定し、F5 キーを押してローカル デバッグ用にプロジェクトを開始します。 ターミナル ウィンドウで Azure Functions Core Tools が実行されている必要があります。

  2. Azure 領域に戻り、[ワークスペース]>[ローカル プロジェクト]>[関数] を展開します。関数を右クリックして、[今すぐ関数を実行] を選びます。

    Visual Studio Code のローカル プロジェクト ワークスペースで関数から [関数の実行] ボタンを選ぶ方法を示すスクリーンショット。

  3. 要求本文のダイアログで、「samples-workitems/<TEST_FILE_NAME>」と入力します。<TEST_FILE_NAME> は、ローカル ストレージ エミュレーターにアップロードしたファイルの名前に置き換えます。

  4. Enter キーを押して関数を実行します。 指定した値は、ローカル エミュレーター内の BLOB へのパスです。 この文字列は、要求ペイロードでトリガーに渡されます。これは、イベント サブスクリプションが関数を呼び出して BLOB がコンテナーに追加されていることを報告するときのペイロードをシミュレートします。

  5. この関数の実行の出力を確認します。 出力では、ログされたファイルの名前とその内容が示されている必要があります。 ブレークポイントを設定した場合は、実行を続行することが必要な場合があります。

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

Azure ストレージ アカウントを準備する

Azure Storage へのイベント サブスクリプションには、汎用 v2 ストレージ アカウントが必要です。 Visual Studio Code 用の Azure Storage 拡張機能を使って、このストレージ アカウントを作成できます。

  1. Visual Studio Code で F1 キーをもう一度押してコマンド パレットを開き、「Azure Storage: Create Storage Account...」と入力します。 メッセージが表示されたら、次の情報を指定します。

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

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

  2. F1 キーをもう一度押し、コマンド パレットで「Azure Storage: Create Blob Container...」と入力します。 メッセージが表示されたら、次の情報を指定します。

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

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

Function App の作成

次の手順のようにして、Flex 従量課金プランで関数アプリを作成します。 アプリが Flex 従量課金プランでホストされている場合は、Blob Storage トリガーでイベント サブスクリプションを使う必要があります。

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

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

    Prompt [選択]
    関数アプリにグローバルで一意の名前を入力します。 新しい関数アプリを識別するグローバルに一意の名前を入力し、Enter キーを選択します。 関数アプリ名の有効な文字は、a-z0-9- です。
    Select a hosting plan. (ホスティング プランを選択してください。) [Flex 従量課金 (プレビュー)] を選択します。
    ランタイム スタックを選択します。 ローカル環境で実行していた言語スタックとバージョンを選びます。
    新しいリソース用のリソース グループの選択。 ストレージ アカウントを作成した既存のリソース グループを選びます。
    新しいリソースの場所の選択。 最寄りの、または関数がアクセスする他のサービスの近くにあるサポートされているリージョン内の場所を選択します。 サポートされていないリージョンは表示されません。 詳細については、「現在サポートされているリージョンを表示する」を参照してください。
    ストレージ アカウントを選択します。 作成したストレージ アカウントの名前を選びます。
    Select an Application Insights resource for your app. (アプリの Application Insights のリソースを選択してください。) [Application Insights リソースの新規作成] を選択し、そのプロンプトで、関数の実行時データを格納するために使用されるインスタンスの名前を指定します。

    関数アプリが作成されると、通知が表示されます。 この通知の [出力の表示] を選ぶと、作成した Azure リソースなど、作成の結果が表示されます。

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

重要

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

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

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

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

    [出力の表示] ウィンドウのスクリーンショット。

アプリケーション設定の更新

local.settings.json ファイルからは必要なアプリケーション設定が自動的に発行されないため、関数が Azure で正しく実行されるように、それらを関数アプリにアップロードする必要があります。

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

  2. AzureWebJobsStorage の設定が既に存在するというメッセージが表示されたら、[はい] を選んで、ローカル エミュレーターの設定を、Azure の実際のストレージ アカウント接続文字列で上書きします。

  3. local.settings.json ファイルで、ローカル エミュレーターの設定を、AzureWebJobsStorage に使われるのと同じ接続文字列に置き換えます。

  4. Flex 従量課金プランではサポートされていない FUNCTIONS_WORKER_RUNTIME エントリを削除します。

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

これで、Functions ホストとトリガーの両方が同じストレージ アカウントを共有するようになります。

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

イベント サブスクリプションを作成するには、Blob Storage イベントを報告する特定のエンドポイントの URL を Event Grid に指定する必要があります。 この BLOB 拡張機能 URL は、次の部分で構成されます。

部分
関数アプリの基本 URL https://<FUNCTION_APP_NAME>.azurewebsites.net
BLOB 固有のパス /runtime/webhooks/blobs
関数のクエリ文字列 ?functionName=Host.Functions.BlobTriggerEventGrid
BLOB 拡張機能のアクセス キー &code=<BLOB_EXTENSION_KEY>

BLOB 拡張機能アクセス キーは、自分の BLOB 拡張機能エンドポイントに他のユーザーがアクセスするのをより困難にするように設計されています。 BLOB 拡張機能のアクセス キーを確認するには:

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

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

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

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

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

    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 を使ってイベント サブスクリプションを作成できるようになります。

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

Azure Event Grid を利用したイベント サブスクリプションにより、サブスクライブされた BLOB コンテナーの変更に基づいてイベントが発生します。 その後、このイベントは、関数の BLOB 拡張機能エンドポイントに送られます。 イベント サブスクリプションを作成した後で、エンドポイント URL を更新することはできません。

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

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

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

    ストレージ アカウント イベントを追加する

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

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

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

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

Visual Studio Code を使用して、お使いのコンピューターから BLOB ストレージ コンテナーにファイルをアップロードできます。

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

  2. [開く] ダイアログ ボックスで、ファイル (できればテキスト ファイル) を選んで、[アップロード] を選びます。

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

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

ローカル ファイル システムを参照してアップロードするファイルを検索し、[アップロード] ボタンを選んでファイルをアップロードします。

Azure で関数を検証する

samples-workitems コンテナーにファイルをアップロードしたので、関数がトリガーされるはずです。 Azure portal で次のことを調べて確認できます。

  1. ストレージ アカウントで [イベント] ページに移動し、[イベント サブスクリプション] を選ぶと、イベントが配信されたことがわかります。 イベントがグラフに表示されるまで、最大で 5 分かかる可能性があります。

  2. ポータルで関数アプリのページに戻り、[関数] で関数を見つけて、[呼び出しなど] を選びます。 正常に実行された関数から書き込まれたトレースが表示されます。

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

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

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

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

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

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

    関数アプリのページから削除するリソース グループを選択するスクリーンショット。

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

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

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

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

次のステップ