Go
AWS
docker
cloud9

AWS Cloud9でdepとDockerを使用したGo言語のAPIサーバーの開発環境を構築する

Go言語の開発は普通はローカルのPCで行う前提で環境構築が説明されているのですが、
AWS Cloud9はGo言語をサポートしているので、どれくらい開発に使えるものなのか試してみました。

拙作のAPIサーバーのstarter-kitが動作することを目標にしました。

このAPI starter-kitは、以下の機能を持っています。

  • Ginフレームワーク
  • O/Rマッパーにxorm
  • MySQLをデータベースとして使用
  • ローカル開発環境用にDockerを使用してMySQLを起動
  • nodemonを使用してファイル編集時にAPIサーバーを自動リロード

結論からいくと、これらの全てが問題なく動作しました。

順番に設定手順を説明していきます。

以下のことが前提です。

  • AWSアカウントを持っている
  • bashの操作が出来る

AWS Cloud9にログイン

AWS Cloud9の起動は既に終わっているところから説明します。
まだの場合、設定と起動手順はこちらのQiita記事などを参考にして下さい。

Cloud9を立ち上げて、下の画像のような状態からスタートします。
主に下側にある、bashのターミナルにコマンドを打ち込んで操作します。

Cloud9画面

Go言語のバージョン確認と更新

Cloud9のターミナル
$ go version

# 表示結果
go version go1.9.1 linux/amd64

go versiongo1.10.xの方がAPIサーバーの自動リロードが高速に行え、快適な開発がもたらされるため、Go言語のバージョンをアップデートします。

Go言語のアップデートには次のコマンドを実行します。
(go1.10.3は 2018/07時点の最新のバージョンです)

Cloud9のターミナル
$ wget https://storage.googleapis.com/golang/go1.10.3.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf ./go1.10.3.linux-amd64.tar.gz
$ rm ./go1.10.3.linux-amd64.tar.gz
$ go version

# 表示結果
go version go1.10.3 linux/amd64

環境変数の設定

以下の4つのコマンドを実行して、PATHとGOPATHを設定します。

Cloud9のターミナル
$ echo 'export GOPATH=$HOME/go' >> ~/.bashrc
$ echo 'export GOBIN=$GOPATH/bin' >> ~/.bashrc
$ echo 'export PATH=$GOBIN:/usr/local/go/bin:${PATH}' >> ~/.bashrc
$ . ~/.bashrc

Go言語のパッケージ管理ツールdepのインストール

Cloud9のターミナル
$ mkdir -p $GOBIN
$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh

リポジトリのclone

go-gin-xorm-starterリポジトリをcloneします。

Cloud9のターミナル
$ git clone https://github.com/gemcook/go-gin-xorm-starter.git $GOPATH/src/github.com/gemcook/go-gin-xorm-starter

これ以降、リポジトリルートで作業を行うため、cdコマンドで移動します。

Cloud9のターミナル
$ cd $GOPATH/src/github.com/gemcook/go-gin-xorm-starter

このディレクトリが左のフォルダビューで表示されるように設定します。

フォルダービューShow Home in Favoritesを選択します。

フォルダービューShow Home in Favoritesを選択

~/go/src/github.com/gemcook/ までディレクトリを開いていき、go-gin-xorm-starterをAdd to Favoritesします。

Add to Favorites

nodemon のインストール

nodemon コマンドをインストールします。

Cloud9のターミナル
$ npm i -g nodemon

nodenpmがインストール済みなので簡単です。

docker-composeコマンドをインストールする

Cloud9にはdockerコマンドは初めから入っていますが、docker-composeは入っていません。

以下のコマンドでインストールします。

Cloud9のターミナル
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

(2018/07時点の最新のバージョンなので、今時点の最新を入れたい場合は、docker-composeリリース一覧から最新のバージョンのインストールコマンドを確認して下さい)

Dockerを使用してMySQLを起動する

念のため既存のMySQLを停止しておきます。

Cloud9のターミナル
$ sudo service mysqld stop

docker-composeを使用してdockerを立ち上げます。

Cloud9のターミナル
$ docker-compose up

ターミナルにdockerの実行ログが流れます。

docker-compose up実行結果

このターミナルタブはそのまま置いておき、フォルダービューからgo-gin-xorm-starter を選択して、右クリックメニューからOpen Terminal Hereを選択すると新しいタブが表示されます。

Open Terminal Here

ちなみに、新しいタブはエディタエリアに開きますが、ドラッグ&ドロップで下のパネルに移動できます。

APIサーバーを立ち上げる

.envファイルの準備が必要なのでexampleをコピーして作ります。

Cloud9のターミナル(2)
$ cp .env.example .env

APIサーバーの依存パッケージをdepコマンドでインストールします。

Cloud9のターミナル(2)
$ dep ensure

サンプルのデータベースを作成します。

Cloud9のターミナル(2)
$ sh ./fixtures/init_db.sh

APIサーバーを起動します。

Cloud9のターミナル(2)
$ make start

APIサーバーのルーティング一覧がログとして表示されていれば成功です。

APIサーバー起動ログ

APIを呼び出す

Preview Running Applicationを開くと外部からアクセス可能なURLが表示されます。
このURLは、ポート8080で起動しているAPIサーバーに繋がっています。

Preview Running Application

Cloud9の右側に内部ブラウザが開き、下記のようなURLにアクセスしています。

https://<環境ID>.vfs.cloud9.<AWSリージョン>.amazonaws.com/

starter-kitは /v1/fruits でアクセスするとフルーツ一覧をJSONで返すので、

https://<環境ID>.vfs.cloud9.<AWSリージョン>.amazonaws.com/v1/fruits にアクセスして、APIの動作確認が出来ます。

/v1/fruitsにアクセス

/v1/fruitsにアクセスした結果

starter-kitを拡張していくには

以下の作業を行って下さい。

リポジトリの名前を変更して、自分のものにします

$GOPATH/src/github.com/<あなたのGitHubユーザー名>/<任意のリポジトリ名>

ソースコード全体に対して、以下の置換処理をします

置換前: gemcook/go-gin-xorm-starter
置換後: <あなたのGitHubユーザー名>/<任意のリポジトリ名>

【番外編】 adminerとphpMyAdminを使用してMySQLの内容を確認する

starter-kitではdocker-composeを使用して、MySQLを立ち上げましたが、
MySQL以外に、adminerとphpMyAdminも立ち上がっています。
Cloud9の仕様で、外部に公開出来るポートは 8080, 8081, 8082 に限られているため、adminerかphpMyAdminの使用する方のポートを8081に書き換える必要があります。

まずは、既に立ち上がっているdocker-composeを停止します。

以下のコマンドを実行するか、実行中のターミナルでCTRL+Cで中断を送信します。

$ docker-compose down

docker-compose.ymlを書き換えます。

docker-compose.yml(adminerを使用する場合)
  adminer:
    image: adminer
    ports:
      # - 10080:8080
      # adminerを使用する場合、10080:8080 -> 8081:8080に変更する
      - 8081:8080
    depends_on:
      - mysql
docker-compose.yml(phpMyAdminを使用する場合)
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
      PMA_USER: root
      PMA_PASSWORD: password
    ports:
      # - 9080:80
      # phpMyAdminを使用する場合、9080:80 -> 8081:80に変更する
      - 8081:80
    depends_on:
      - mysql

再び、dockerを起動します。

$ docker-compose up

 そのあと、ブラウザから https://<環境ID>.vfs.cloud9.<AWSリージョン>.amazonaws.com:8081/ にアクセスします。

phpMyAdmin アクセス例

まとめ

普段Go言語の開発をしているVSCodeと比べると、支援機能は正直いまいちです。

しかし、AWS Cloud9で大体のGo言語の開発は出来そうです。
大抵の必要なものは初めからインストール済みなので入門用の環境としては良いのではないでしょうか。