Edited at

Goで書いたAPIサーバーをGoogle App Engineへデプロイするまでの最低限の手順

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をインストールする。

https://cloud.google.com/sdk/docs/

GCP SDKはyumaptでインストール/管理しないことが推奨されている。


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の作成


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

ブラウザが起動し、デプロイされたコードの動きを確認できる。


参考

https://cloud.google.com/appengine/docs/standard/go/building-app/creating-your-application