GAEで初めてのGo言語製ウェブサーバーの作り方

今回は GAE でシンプルで基本的な Go言語製ウェブサーバーの作り方をご紹介します。

コンテンツの転載は固くお断りいたします。

Go言語コード

まずは Go言語コードをご紹介します。今回のコードは、GAE にアクセスするとブラウザに『Hello!』と表示するだけのものです。


package test

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello!")
}

func init() {
	http.HandleFunc("/", handler)
}

app.yaml

次に『app.yaml』です。今回はバージョン1.8の Go言語を使用し、スタンダード環境でサービス名は『test』としています。そして常時 SSL を使用します。

app.yaml については、『GAEでGo言語製ウェブサーバーのためのapp.yamlの基本的な書き方』をご覧ください。


# GAE設定
runtime: go
api_version: go1.8
service: test
env: standard
threadsafe: true

# アクセス振り分け
handlers:
  - url: /.*
    script: _go_app
    secure: always
    redirect_http_response_code: 301

デプロイ

GAE へのデプロイは『gcloud』コマンドを使用します。今回は『--version 1』とし、サービスのバージョンを指定しました。これを指定しないとデプロイする度に違うバージョンが自動的に用意されます。

app.yaml のあるフォルダへ移動し、そこで以下のコマンドを使用することでデプロイが可能です。


gcloud app deploy --version 1

このサービスへのアクセス(実行結果の確認)は GCP の『App Engine』を開き『サービス』を選び、サービス名をクリックすると出来ます。

コードの解説

先程のコードの通り、GAE でのウェブサーバーのコードはとてもシンプルです。しかし、これだけで HTTPS アクセスも可能で、更に自動的に GZIP圧縮されます。

GAE を利用しないウェブサーバーコードは『Go言語でシンプルで簡単なHTTPサーバーの作り方』や『Go言語で複数ドメインにも対応可能なHTTPSサーバーの作り方』でご紹介していますので、興味のある方はご覧ください。

パッケージ名

パッケージ名は main である必要はありません。開発環境によっては、パッケージ名が main だと『main関数がない!』と怒られかねないので、GAE を利用する際は他のものに変えておくと良さそうです。

handler関数


func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello!")
}

handler関数については『Go言語でシンプルで簡単なHTTPサーバーの作り方』で少しご紹介しましたので、そちらをご確認下さい。この部分については GAE 上で動作させる場合と、そうでない場合の違いはありません。

init関数


func init() {
	http.HandleFunc("/", handler)
}

この init関数は main関数の代わりになるものです。main関数は必要ありません。init関数では http.HandleFunc関数を使ってアクセスを振り分けます。

さいごに

コードはとてもシンプルですが、これだけでウェブサーバーが起動します。

ポート番号を指定してウェブサーバーを起動したり、複数のポートで起動させることは出来ません。ですが、上記のコードで HTTPアクセスも HTTPSアクセスも両方の対応が可能です。

Go言語で複数ドメインにも対応可能なHTTPSサーバーの作り方』ではタイトル通り、HTTPSで複数ドメインのアクセスにも対応出来るウェブサーバーの作り方をご紹介しましたが、コードは複雑です。しかし GAE ではこれらのコードを必要としません。

サーバー証明書の管理も GCP が自動的にしてくれますし、サーバー自体の管理もほとんど必要ありません。皆さんも GAE で開発を楽しんでくださいね!