GAE/Go の環境構築からデプロイまでを試してみる

こんにちは、まちいろの工藤です。

弊社では通常 AWS を利用してインフラを構築しているのですが、最近開発で Go 言語を利用し始めているため、GCP の GAE/Go を触ってみました。

GCP の無料トライアルをはじめる

まず GCP の無料トライアルを開始します。動線がいくつかあるようなのですが、私は請求アカウントを登録する流れで無料トライアルを開始しました。登録が完了すると、$300 のクレジットがもらえました。

いつの間にか高額の請求が来て困らないよう、予算アラートの設定も行いました。

GAE のチュートリアルを進めてみる

トライアルを開始すると、自動的に「My First Project」というプロジェクトが作成されていたので、このプロジェクトを使って進めてみます。

GAE のダッシュボードにアクセスすると、上記のような画面が表示されます。画面右上に「チュートリアルを始める」とあるので、とりあえずこれを試してみました。Google Cloud Shell を使って、ブラウザ上でシェルを操作を行うことができます。便利・・・。

チュートリアルの内容はとても簡単なので割愛しますが、大まかに以下の内容でした。

1. サンプル Go リポジトリ を clone する
2. リポジトリ内に app.yaml という GAE のための設定ファイルがあることを理解する
3. gcloud コマンドで deploy を行う
4. ブラウザから GAE にデプロイされたアプリケーションにアクセスできることを確認する

Cloud SDK をインストールする

チュートリアルを終えたので、今度はローカルで開発した Go プロジェクトをデプロイするまでの流れを確認していきたいと思います。

まずは GCP を操作するための gcloud コマンドを含めた Cloud SDL をインストールしていきます。Cloud SDK は以下のサイトからダウンロードできますが、Homebrew でもインストールできるようです。

サイトからダウンロードした場合の手順は以下の通りです。gcloud コマンドが実行できるようになっていれば OK。

1. 展開した google-cloud-sdk を適当なディレクトリに配置
2. install.sh を実行
3. google-cloud-sdk ディレクトリ内に含まれる、completion.xxx.inc と path.xxx.inc ファイルをシェル起動時に読みこむようにしておく
4. gcloud components update を実行して最新にアップデート
5. gcloud components install app-engine-go を実行して、GAE 用のコンポーネントをインストールしておく

GAE にデプロイするリポジトリを用意する

確認用に HTTP サーバーを起動するための main.go を用意します。GAE で稼働させるためには、appengine.Main() という記述が必要です。

package main

import (
	"fmt"
	"net/http"

	"google.golang.org/appengine"
)

func main() {
	http.HandleFunc("/", handler)
	appengine.Main()
}

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

次に app.yaml を用意します。Go 1.11 系で Go modules を利用したい場合、runtime に go111 を指定します。また、handlers/script に _go_app を指定するという記事をよく見かけますが、auto を指定しないと後述のデプロイ時にエラーが出てしまいました。

runtime: go111

handlers:

  # All URLs are handled by the Go application script
  - url: /.*
    script: auto

ローカルで動作確認をするために、dev_appserver.py というスクリプトが用意されています。以下のコマンドを実行するとローカルでサーバーが起動し、動作確認を行うことが可能です。

$ dev_appserver.py app.yaml
INFO     2019-02-22 05:27:28,308 devappserver2.py:278] Skipping SDK update check.
WARNING  2019-02-22 05:27:28,688 simple_search_stub.py:1196] Could not read search indexes from /var/folders/q_/05j11mk91vg69hpwgfsmp1v40000gn/T/appengine.None.mkudo/search_indexes
INFO     2019-02-22 05:27:28,691 api_server.py:275] Starting API server at: http://localhost:54645
INFO     2019-02-22 05:27:28,692 instance_factory.py:178] Building with dependencies from go.mod.
INFO     2019-02-22 05:27:28,770 dispatcher.py:256] Starting module "default" running at: http://localhost:8080
INFO     2019-02-22 05:27:28,773 admin_server.py:150] Starting admin server at: http://localhost:8000
INFO     2019-02-22 05:27:34,310 instance.py:294] Instance PID: 5825

GAE にデプロイする 🚀

デプロイを行う前に、gcloud の認証と、デプロイ先となるプロジェクトの設定を行います。

gcloud config set project {プロジェクトのID}
gcloud auth login

完了したらようやくデプロイの実行です。Updating service はそこそこ時間がかかります。

$ gcloud app deploy
Services to deploy:

descriptor:      [xxx/app.yaml]
source:          [xxx/gae-go-sample]
target project:  [xxx]
target service:  [default]
target version:  [20190222t135207]
target url:      [https://xxx.appspot.com]

Do you want to continue (Y/n)?  Y

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 1 file to Google Cloud Storage                 ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://xxx.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

デプロイが完了したらブラウザでアクセスして動作確認をします。gcloud app browse コマンドを使うと、CLI からサクッとブラウザを起動することができます。

$ gcloud app browse
Opening [https://xxxx.appspot.com] in a new tab in your default browser.

先程書いた HTTP サーバーの実装どおり、レスポンスが返ってきています。

最後に

GAE/Go を使うと、Go アプリケーションが簡単にデプロイできることがわかりました。実際に実業務で使いこなせるよう、オートスケールやロギング、Cloud Datastore/Storage との連携など、さらに色々と調査してみようと思います。

この記事が気に入ったらサポートをしてみませんか?