GolangでApp Engine Standard Editionを動作させる
本章では、Go言語で開発したプログラムをGoogle Cloud Platform (GCP)のApp Engine (Standard Edition)で動作させる方法について共有します。
はじめに
App Engineは、自動でスケーリングし、高可用性なフルマネージドなバックエンドサービスを構築できます。App Engineには、Standard EditionとFlexible Editionの2種類あります。Standard Editionの場合、デプロイ時間が数秒、運用コストが安く構成次第では無料で運用できます。個人の利用者にとっては、強みが大きいクラウドサービスになります。しかし、Standard Editionは、GCPのAPIのみ利用できる、ローカルディスクが使用できないといった制約があります。特性を上手に利用して使う必要はありますが、非常に強力なバックエンドサービスなので、ぜひ利用してみましょう。
プログラム
そこで、App Engine Standard EditionでGolangのプログラムを動作させる、最小の構成を紹介します。
まずは、App Engineの設定ファイルです。
# Golangプログラムを指定 runtime: go # Golangのバージョンを指定 api_version: go1 # すべてのリクエストをGolangで受け付ける、おまじない handlers: - url: /.* script: _go_app
次は、Goのメインプログラムです。
package main import ( "net/http" "encoding/json" // 重要なインポートです。appengineではなく、google.golang.org/appengineです。 "google.golang.org/appengine" ) type Response struct { Status string `json:"status"` Message string `json:"message"` } func main() { http.HandleFunc("/", handle) // AppEngineの設定を読み込み appengine.Main() } func handle(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(Response{Status: "ok", Message: "Hello world."}) }
注意点として、import先に「appengine」を指定してデプロイした場合、以下のエラーメッセージが表示されます。
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed: /work_dir/main.go:16:5: undefined: appengine.Main 2019/01/06 13:26:49 go-app-builder: build timing: 1×compile (91ms total), 0×link (0s total) 2019/01/06 13:26:49 go-app-builder: failed running compile: exit status 2
フォルダ構成
以下に本章でのフォルダ構成を示します。
+ tmp // メインのプロジェクトフォルダ ++ pkg ++ src +++ app.yaml +++ main.go + garbageCan // ライブラリをインストールして参照するためだけのフォルダ
デプロイ
デプロイで注意する点として、ライブラリのインストールは別プロジェクトで行い、メインのプロジェクトにインストールしてはいけません。
export GOPATH=~/garbageCan; go get google.golang.org/appengine cd ~/tmp/src export GOPATH=~/garbageCan; gcloud app deploy -v d001
デプロイ作業で、「google.golang.org/appengine」をインストールしなかった場合、以下のエラーメッセージが表示されます。
ERROR: (gcloud.app.deploy) Staging command [/google/google-cloud-sdk/platform/google_appengine/go-app-stager /home/hogehoge/tmp/src/app.yaml /home/hogehoge/tmp/src /tmp/tmpAQcQzD/tmpdUBHwn] failed with return code [1]. ------------------------------------ STDOUT ------------------------------------ ------------------------------------ STDERR ------------------------------------ 2019/01/07 06:31:06 staging for go1.9 2019/01/07 06:31:06 Staging Standard app: failed analyzing /home/hogehoge/tmp/src: cannot find package "google.golang.org/appengine" in any of: ($GOROOT not set) /home/hogehoge/tmp/src/google.golang.org/appengine (from $GOPATH) GOPATH: /home/hogehoge/tmp --------------------------------------------------------------------------------
また、メインのプロジェクトで「google.golang.org/appengine」をインストールした場合、以下のエラーメッセージが表示されます。
AppEngine “appengine” package always fails with “syscall” or “unsafe” import failure
インストール先でよく筆者は躓いたので、注意ください。