演習 - キュー メッセージを処理する

完了

この演習では、メッセージ キュー内のメッセージでトリガーできるルートを使用してアプリケーションを拡張します。

アプリをスキャフォールディングする

この演習では、新しい Azure Functions アプリを開始します。 新しいディレクトリを作成し、そのディレクトリに移動します。

  1. [ビュー]>[コマンド パレット] を選択します。

  2. [Azure Functions: 新しいプロジェクトの作成] を選択します。

  3. フォルダー (通常は現在のフォルダー) を選択します。

  4. [言語を選択] で、[Custom Handler](カスタム ハンドラー) を選択します。

  5. [Select a template for your first function](最初の関数のテンプレートを選択する) で、[HttpTrigger] を選択します。

  6. アプリに queueTrigger などの名前を付けます。

  7. 承認レベルで [anonymous](匿名) を選択します。 これは必要に応じて後で変更できます。

  8. ルートで、server.go という名前のファイルを作成します。 これで、プロジェクトに次のファイルが作成されます。

    queueTrigger/
      function.json
    .funcignore
    .gitignore
    host.json
    local.settings.json
    proxies.json
    server.go 
    
  9. queueTrigger ディレクトリの function.json ファイルにアクセスします。 type 要素内の最初のバインド エントリを見つけます。

    {
       "authLevel": "anonymous",
       "type": "httpTrigger",
       "direction": "in",
       "name": "req",
       "methods": [
         "get",
         "post"
       ]
     }
    

    このバインド エントリを次の構成に変更します。

    {
       "name": "queueItem",
       "type": "queueTrigger",
       "direction": "in",
       "queueName" : "items",
       "connection": "AzureWebJobsStorage"
    }
    

    このステップでは、name プロパティを設定しました。 後でコード内でこれを参照します。 また、トリガーの種類を queueTrigger に変更しました。これによって、キュー メッセージをリッスンできるようになります。

    この queueName 値は、特定のキューを指しています。 後でエミュレーターを実行する場合は、この名前のキューを作成します。

    最後に、キューへの接続文字列を格納する local.settings.json の変数を指定しました。

アプリを作成する

この時点で、アプリ スケルトンが出来上がっています。 これで、受信キュー メッセージを処理できるコードを追加する準備ができました。

  1. server.go ファイルを開き、次のコードを追加します。

    package main
    
    import (
      "encoding/json",
      "fmt"
      "io/ioutil"
      "log"
      "net/http"
      "os"
    )
    
    func queueHandler(w http.ResponseWriter, r *http.Request) {
    }
    
    func main() {
      customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
      if !exists {
        customHandlerPort = "8080"
      }
      mux := http.NewServeMux()
      mux.HandleFunc("/queueTrigger", queueHandler)
      fmt.Println("Go server Listening on: ", customHandlerPort)
      log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    }
    

    ルートが /queueTrigger に設定されています。

  2. import セクションを見つけ、その下に次の構造体を追加します。

    type InvokeRequest struct {
      Data     map[string]json.RawMessage
      Metadata map[string]interface{}
    }
    
  3. queueHandler() メソッドを見つけ、次のように更新します。

    func queueHandler(w http.ResponseWriter, r *http.Request) {
      var invokeRequest InvokeRequest
    
      d := json.NewDecoder(r.Body)
      d.Decode(&invokeRequest)
    
      var parsedMessage string
      json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)
    }
    

    このコードでは、最初に受信応答ストリームから本文を読み取り、それをデコードします。

    var invokeRequest InvokeRequest
    
    d := json.NewDecoder(r.Body)
    d.Decode(&invokeRequest)
    

    次に、メッセージ自体は Unmarshal() を呼び出すことで取得されます。

    var parsedMessage string
    json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)
    

    メッセージが得られたので、それを出力してみます。

  4. 次のコードを追加します。

    fmt.Println(parsedMessage) // your message
    

    これでコードは完成しましたが、テストできるようにプロジェクトを構成する必要があります。

  5. host.json ファイルで、defaultExecutablePath 要素を見つけ、値を ./server にします。

    Note

    Windows の場合、.\server.exe の値を使用します。

  6. プロジェクト ルートで go build を実行して、server.go ファイルをビルドします。

    go build server.go
    

環境を構成する

次の手順では、環境を構成します。 ローカルで開発しているため、エミュレートされたメッセージ キューと通信できるように設定する必要があります。

  1. local.settings.json ファイル内で、Values 内の AzureWebJobsStorage という要素を見つけます (存在しない場合は追加します)。 これに UseDevelopmentStorage=true の値を設定します。 JSON エントリは次のようになります。

    "AzureWebJobsStorage" : "UseDevelopmentStorage=true"
    
  2. コマンド パレット ([表示]>[コマンド パレット]) を開き、[Azurite: Start Queue Service]\(Azurite: キュー サービスの開始\) を選択して、Azurite 拡張機能を起動します。

    Note

    この手順では、プロジェクトにいくつかのローカル ファイルを作成します。

  3. Azure ストレージ エクスプローラーを開きます。 左側には、エミュレーターの内容が表示されます。

  4. [Queues](キュー) ノードを右クリックし、新しいキューを作成するオプションを選択します。 items という名前を付けます。

    Screenshot that shows the emulator in Azure Storage Explorer, with a new queue created.

    Note

    キューには好きな名前を付けることができます。 ただし、これから function.json ファイルを構成します。 ここで指定するキューの名前は、function.json に指定する必要があります。

  5. queueTrigger ディレクトリの下の function.json を見つけます。 bindings 配列に次のエントリがあることを確認します。

    {
       "name": "queueItem",
       "type": "queueTrigger",
       "direction": "in",
       "queueName" : "items",
       "connection": "AzureWebJobsStorage"
     }
    

    queueName プロパティには、Azure Storage Explorer で作成したキューと同じ名前が付けらています。 connection プロパティでは、local.settings.json で設定した値を指定します。

    name プロパティには queueItem 値があります。 Go コードではこの値を使用して、キュー メッセージを解析します。

アプリを実行する

この時点で、すべての設定が完了しました。 必要な作業は、アプリを実行して Azure Storage Explorer を開始し、キュー メッセージを作成することだけです。 作成したコードで、そのメッセージを使用できるはずです。

  1. ターミナルで、プロジェクト ルートから func start コマンドを実行します。

    func start
    
  2. Visual Studio Code でコマンドパレットを開き、[Azurite: Start Queue Service](Azurite: キュー サービスの開始) を実行します。

  3. Azure Storage Explorer を開始します (まだ開始されていない場合)。

  4. Azure Storage Explorer で、[メッセージを追加] を選択します。

    Screenshot that shows the selection for adding a message on the queue.

  5. 表示されたダイアログボックスに「message」と入力し、[OK] を選択します。 作成したメッセージの詳細が表示されます。

    Screenshot that shows message details.

  6. Visual Studio Code では、関数が現在実行されているはずです。 ターミナルで、最後の行として message が表示されます。

    関数でキュー メッセージを使用して、その内容を書き出すことができました。

おめでとうございます。 キュー メッセージでトリガーできる Azure 関数を Go で作成しました。 また、そのメッセージを解析しました。

受信メッセージを使用して何を行うかはユーザー次第です。 たとえば、これをデータベースに格納したり、Web 要求でペイロードとして送信したりすることができます。