こんにちは!エンジニアのH.Yです。
皆様はGoogleAppEngine(以下 AppEngine)をご存知でしょうか?
自分でサーバ構築を行わずとも、コードを書いて所定の方法でデプロイをするだけでGoogleの強力なインフラ上でWebアプリケーションが作成できてしまう優れものです!
個人的には下記のようなところが素晴らしいと思っています
- ある程度のアクセスまではずっと無料!
- アクセス量に応じて自動的にスケーリング
- GoのWeb環境を簡単に使用することが出来る
詳しくはこちらも御覧ください
個人的にWeb環境のGoを気軽に書けるというのは大きいです。
こういうのって大抵導入が大変でコードを書くまで時間がかかってイヤになっちゃうのですが、AppEngineは比較的簡単なので挫折しにくいですね!
今回はHello Worldをブラウザ上で表示するまでをやっていきます。
操作はWindowsで行いますが、恐らくMacでもほぼ大差ない操作で導入ができると思います!
# Pythonのインストール
https://www.python.org/downloads/
導入に際してPython2.xが必要ですので、上記サイトの「Download Python2.7.11」をダウンロード後起動し、手順に従ってインストールしてください
インストール後コマンドプロンプトを開き
1 2 |
C:\>python -V Python 2.7.11 |
と出てくればOKです
# SDKのインストール
https://cloud.google.com/appengine/downloads?hl=ja#Google_App_Engine_SDK_for_Go
ここのページに下記のような部分があると思うので、環境に合わせてファイルをダウンロードZIPを解凍して。
インストール後コマンドプロンプトを開きgoappと打ち
1 2 3 4 5 6 7 8 9 10 11 12 |
C:\>goapp Go is a tool for managing Go source code. Usage: goapp command [arguments] The commands are: serve starts a local development App Engine server deploy deploys your application to App Engine ... |
こんな感じでヘルプ一覧が出てくればOKです
# Google Cloud Platformプロジェクトの作成
https://console.cloud.google.com/?hl=ja
Googleアカウントにログインして、GoogleCloudPlatform画面を開くと右上にプロジェクト選択画面があるので「プロジェクトを作成」ボタンをクリックします
すると下記のような画面が出てくるので、プロジェクト名を設定して、「作成」を押します。
この時「プロジェクトID」が後々必要になるのでどこかにメモしておいてください
# ソースコードの準備
最低限「main.go」とコンフィグファイルである「app.yaml」が必要です。
https://github.com/ekos/appengine_go_sample
上記にファイルを用意したので、参考にしてください。内容は↓のような感じになっています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package main import ( "net/http" "github.com/go-martini/martini" "appengine" ) func init() { m := martini.Classic() m.Use(AppEngine) m.Get("/", func() string { return "Hello world!" }) //m.Group("/hoge", func(r martini.Router) { // r.Get("/huga", func(c appengine.Context) string { return hoge.exampleFunc(c) } ) //}) http.Handle("/", m) } func AppEngine(c martini.Context, r *http.Request) { c.MapTo(appengine.NewContext(r), (*appengine.Context)(nil)) } |
「main.go」ですが今回はせっかくなのでフレームワークのmartiniを使用しています。Rubyで言うSinatraに当たるフレームワークらしいです(使ったこと無い)
12行目~14行目が http://example.com/ にマッチするルーティングを表しておりHello worldという文字列を返却してます。
15行目~17行目はサンプルとして http://example.com/hoge/huga へのルーティングが書いてあります。
AppEngineの様々なツールを使用するため外部メソッド内でAppEngineのコンテキストを使用する機会がよくあるので、コンテキストを引き渡す例も同時に書きました。
1 2 3 4 5 6 7 8 |
version: 1 runtime: go api_version: go1 handlers: - url: /.* script: _go_app secure: always |
今回は全てのURLをGoスクリプトで処理するようにhandlersパラメータに書いてあります。
画像などにGoプログラムを通さず静的アクセスさせる場合はここに複数のURLパターンを書くことになります。
versionの整数値はデプロイするときのバージョンを指定することができ、指定したバージョンに即座に切り戻したりなんかが可能です。
# プロジェクトとリソースの紐付け
上記2ファイルを適当なディレクトリに設置し、コマンドプロンプトを開きます
1 |
C:\>appcfg.py -A <PROJECT_ID> update /path/to/project |
上記の用にコマンドを打ってください。
<PROJECT_ID>には先ほどメモしておいたプロジェクトIDを
/path/to/project にはファイル設置したディレクトリを指定してください。
これを打つと自動的にブラウザが立ち上がり、認証画面が出てきますので、「認証」を押します。
# リソースのダウンロード
先ほどmain.goで使用していた
github.com/go-martini/martini
のような外部のライブラリを使用する場合、事前にローカルにライブラリをダウンロードする必要があります。
コマンドプロンプトを立ち上げ
1 |
C:\>goapp get github.com/go-martini/martini |
のように打てばダウンロードできます。
# デプロイ前検証
AppEngine上にファイルをアップする前にローカルで検証することが可能です。
1 |
C:\>goapp serve /path/to/project |
起動している間は
でアクセスが可能になります。
アクセスするとコマンドプロンプト上にアクセスログ/エラーログが流れ、起動している間にGoファイルを更新するとそれを自動的に検知しコンパイル、即座に確認できます!便利!
「Hello world!」がブラウザ上に表示されてれば成功です!
# デプロイ
下記コマンドでデプロイを行います。
1 |
C:\>goapp deploy /path/to/project |
デプロイが完了すれば
https://[PROJECT_ID].appspot.com/
でグローバルアクセスが可能になり、「Hello world!」がデプロイまえ検証と同じく表示されるはずです!
# おわりに
以上、走りでの説明でしたがいかがでしたか?
思ったより簡単に導入が済んでしまう・デプロイが簡単なので、コーディングに集中出来る環境が整うのではないかなと思っています。
みなさんもぜひトライしてみてください!
※ブログ掲載のプログラムのインストールは、自己責任で御願いします。インストール等の結果にかかるハードウェアの不稼働等は、 当ブログでは一切サポートしておりませんので、予め御了承下さい。