Go言語でJSONを返すAPIサーバーを書き、Google App EngineのStandard Environmentで運用するまでの最低限の流れのまとめ。
(他のサービス編もあるよ): Heroku版 / Arukas版
前段階
Golangのインストール
macOSの場合はbrew
でインストールするのが楽。
brew update
brew install go
Google App Engine(GCP SDK)を使う場合、Go 1.8以降を使っていても$GOPATH
を設定する必要がある。(参考: https://cloud.google.com/appengine/docs/standard/go/building-app/creating-your-application)
echo $GOPATH
で$GOPATH
が設定されていることを確認する。必要な場合は~/.bash_profile
などで$GOPATH
を設定する。
export GOPATH=$HOME/go/
Google Cloud Platform SDKのインストール
最新のGCP SDKをインストールする。
GCP SDKはyum
やapt
でインストール/管理しないことが推奨されている。
App Engine extension for Goのインストール
gcloud components install app-engine-go
Go言語用App Engineコンポーネントをインストールする
gcloud用のGoogleアカウント認証
gcloud auth login
でCLI(gcloud
)からプロジェクトのデプロイなどができるように、ログインしておく。
GCPプロジェクトの作成
Google Cloud Consoleで新しいプロジェクトを作成する。
ベース部分の実装
ローカル作業ディレクトリの作成
mkdir myapp
cd myapp
Google App Engine用App設定ファイル(app.yaml)の作成
runtime: go
api_version: go1
handlers:
# All URLs are handled by the Go application script
- url: /.*
script: _go_app
main.goの作成
package main
import (
"net/http"
"encoding/json"
"google.golang.org/appengine"
)
type Response struct {
Status string `json:"status"`
Message string `json:"message"`
}
func main() {
http.HandleFunc("/", handle)
appengine.Main()
}
func handle(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(Response{Status: "ok", Message: "Hello world."})
}
JSONでレスポンスを返すシンプルなHTTPサーバー
ローカルで動作確認
dev_appserver.py app.yaml
http://localhost:8080/ にローカルサーバーが立ち上がり、動作を確認できる。ソースコード(app.yaml, main.go)を書き換えると、自動的にリビルドが走る。
dev_appserver.pyが見つからない場合
brew
などでGoogle Cloud SDKをインストールした場合はPATHの設定の問題でdev_appserver.py
をみつけられないことがある。その場合はSDKのインストールパスの下にあるbinをPATHに追加する。
brew cask
でインストールした場合の例
export PATH="/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin:$PATH"
appengine用のライブラリが足りない旨のエラーが出る場合
go get "google.golang.org/appengine"
サーバーにデプロイ
gcloud app deploy --project myapp
project
引数をつけて、Google Cloud Platform上で作成したプロジェクトのidを指定する。GCP上にプロジェクトが一つしかない場合は、省略しても良いがつけておいたほうが安全。
動作確認
gcloud app browse --project myapp
ブラウザが起動し、デプロイされたコードの動きを確認できる。