Lapis Lazuli

technical blog for web developer

【Go】デプロイしたときにnet/httpでハマったこと

最近GoでAWSにデプロイしてハマったのでそのときの事を。

 

サーバー起動でハマる

まずGoでWebサーバーを立てるときは、net/httpパッケージを使うと思います。
他のルーティングを行うパッケージを使っていても基本的なしくみは同じです。
私の開発環境(mac)で実際にbuildして動いていたのでAWS環境(amazon linux)でも動くだろうと。

だけど現実は甘くなかった。
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8000", nil))
}

普通にnet/httpを使って標準的な方法だとこれで起動だと思います。
が、今回、ルーティングを行う為にgolila/muxというパッケージを使ってルーティングしてました。

これが仇となった。

func main() {
	router := mux.NewRouter()

	router.HandleFunc("/route/{param1}/{param2}", func1)
	router.HandleFunc("/route/{param1}", func2)
	router.HandleFunc("/route2/{param1}", func3)
	srv := &http.Server{
		Handler: router,
		Addr: "127.0.0.1:3000",
		WriteTimeout: 30 * time.Second,
		ReadTimeout: 30 * time.Second,
	}

	log.Fatal(srv.ListenAndServe())
}

こんな感じで起動していました。

で、全く動かずと。
curlしても返ってくるのは502のみ・・・

サンプルで入れたHelloWorldは出たので明らかにインフラのせいではありません

結論から言えば、&http.Serverで設定して、それをListenAndServeで起動してたのが間違いでした。

func main() {
	router := mux.NewRouter()

	router.HandleFunc("/route/{param1}/{param2}", func1)
	router.HandleFunc("/route/{param1}", func2)
	router.HandleFunc("/route2/{param1}", func3)

	log.Fatal(http.ListenAndServe(":8000", router))
}

これで成功し無事レスポンスが返ってくるように。

その原因と考察

macでビルドしてバイナリ実行したときは全然上手くいってたので、恐らく環境依存かと。
調べても出てこない・・・が、PHPのように実行環境がOS依存なのでそれが原因かなと推測。
そもそも起動方法がドキュメント通りではないので、ちゃんと公式読みましょうと。
www.gorillatoolkit.org


golilaは有名パッケージだけあって情報が充実してます。
一次情報を見るクセつけないといけないなぁ・・・

それでは今回はこの辺りで。