kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

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は、GCPAPIのみ利用できる、ローカルディスクが使用できないといった制約があります。特性を上手に利用して使う必要はありますが、非常に強力なバックエンドサービスなので、ぜひ利用してみましょう。

プログラム

そこで、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

インストール先でよく筆者は躓いたので、注意ください。

筆休め

App Engineは、開発者にとって非常に優位なサービスです。AWSでは、詳細なチューニングができるため、プロダクションのサービスを運用する場合に選択肢になりえます。一方で、サービスを提供することに主眼を置いて開発に力を入れたい開発者にとっては、明快で強力なGCPクラウドプラットフォームが助けになってくれるでしょう。

以上、「GolangでApp Engine Standard Editionを動作させる」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.