IBM Cloud を利用して Go言語のアプリ開発入門（その１）


Go言語のサンプルコードをGitからクローンして、ローカル環境でテストして、IBMクラウドにデプロイして公開するまでの流れを書いたものです。Bluemix の[カタログ](https://console-regional.au-syd.bluemix.net/catalog/?taxonomyNavigation=apps&category=cf-apps)には、以下の様なアイコンがあり、Go言語で書かれたサンプル・インスタンスを起動できるのですが、その後に何をしたら良いのか良くわかりません。そこで、GitからクローンしたGo言語のソースコードを自分のPC上でコードを編集して、ビルド＆テスト、そして公開といった流れに沿って、確認してみました。

![スクリーンショット 2018-01-13 11.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/42829/4ca2b220-4c95-15b8-1bac-dddced95ec03.png "スクリーンショット 2018-01-13 11.52.46.png")

Golangのマスコット・キャラ
![ホリネズミ.png](https://qiita-image-store.s3.amazonaws.com/0/42829/3a9485dc-e385-d344-dc40-b90593fc880c.png "ホリネズミ.png")


# ローカル環境にGo言語の開発環境をインストール

## Ubuntu Linuxリポジトリから Go言語をインストールする
参考: Go Ubuntu Wiki https://wiki.ubuntu.com/Go
次はインストールでコマンドを実行する順番です。

~~~
$ sudo apt-get update
$ sudo apt-get install golang
$ go version
go version go1.2.1 linux/amd64
~~~

結構古いバージョンなので、goenvを利用してGo言語のバージョンを変更できる様にインストールする事にします。



## goenvを利用してGo言語をインストール
参考：GitHub https://github.com/syndbg/goenv

インストールする方法などは、pyenvやndenvと同じ要領です。

~~~
git clone https://github.com/syndbg/goenv.git ~/.goenv
~~~
ログイン・シェルに設定を加えます。

~~~
echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.bash_profile
echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(goenv init -)"' >> ~/.bash_profile
~~~
利用できるバージョンをリストして、インストールしてから、対象のディレクトリ下でバージョンを指定します。 globalのオプションで全体指定もできます。 

~~~
goenv install -l 
goenv install 1.9.2
goenv local 1.9.2
~~~
切り替わっていることの確認です

~~~
$ go version
go version go1.9.2 linux/amd64
~~~

## パッケージ依存関係ツールのインストール
参考:https://github.com/tools/godep

Go言語で開発するためのディレクトリを作成して移動して、環境変数GOPATHを設定します。
それから、`go get github.com/tools/godep`を実行します。 この例のディレクトリは `share/golang`

~~~
~$ echo $GOPATH
/home/vagrant/share/golang
~$ cd $GOPATH
~/share/golang$ ls

~/share/golang$ go get github.com/tools/godep
~/share/golang$ ls
bin  pkg  src
~~~



## Go言語のサンプルアプリをcloneしてビルド
IBM Cloud (旧 Bluemix)のサンプルコードを`git clone`してからビルドします。 このサンプル・アプリ https://github.com/IBM-Cloud/go-hello-world にあります。

~~~
cd $GOPATH/src
git clone https://github.com/IBM-Cloud/go-hello-world
~~~

~~~
cd go-hello-world
make
~~~


もし、バージョンが古くてエラーになる場合は、goenvでグローバルにgo言語のバージョンを指定します。

~~~
goenv global 1.9.2
~~~


## ローカル環境でテスト
ビルドできた実行モジュールを次の様に実行して、curlコマンでアクセスします。


![スクリーンショット 2018-01-13 11.14.36.png](https://qiita-image-store.s3.amazonaws.com/0/42829/5ac18135-ee33-c5d4-6de7-fbe82e34b85f.png "スクリーンショット 2018-01-13 11.14.36.png")

curlコマンドと応答です。 HTMLとJSON形式と両方で応答がきていることがわかります。

~~~
~$ curl http://localhost:8080
<html><h1>
    Main website
</h1>
</html>

~$ curl http://localhost:8080/hi
{"message":"hi"}
~~~


終わったら必須ではないですが、Cloud Foudry上でビルドできる事を確認するために `make clean` を実行しておきます。


# IBM Cloud へデプロイして公開する

## IBM Cloud のアカウントの取得

もしも、IBM Cloud のアカウントが無い場合は、https://console-regional.au-syd.bluemix.net/registration/?target=%2Fdashboard%2Fapps から作成します。

![スクリーンショット 2018-01-13 11.47.22.png](https://qiita-image-store.s3.amazonaws.com/0/42829/e8d07895-c624-3e1c-78e0-fe824362c1a0.png "スクリーンショット 2018-01-13 11.47.22.png")

アカウント取得後に、画面の案内に従って、コマンドラインのツールもインストールします。



## IBM Cloud Cloud Foundryアプリとしてデプロイ

デプロイの前に、設定を２箇所修正します。

* manifest.yml の hostname が一意になる様にします。 例えば `host: go-hello-world-takara` の様にホスト名の末尾に自分の名前などを追加しても良いと思います。
* `Godeps/Godeps.json`ファイルの"GoVersion": "go1.9.1" という様に、新しいバージョンに変更します。

ログインして `bx cf push` する事で、Cloud Foundry アプリケーションとしてデプロイできます。 

~~~
$ bx login
$ bx cf push
~~~



## テスト

デプロイする時に、urlsと表示されるところが、WebアプリケーションのURLになります。

~~~
$ bx cf push 
<中略>
requested state: started
instances: 1/1
usage: 128M x 1 instances
urls: go-hello-world-takara.mybluemix.net
~~~
curlでアクセスして確認します。

~~~
$ curl https://go-hello-world-takara.mybluemix.net/
<html><h1>
    Main website
</h1>
</html>

$ curl https://go-hello-world-takara.mybluemix.net/hi
{"message":"hi"}
~~~



# まとめ
やってみて、IBM Cloud で Go言語を利用して、Webアプリケーションを開発するのも簡単なんだということが判りました。
DBなどのサービスをバインドして、そのサービス資格情報を取得する方法など、書いていけたら良いですね。




# 参考資料
1 IBM-Cloud/go-hello-world https://github.com/IBM-Cloud/go-hello-world
2 今さらだけど、Go言語に入門するための情報源　https://qiita.com/MahoTakara/items/10fede35c03db1e3b849