演習 - カスタム ハンドラーを使用してアプリを構築する
この演習では、Go を使用してサーバーレス アプリを構築して実行します。
アプリをスキャフォールディングする
最初に Visual Studio Code の Azure Functions の拡張機能を使用して、アプリのスキャフォールディングを行います。
- [ビュー]>[コマンド パレット] を選択します。
- [Azure Functions: 新しいプロジェクトの作成] を選択します。
- フォルダー (通常は現在のフォルダー) を選択します。
- [言語を選択] で、[Custom Handler](カスタム ハンドラー) を選択します。
- [Select a template for your first function](最初の関数のテンプレートを選択する) で、[HttpTrigger] を選択します。
- アプリに hello などの名前を付けます。
- 承認レベルで [anonymous](匿名) を選択します。 これは必要に応じて後で変更できます。
これで、次のようなプロジェクトが得られます。
hello/
function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json
アプリを作成する
次の一連の手順では、HTTP トリガーに応答できるアプリを作成します。
server.go という名前のファイルをプロジェクト ルートに作成します。
server.go の内容を次のようにします。
package main import ( "fmt" "io/ioutil" "log" "net/http" "os" )
上のコードにより、HTTP アプリを構築して環境変数を検索するために必要なすべてのライブラリがインポートされます。
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))
残りのコードを追加します。 まず、次の行をローカライズし、コメント解除します。
// mux.HandleFunc("/api/hello", helloHandler)
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 トリガーを処理するが他の種類のバインディングを処理しないことを指定する必要があります。
ターミナルから、プロジェクト ルートで
go build server.go
を実行します。go build server.go
この手順では、macOS と Linux 上では server、Windows OS 上では server.exe という名前の実行可能ファイルを作成します。
host.json ファイルを開き、
customHandler
の中にあるdefaultExecutablePath
要素を見つけます。 macOS と Linux では./server
、Windows OS では.\server.exe
を指定します。customHandler
要素の下にenableForwardingHttpRequest
要素を追加し、値true
を指定します。customHandler
要素は次のようになるはずです。"customHandler": { "description": { "defaultExecutablePath": "./server", "workingDirectory": "", "arguments": [] }, "enableForwardingHttpRequest" : true }
ターミナルから、プロジェクト ルートで
func start
を実行します。 これにより、Functions アプリが起動します。func start
出力の最後に、次のような出力が表示されます。
Functions: hello: [GET,POST] http://localhost:7071/api/hello
ブラウザーで
http://localhost:7071/api/hello
にアクセスしてください。 "hello world" が出力されるはずです。
おめでとうございます。 Go でサーバーレス アプリを開発しました。