徒然

日常を垂れ流します。

GoとGCEで小さなWebアプリケーションを構築する(1) ~とりあえずGCE上で動かしてみるの巻~

久々に書きます。 今日はお仕事ネタではなく、Golangの話題についてです。

ひと月ほど前に友人からこんな本を頂きました。ほんとありがとね。

一通り遊んだので、そろそろアウトプットしていきたいと思います。

この記事の目的

以下のようなWebサイトをWWW(この世のすべて)に公開することです。 世界一簡単なサイト

もちろん、ここで終わりにするつもりはなく、 簡単なDB連携やES、JSONでのREST通信的なものも書いてみるつもりです。ネタは豊富です!

あと、誰かが見れるようにした方が楽しいと思ったので、あえてデプロイまでつっこみます。Golangなら、デプロイ自体はとても簡単ですよ。
※セキュリティには配慮しつつ書きますが、どうしても知識不足なところはあると思います。 このエントリだけでなく、他記事からも情報を仕入れつつ、慎重にデプロイしてください。

使うお道具

手順

GCEを整える

GCEは、マシンタイプ f1-micro であれば、無料で使えます。 会員登録等は省略します。

まず、こちらにアクセスし、必要事項を記入しましょう。

名前:適当、マシンタイプ:f1-micro
Debian、標準永続ディスク30GB、HTTPトラフィックを許可

右上にお金かかりそうなことが書いてありますが、この構成の1台のみならば、お金は発生しないはずです。 発生したらごめんね。

VMインスタンスがすぐに登録され、起動します。

SSHの設定

当方、Windowsなので、PowerShell(OpenSSH)にてSSH公開鍵作成&SSH接続をしてみます。

4096bitのrsa暗号鍵ペアを作ります。 -f オプションは適宜変更してください。

PS >ssh-keygen -t rsa -b 4096 -f C:\Users\(あなたのおなまえ)\.ssh\id_rsa_test

指定したパスに次のファイルができます。

拡張子なしのファイルが秘密鍵。動かしてはならない。.pubは公開鍵。

拡張子なしのファイルは秘密鍵です、動かしてはなりません。誰かに悟られてはいけません。 .pubを公開鍵といいます。これをGCE上に置きます。

GCEコンソールに戻って、作成したVMインスタンスをクリック、 上タブの「編集」をクリックして、.pubファイルの中身をコピペします。

では、PowerShellで接続してみましょう。

PS> ssh (あなたのおなまえ)@VMインスタンスの外部IP -i c:/users/(あなたのおなまえ)/.ssh/id_rsa_test -p 22

これで環境設定は終了です。と言いたいところですが、次のファイアウォールの設定は絶対にしておきましょう。

ファイアウォール

ここが詳しいです。必ず設定しましょう。 22ポートを開放していると、世界中の怖い人がたくさん訪問してきますよー^^ eightyfivelife.com

また、同様の設定でHTTP通信のポートも制限しておくといいかもしれません。

ポートを8080のみ許可する

これで、環境設定は終了です。

Goのインストール

他にたくさん文献がありますので、省略します。

この辺りを見たらできるんじゃないんでしょうか。

qiita.com

テキストエディタにてファイル編集

環境変数GOPATH以下が、Golangの主なワークスペースです。 Golangに付属するコマンドは、大体ここを見ながら動きます。

さあ、初めてのWebアプリを書きましょう(ここまで記事を書くのに3時間)。 いまは、Golangの文法等については気にしなくて結構です。

%GOPATH%\src\first_webapp\server.go

package main

import (
    "fmt"
    "net/http"
)

func handler(writer http.ResponseWriter, request *http.Request) {
    fmt.Fprintf(writer, "Hello World, %s", request.URL.Path[1:])

}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

Goを コンパイルする

まず、Goのワークスペースフォルダに移動して、 上記で作成したプロジェクト「first_webapp」を初期化します。

PS> cd $env:GOPATH
PS> go install first_webapp

Goをビルドしてできたバイナリは、別OS上では動作しません。 しかし、環境変数を設定することによって、Linux用のバイナリを作成することが可能です。

PS>  $env:GOOS = "linux"
PS>  $env:GOARCH = "amd64"

ビルドの時は、いつの間にか出来ているbinフォルダに入って行います。

PS>  cd bin
PS>  go build first_webapp

さ、これでバイナリが出来上がっています。

上がLinux用。下はinstallで作成されたWIndows用の実行ファイル

あとはこのバイナリをSCP送信して、実行します。

PS>  scp -i (秘密鍵) (goのバイナリ)  (外部IP):~/
bash: first_webapp

WEBページにつないでみましょう。 開発用にポートを∶8080にしたことに注意してください。

これで、晴れて世界デビューです。おめでとうございます。

詳しい解説は、また別日に!!