次の方法で共有


チュートリアル: Azure Redis での Azure Functions のトリガーとバインドの概要

このチュートリアルでは、Azure Functions と Azure Managed Redis (プレビュー) または Azure Cache for Redis を使用して基本的なトリガーを実装する方法について説明します。 Visual Studio Code (VS Code) を使用して、C# で Azure 関数を記述してデプロイする方法について説明します。

このチュートリアルでは、以下の内容を学習します。

  • 必要なツールを設定します。
  • キャッシュを構成して接続します。
  • Azure 関数を作成し、それにコードをデプロイします。
  • トリガーのログ記録を確認します。

前提条件

Azure portal または任意の CLI ツールを使用して、新しい Azure Cache for Redis インスタンスを作成します。 このチュートリアルでは、出発点として適している Balanced B1 インスタンスを使用します。 クイックスタート ガイドを使用して開始する際は、必ずこのインスタンスを選択してください。

既定の設定で十分です。 このチュートリアルではデモ用にパブリック エンドポイントを使用しますが、運用環境ではすべてに対してプライベート エンドポイントを使用することをお勧めします。

キャッシュの作成には数分かかる場合があります。 プロセスの実行中は、次のセクションに移動できます。

Visual Studio Code を設定する

  1. VS Code 用の Azure Functions 拡張機能をまだインストールしていない場合は、[拡張機能] メニューで Azure Functions を検索してから [インストール] を選びます。 C# 拡張機能がインストールされていない場合は、それもインストールします。

    VS Code にインストール済みの、必要な拡張機能のスクリーンショット。

  2. [Azure] タブに移動します。Azure アカウントにサインインします。

  3. 構築しているプロジェクトを格納するため、コンピューターに新しいローカル フォルダーを作成します。 このチュートリアルでは、例として RedisAzureFunctionDemo を使用します。

  4. [Azure] タブで、[ワークスペース] タブの右上にある稲妻アイコンを選択することで、新しい関数アプリを作成します。

  5. [関数の作成...] を選びます。

    VS Code から新しい関数を追加するためのアイコンを示すスクリーンショット。

  6. 新しい Azure Functions プロジェクトの作成を開始するために作成したフォルダーを選択します。 画面上にいくつかのプロンプトが表示されます。 選択:

    • 言語では [C#]
    • .NET ランタイムでは [.NET 8.0 Isolated LTS]
    • プロジェクト テンプレートでは [今はスキップ]

    .NET Core SDK がインストールされていない場合、インストールするように求められます。

    重要

    .NET 関数の場合は、"インプロセス" モデルより、"分離ワーカー モデル" を使うことをお勧めします。 インプロセスと分離ワーカーのモデルの比較については、「分離されたワーカー モデルと Azure Functions 上の .NET のインプロセス モデルの違い」をご覧ください。 このサンプルでは、"分離ワーカー モデル" を使います。

  7. 新しいプロジェクトが [エクスプローラー] ペインに表示されることを確認します。

    VS Code のワークスペースのスクリーンショット。

必要な NuGet パッケージをインストールする

Microsoft.Azure.Functions.Worker.Extensions.Redis をインストールする必要があります。Redis 拡張機能用の NuGet パッケージを使用すると、Redis キースペース通知を Azure Functions のトリガーとして使用できます。

VS Code の [ターミナル] タブに移動し、次のコマンドを入力して、このパッケージをインストールします。

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Redis --prerelease

Note

.NET 分離ワーカー プロセス関数の場合は、Microsoft.Azure.Functions.Worker.Extensions.Redis パッケージを使います。 .NET インプロセス関数と他のすべての言語では、代わりに Microsoft.Azure.WebJobs.Extensions.Redis パッケージを使います。

  1. 新たに作成した Azure Managed Redis インスタンスに移動します。

  2. Azure portal でキャッシュに移動し、[リソース] メニューで [アクセス キー] を見つけます。 [プライマリ] ボックスの内容を書き留めておくか、コピーします。 これは、後で接続文字列を作成するときに使用します。

  3. 次の形式を使用して接続文字列を作成します: {your-cache-hostname}:10000,password={your-access-key},ssl=True,abortConnect=False。 TLS/SSL を無効にした場合は、代わりに ssl=False を使用します。

  4. Redis CLI や Redis Insights などの方法を使用して Redis インスタンスに接続します。 Redis CLI を使用して Redis インスタンスに接続する方法については、「Azure Managed Redis で Redis コマンドライン ツールを使用する」を参照してください。

  5. CONFIG SET コマンドを使用してキースペース通知を構成します。

    CONFIG SET notify-keyspace-events KEA
    

    KEA は、すべてのキーとイベントのキースペース通知を有効にする構成文字列です。 キースペース構成文字列の詳細については、Redis のドキュメントを参照してください。

Redis トリガーのコード例を設定する

  1. VS Code で、Common.cs という名前のファイルをプロジェクトに追加します。 このクラスは、PubSubTrigger に対する JSON でシリアル化された応答を解析するために使われます。

  2. 次のコードをコピーして、Common.cs ファイルに貼り付けます。

    public class Common
    {
        public const string connectionString = "redisConnectionString";
    
        public class ChannelMessage
        {
            public string SubscriptionChannel { get; set; }
            public string Channel { get; set; }
            public string Message { get; set; }
        }
    }
    
  3. RedisTriggers.cs という名前のファイルをプロジェクトに追加します。

  4. 次のコード サンプルをコピーして新しいファイルに貼り付けます。

    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Extensions.Redis;
    
    public class RedisTriggers
    {
        private readonly ILogger<RedisTriggers> logger;
    
        public RedisTriggers(ILogger<RedisTriggers> logger)
        {
            this.logger = logger;
        }
    
        // PubSubTrigger function listens to messages from the 'pubsubTest' channel.
        [Function("PubSubTrigger")]
        public void PubSub(
        [RedisPubSubTrigger(Common.connectionString, "pubsubTest")] Common.ChannelMessage channelMessage)
        {
        logger.LogInformation($"Function triggered on pub/sub message '{channelMessage.Message}' from channel '{channelMessage.Channel}'.");
        }
    
        // KeyeventTrigger function listens to key events from the 'del' operation.
        [Function("KeyeventTrigger")]
        public void Keyevent(
            [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:del")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' deleted.");
        }
    
        // KeyspaceTrigger function listens to key events on the 'keyspaceTest' key.
        [Function("KeyspaceTrigger")]
        public void Keyspace(
            [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:keyspaceTest")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key 'keyspaceTest' was updated with operation '{channelMessage.Message}'");
        }
    
        // ListTrigger function listens to changes to the 'listTest' list.
        [Function("ListTrigger")]
        public void List(
            [RedisListTrigger(Common.connectionString, "listTest")] string response)
        {
            logger.LogInformation(response);
        }
    
        // StreamTrigger function listens to changes to the 'streamTest' stream.
        [Function("StreamTrigger")]
        public void Stream(
            [RedisStreamTrigger(Common.connectionString, "streamTest")] string response)
        {
            logger.LogInformation(response);
        }
    }
    
  5. このチュートリアルでは、以下で Redis アクティビティをトリガーする複数の方法を示します。

    • PubSubTrigger: これは pubsubTest という名前のパブリッシュ/サブスクライブ チャネルにアクティビティが発行されたときにトリガーされます。
    • KeyspaceTrigger: Pub/Sub トリガー上に構築されます。 これを使用して keyspaceTest キーへの変更がないか検索します。
    • KeyeventTrigger: 同じく Pub/Sub トリガー上に構築されます。 これを使用して DEL コマンドが使用されていないか検索します。
    • ListTriggerlistTest リストへの変更がないか検索します。
    • StreamTriggerstreamTest ストリームへの変更がないか検索します。

キャッシュに接続する

  1. Redis アクティビティをトリガーするには、キャッシュ インスタンスの接続文字列を渡す必要があります。 この情報は、フォルダーに自動的に作成された local.settings.json ファイルに保存されています。 セキュリティのベスト プラクティスとしてローカル設定ファイルを使用することをお勧めします。

  2. キャッシュに接続するには、local.settings.json ファイルに ConnectionStrings セクションを追加した後に、redisConnectionString パラメーターを使用することで接続文字列を追加します。 セクションは、次の例のようになるはずです。

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "redisConnectionString": "<your-connection-string>"
      }
    }
    

    Common.cs のコードは、ローカル環境で実行されるとこの値を参照します。

    public const string connectionString = "redisConnectionString";
    

重要

この例は、チュートリアル用に単純化しています。 運用環境で使う場合は、Azure Key Vault を使って接続文字列情報を格納するか、Microsoft Entra ID を使って Redis インスタンスに対する認証を行うことをお勧めします。

ローカルでコードをビルドして実行する

  1. VS Code の [実行とデバッグ] タブに切り替え、緑色の矢印を選択してコードをローカルでデバッグします。 Azure Functions コア ツールがインストールされていない場合は、インストールするように求められます。 その場合は、インストール後に VS Code を再起動する必要があります。

  2. コードが正常にビルドされるはずです。 ターミナル出力でその進行状況を追跡できます。

  3. トリガー機能をテストするには、keyspaceTest キーを作成して削除してみます。

    キャッシュに接続するための任意の方法を使用できます。 簡単な方法は、Azure Cache for Redis ポータルの組み込みのコンソール ツールを使用することです。 Azure portal でキャッシュ インスタンスに移動した後に、[コンソール] を選択して開きます。

    重要

    コンソール ツールは、Azure Managed Redis ではまだ使用できません。 代わりに、redis-cli や、Redis Insight などのツールを使って、Redis インスタンスでコマンドを直接実行することを検討してください。

    C# コードと接続文字列のスクリーンショット。

    コンソールが開いた後、次のコマンドを試します。

    • SET keyspaceTest 1
    • SET keyspaceTest 2
    • DEL keyspaceTest
    • PUBLISH pubsubTest testMessage
    • LPUSH listTest test
    • XADD streamTest * name Clippy

    コンソールと、一部の Redis コマンドと結果のスクリーンショット。

  4. ターミナルでトリガーがアクティブになっていることを確認します。

    コードが実行されている VS Code エディターのスクリーンショット。

Redis バインドを追加する

バインドにより、Redis インスタンスに格納されているデータの読み取りまたは書き込みを効率的に行う方法が追加されます。 バインディングの利点を示すため、他の 2 つの関数を追加します。 1 つは SetGetter という名前で、キーが設定されるたびにトリガーされ、"入力バインド" を使ってキーの新しい値を返します。 もう 1 つは StreamSetter という名前で、新しい項目がストリーム myStream に追加されるとトリガーされ、"出力バインド" を使ってキー newStreamEntry に値 true を書き込みます。

  1. RedisBindings.cs という名前のファイルをプロジェクトに追加します。

  2. 次のコード サンプルをコピーして新しいファイルに貼り付けます。

    using Microsoft.Extensions.Logging;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Extensions.Redis;
    
    public class RedisBindings
    {
        private readonly ILogger<RedisBindings> logger;
    
        public RedisBindings(ILogger<RedisBindings> logger)
        {
            this.logger = logger;
        }
    
        //This example uses the PubSub trigger to listen to key events on the 'set' operation. A Redis Input binding is used to get the value of the key being set.
        [Function("SetGetter")]
        public void SetGetter(
            [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:set")] Common.ChannelMessage channelMessage,
            [RedisInput(Common.connectionString, "GET {Message}")] string value)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' was set to value '{value}'");
        }
    
        //This example uses the PubSub trigger to listen to key events to the key 'key1'. When key1 is modified, a Redis Output binding is used to set the value of the 'key1modified' key to 'true'.
        [Function("SetSetter")]
        [RedisOutput(Common.connectionString, "SET")]
        public string SetSetter(
            [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:key1")] Common.ChannelMessage channelMessage)
        {
            logger.LogInformation($"Key '{channelMessage.Message}' was updated. Setting the value of 'key1modified' to 'true'");
            return $"key1modified true";
        }
    }
    
  3. VS Code の [実行とデバッグ] タブに切り替え、緑色の矢印を選択してコードをローカルでデバッグします。 コードが正常にビルドされるはずです。 ターミナル出力でその進行状況を追跡できます。

  4. 入力バインド機能をテストするには、たとえば SET hello world コマンドを使って、キーに新しい値を設定してみます。SetGetter 関数がトリガーされて、更新された値が返されることがわかるはずです。

  5. 出力バインド機能をテストするには、XADD myStream * item Order1 コマンドを使って、ストリーム myStream に新しい項目を追加してみます。 新しいストリーム エントリで StreamSetter 関数がトリガーされ、newStreamEntry という名前の別のキーに値 true が設定されたことに注意してください。 この set コマンドは、SetGetter 関数もトリガーします。

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

  1. 新しい Azure 関数の作成:

    1. [Azure] タブに戻り、サブスクリプションを展開します。

    2. [関数アプリ] を右クリックした後に、[Azure で関数アプリを作成 (高度)] を選択します。

    VS Code で関数アプリを作成するための選択のスクリーンショット。

  2. 次のように新しい関数アプリを構成するための情報に関するいくつかのプロンプトが表示されます。

    • 一意の名前を入力します。
    • ランタイム スタックとして [.NET 8 Isolated] を選びます。
    • [Linux] または [Windows] のどちらかを選択します (どちらも動作します)。
    • 関数アプリを保持するための既存の、または新しいリソース グループを選択します。
    • キャッシュ インスタンスとして同じリージョンを選択します。
    • ホスティング プランとして [Premium] を選択します。
    • 新しい Azure App Service プランを作成します。
    • [EP1] 価格レベルを選択します。
    • 既存のストレージ アカウントを選択するか、または新しいアカウントを作成します。
    • 新しい Application Insights リソースを作成します。 このリソースを使用し、トリガーが機能していることを確認します。

    重要

    現在、Redis トリガーは従量課金の関数ではサポートされていません。

  3. 新しい関数アプリが作成されるまで数分待ちます。 これはサブスクリプションの [関数アプリ] に表示されます。 新しい関数アプリを右クリックした後に、[関数アプリにデプロイ] を選択します。

    VS Code の関数アプリにデプロイするための選択のスクリーンショット。

  4. アプリがビルドされ、デプロイが開始します。 出力ウィンドウで進行状況を追跡できます。

接続文字列情報を追加する

重要

この例は、チュートリアル用に単純化しています。 運用環境で使う場合は、Azure Key Vault を使って接続文字列情報を格納するか、Microsoft Entra ID を使って Redis インスタンスに対する認証を行うことをお勧めします。

  1. Azure portal で新しい関数アプリに移動し、リソース メニューから [環境変数] を選びます。

  2. 作業ペインで、[アプリ設定] に移動します。

  3. [名前] では、「redisConnectionString」と入力します。

  4. [値] には、接続文字列を入力します。

  5. ページで [適用] を選んで確認します。

  6. [概要] ペインに移動して、[再起動] を選び、接続文字列情報を使って関数アプリを再起動します。

トリガーとバインドをテストする

  1. デプロイが完了し、接続文字列情報が追加されたら、Azure portal で関数アプリを開きます。 次に、リソース メニューから [ログ ストリーム] を選択します。

  2. Log Analytics が接続するのを待ってから、Redis コンソールを使用していずれかのトリガーをアクティブにします。 トリガーがここにログ記録されていることを確認します。

    リソース メニューの関数アプリ リソース用のログ ストリームのスクリーンショット。

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

この記事で作成したリソースを引き続き使用する場合は、リソース グループを保持します。

それ以外の場合、リソースを使い終わったら、課金されないように、作成した Azure リソース グループを削除できます。

重要

リソース グループを削除すると、元に戻すことができません。 リソース グループを削除すると、そのリソース グループ内のすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 リソースを既存のリソース グループ内に作成し、そのリソース グループ内に保持したいリソースが含まれている場合は、リソース グループを削除するのではなく、各リソースを個別に削除できます。

リソース グループを削除するには

  1. Azure portal にサインインし、 [リソース グループ] を選択します。

  2. 削除するリソース グループを選択します。

    多数のリソース グループがある場合は、[任意のフィールドのフィルター...] ボックスを使用し、この記事用に作成したリソース グループの名前を入力します。 結果リストでリソース グループを選びます。

    作業ペインの削除するリソース グループの一覧を示すスクリーンショット。

  3. [リソース グループの削除] を選択します。

  4. リソース グループの削除の確認を求めるメッセージが表示されます。 確認のためにリソース グループの名前を入力し、[削除] を選択します。

    削除を確認するためにリソース名を必要とするフォームを示すスクリーンショット。

しばらくすると、リソース グループとそのリソースのすべてが削除されます。