GAE Go 開発環境の構築からテストアプリのデプロイまで【MacOS】

はじめまして、AppEngine goに触れる機会があったのでメモを兼ねてまとめようと思います。
私はGAE初心者なのでAppEngin goの開発環境を整えるのに少し苦労しました。
そのため間違っているところや非効率的な所もあるかもしれませんがご容赦下さい。
※あくまで自分用のメモ程度

#開発環境の構築
はじめにGoの開発環境構築から行いたいと思います。
所々省いている箇所がありますがご了承下さい。
##goenv
では早速goenvをインストールする所から始めようと思います。

goenvとはGoのバージョンを複数管理できるツールです。
これを用いることでAppEngineの開発に使うバージョン以外のGoを共存させることが可能になります。
今回はgoenvの取得をHomebrewから行います。(分かる人はgitからクローンしてもok)
**まだHomebrewをインストールしていない方は検索して入れて下さい。**

ターミナルを開いて以下のコマンドでgoenvを取得します。

``` bash:terminal
$ brew install goenv
```

.bash_profileに下記を記載してgoenvのパスを通し、ついでにGOPATHも設定します。
GOPATHはHomeディレクトに設定している方が多いので合わせます。

``` bash:.bash_profile
#goenv
export PATH="$HOME/.goenv/bin:$PATH"
export GOPATH=$HOME/go
eval "$(goenv init -)"
```

.bash_profileを再読込します。

``` bash:terminal
$ source ~/.bash_profile
```

これでgoenvコマンドが使えるようになると思うので以下のコマンドで確認してみます。

``` bash:terminal
$ goenv -v
goenv 1.0.0 //このようにバージョンが表示されれば成功
```

ここまでできた方はgoの導入に進みます。

##golang
goenvを使用してgolang本体のインストールを行います。
ターミナルで次のコマンドを実行して下さい。

```bash:terminal
$ goenv install -l
Available versions:
  1.2.2
    ~
  1.9.6
```

インストール可能なGoのバージョンが一覧表示されます。(長いので一部省略)
今回はAppEngine Goのバージョンに合わせて1.9.2をインストールします。

``` bash:terminal
$ goenv install 1.9.2 #1.9.2の部分を変えれば他のバージョンをインストールできます
```

インストールが終わったら正しくインストールされたか確認します。

``` bash:terminal
$ goenv versions
1.9.2 (set by /Users/ユーザー名/.goenv/version)
```

上記のようにインストールしたバージョンが表示されればOK

使うバージョンを指定して実際に使えるようにします。

``` bash:terminal
$ goenv global 1.9.2 #グローバルで使うバージョンを指定しています(今回はこちらでOK)
$ goenv rehash #実際に使えるようにする

#プロジェクトごとに使うバージョンを変えたい(ローカルで使うバージョンを指定したい)場合は下記
$ goenv local 1.9.2
$ goenv rehash #実際に使えるようにする
```

これでgoを使えるようになりました。
##GoでHello,World!してみる
環境の構築が最低限できたので実際にHello,World!してみたいと思います。
デスクトップなどにhello.goを作成して下さい。
適当なテキストエディタ(AtomやVS Code,vimなど)でhello.goを開き以下のコードを書きます。

``` go:hello.go
package hello

import (
	"fmt"
)

func main(){
	fmt.println("Hello,World!")
}
```

Hello,World!と表示されれば成功です。
#AppEngine Go standardにテストアプリをデプロイする
Goの環境構築に成功したところで、いよいよ本題のAppEngine Goに触れていきたいと思います。

前提として**GoogleCloudSDK**が必要となりますのでまだインストールしていない方は下記の公式ドキュメントがわかりやすいと思うのでこちらを見て導入して下さい。
https://cloud.google.com/sdk/docs/

CloudSDKのインストールが終わったら**GCPプロジェクトの作成**と**AppEngineインスタンスの生成**も**[GoogleCloudConsole](https://console.cloud.google.com/?hl=ja)**から行って下さい。

**CloudSDKのインストールとAppEngine goインスタンスの準備ができたら次に進みます**

##GoにAppEngine関連のパッケージを追加する
ここから先はGoogleのドキュメントを見ながら進めていきます。
[Setting up Your Project and Application](https://cloud.google.com/appengine/docs/standard/go/building-app/creating-your-application)

ターミナルを開いて以下のコマンドを入力します。

``` bash:terminal
$ go get -u google.golang.org/appengine/... #AppEngine関連のパッケージをGoに追加
```

このコマンドを実行するとGOPATH直下にgoフォルダが生成され、AppEngine関連のパッケージはこちらに格納されます。
GOPATHを確認したい方は以下のコマンドでパスを表示できます。

``` bash:terminal
$ echo $GOPATH
```

次に以下のコマンドでgo-appディレクトリを作成し、作成したディレクトリに移動します。

``` bash:terminal
$ mkdir $GOPATH/src/go-app #mkdirでディレクトリ作成
$ cd $GOPATH/src/go-app #cdで作成したディレクトリに移動
```

go-appディレクトリに移動したらapp.yamlを作成します。
app.yamlはAppEngineの設定などを記述するyamlファイルです。
作成には以下のコマンドを使用します。

``` bash:terminal
$ touch app.yaml
```

続いてapp.yamlを適当なテキストエディタで開き以下を記入,保存して下さい。

``` yaml:app.yaml
runtime: go #AppEngine goを使用します
api_version: go1 #AppEngine Go SDKのバージョン指定

handlers:

# All URLs are handled by the Go application script
- url: /.* #アクセスされたら
  script: _go_app #Goプログラムを起動します
```

ここまでできたらプログラム部分を書いていきます。
app.yamlと同じ階層にmain.goを作成して下さい。
(今回はGoogleのチュートリアルに従いmain.goとしていますが、本来はアプリケーション名と同じであることが望ましいらしい？です)

main.goは以下のコマンドで作成できます。

``` bash:terminal
$ touch main.go
```

main.goを作成したら下記の内容を記述,保存します。

``` go:main.go
package main

import (
	"fmt"
	"net/http"

	"google.golang.org/appengine" // AppEngineライブラリを読み込みます
)

func indexHandler(w http.ResponseWriter, r *http.Request) {
	// ドメインより後ろのパスが"/"以外だった場合にリダイレクト処理が発生します
	if r.URL.Path != "/" {
		http.Redirect(w, r, "/", http.StatusFound)
		return
	}

	fmt.Fprintln(w, "Hello, Gopher Network!")
}

func main() {
	http.HandleFunc("/", indexHandler)
	appengine.Main() // Flexible環境では必須ですが、Standardではなくても良いらしい
}
```

これでAppEngineにデプロイする準備はできましたが、まずはローカルサーバーで試してみたいと思います。

app.yamlのある階層で以下のコマンドを入力して下さい。

``` bash:terminal
$ dev_appserver.py app.yaml
```

ローカルサーバーが起動しブラウザ上から[localhost:8080](http://localhost:8080)でアクセスできると思います。
ここでエラーがでなければAppEngineにデプロイしても恐らく大丈夫です。
エラーが出た方はプログラムの問題か、テストサーバーを動かすのに必須となるPythonのバージョン等が関連していると思われます。
両方よく確認してみて下さい。
Pythonのバージョンは2.7である必要があります。(2018/05/30現在)

以下のコマンドでAppEngine Go standardにデプロイしてみましょう。


``` bash:terminal
$ gcloud app deploy
```

途中で内容が正しいか聞かれますので y を入力して下さい。
デプロイが終わるとブラウザから実際にアクセスできます。
アクセスするには以下のコマンドが便利です。

``` bash:terminal
$ gcloud app browse
```

既定のブラウザが自動起動してアプリが表示されれば成功です。

以上でAppEngine Go standardへのアプリデプロイは完了です。
お疲れ様でした。

#あとがき
今回始めてQiitaに記事を投稿したので直したほうがいい点や間違っている箇所などありましたらコメント頂ければと思います。
これからAppEngine Goを始める方の手助けになれば幸いです。