演習 - カスタム ハンドラーを使用してアプリを構築する

完了

この演習では、Go を使用してサーバーレス アプリを構築して実行します。

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

最初に Visual Studio Code の Azure Functions の拡張機能を使用して、アプリのスキャフォールディングを行います。

  1. [ビュー]>[コマンド パレット] を選択します。
  2. [Azure Functions: 新しいプロジェクトの作成] を選択します。
  3. フォルダー (通常は現在のフォルダー) を選択します。
  4. [言語を選択] で、[Custom Handler](カスタム ハンドラー) を選択します。
  5. [Select a template for your first function](最初の関数のテンプレートを選択する) で、[HttpTrigger] を選択します。
  6. アプリに hello などの名前を付けます。
  7. 承認レベルで [anonymous](匿名) を選択します。 これは必要に応じて後で変更できます。

これで、次のようなプロジェクトが得られます。

hello/
  function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json

アプリを作成する

次の一連の手順では、HTTP トリガーに応答できるアプリを作成します。

  1. server.go という名前のファイルをプロジェクト ルートに作成します。

  2. server.go の内容を次のようにします。

    package main
    
    import (
     "fmt"
     "io/ioutil"
     "log"
     "net/http"
     "os"
    )
    

    上のコードにより、HTTP アプリを構築して環境変数を検索するために必要なすべてのライブラリがインポートされます。

  3. import ステートメントの後に次のコードを追加します。

    func main() {
      customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
      if !exists {
        customHandlerPort = "8080"
      }
      mux := http.NewServeMux()
      // mux.HandleFunc("/api/hello", helloHandler)
      fmt.Println("Go server Listening on: ", customHandlerPort)
      log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    }
    

    main() 関数は、自動的に呼び出されます。 コードの最初の行には、FUNCTIONS_CUSTOM_HANDLER_PORT 環境変数からの読み取り方法が示されています。

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    

    次に、関数ではポートが存在するかどうかを確認します。 存在しない場合、関数にはポート 8080 が割り当てられます。

    if !exists {
      customHandlerPort = "8080"
    }
    

    次のコードでは、HTTP サーバー インスタンスをインスタンス化します。

    mux := http.NewServeMux()
    

    重要な最後の行では、ListenAndServe() メソッドを使用して、特定のポートのリッスンを開始し、要求を受信する準備ができていることを通知します。

    log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    
  4. 残りのコードを追加します。 まず、次の行をローカライズし、コメント解除します。

    // mux.HandleFunc("/api/hello", helloHandler)
    
  5. import ステートメントと main() 関数の間に、次のコードを追加します。

    func helloHandler(w http.ResponseWriter, r *http.Request) {
      w.Header().Set("Content-Type", "application/json")
      if r.Method == "GET" {
        w.Write([]byte("hello world"))
      } else {
        body, _ := ioutil.ReadAll(r.Body)
        w.Write(body)
      }
    }
    

    helloHandler() 関数では、コンテンツの種類を application/json に設定します。 これは、"hello world" または投稿された本文 (ある場合) で応答します。

アプリを実行する

この時点でコードの作成は完了しましたが、このシナリオが機能するようにするには、いくつかの構成を行う必要があります。 実行可能ファイルの場所を指定して、Functions ホストがそれを見つけ出せるようにする必要があります。 また、ルーティングを構成し、このアプリが HTTP トリガーを処理するが他の種類のバインディングを処理しないことを指定する必要があります。

  1. ターミナルから、プロジェクト ルートで go build server.go を実行します。

    go build server.go
    

    この手順では、macOS と Linux 上では server、Windows OS 上では server.exe という名前の実行可能ファイルを作成します。

  2. host.json ファイルを開き、customHandler の中にある defaultExecutablePath 要素を見つけます。 macOS と Linux では ./server、Windows OS では .\server.exe を指定します。

  3. customHandler 要素の下に enableForwardingHttpRequest 要素を追加し、値 true を指定します。 customHandler 要素は次のようになるはずです。

    "customHandler": {
     "description": {
       "defaultExecutablePath": "./server",
       "workingDirectory": "",
       "arguments": []
     },
     "enableForwardingHttpRequest" : true
    }
    
  4. ターミナルから、プロジェクト ルートで func start を実行します。 これにより、Functions アプリが起動します。

    func start
    

    出力の最後に、次のような出力が表示されます。

    Functions:
    
         hello: [GET,POST] http://localhost:7071/api/hello
    
  5. ブラウザーで http://localhost:7071/api/hello にアクセスしてください。 "hello world" が出力されるはずです。

おめでとうございます。 Go でサーバーレス アプリを開発しました。