golangのプロジェクトをAWS EBにデプロイする

手元のgoプロジェクトをEBへデプロイした備忘録です。
ベストなのかどうか分からないですが、一応めも。

# ディレクトリ構成

プロジェクトはgit上で管理しています。
glideやginを使いたかったので、ちょっと変な感じになってますがここら辺は意見求むです。

```
GOPATH/
 |- bin/
 |- pkg/
 `- src/
     `- github/
         `- junpayment/
             `- hoge/   # ここから下がgit管理
                 |- .ebextensions/
                 |- apps/
                 |- static/
                 |- archive.sh
                 |- build.sh
                 |- Buildfile
                 |- glide.lock
                 |- glide.yaml
                 |- main.go
                 `- Procfile
```

# ソースバンドルの用意（前準備）
ここによると
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/go-environment.html

ソースバンドルを作ってデプロイするらしいです。
ソースバンドルは .ebextensions/**.config, Buildfile, Procfileに
起動時の設定などを記載してzipで固めたものです。

* g++とsqliteのインストール用設定

```.ebextensions/g++.config
packages:
  yum:
    gcc-c++: []
```

```.ebextensions/sqlite.config
packages:
  yum:
    sqlite: []
```

* goバイナリのビルド諸々

```yaml:Buildfile
make: sh ./build.sh
```

```build.sh
#!/usr/bin/env bash
export GOPATH=/var/app/staging
export GOBIN=/var/app/staging/bin
export PATH=$PATH:$GOBIN

echo "install glide..."
curl https://glide.sh/get | sh
echo "install glide done"

echo "install go packages..."
cd $GOPATH/src/github.com/junpayment/hoge/;
glide install;
echo "install go packages done"

echo "install libsass..."
cd $GOPATH/src/github.com/junpayment/hoge/;
glide install;
cd $GOPATH/src/github.com/junpayment/hoge/vendor/github.com/suapapa/go_sass/
sh ./install_libsass.sh
echo "install libsass done"

echo "build go binary"
cd $GOPATH
echo $GOPATH; pwd
go install github.com/junpayment/hoge || echo error_occuered!
echo "build go binary"
```

* サーバ起動する設定

```yaml:Procfile
web: LD_LIBRARY_PATH=/usr/local/lib PARENT_DIR=/var/app/current/src/github.com/junpayment/hoge bin/hoge
```

* なんでLD_LIBRARY_PATH？

今回、libsassというライブラリを/usr/local/libにインストールしていて、
bin/hogeがそれを使うんですが、EBだと/usr/local/lib以下にデフォルトでパスが通っていないため、通しています。

* なんでPARENT_DIR？

今回、goのFWとして使っているginは、publicに公開するディレクトリを設定することができます。
そのディレクトリがどこであるのかをこの環境変数で指定しています。
GOPATHとは違う階層にrootが存在するためこのようにしています。

# ソースバンドルの用意（実際に作る）

```archive.sh
#!/usr/bin/env bash

DEST_DIR=/tmp/working_`date +%s`
REP_URL="git@github.com:junpayment/hoge.git"

mkdir -p $DEST_DIR/go
mkdir -p $DEST_DIR/go/bin $DEST_DIR/go/pkg $DEST_DIR/go/src/github.com/junpayment/
git clone --depth 1 $REP_URL $DEST_DIR/go/src/github.com/junpayment/hoge

cp -a $DEST_DIR/go/src/github.com/junpayment/hoge/.ebextensions $DEST_DIR/go/
cp $DEST_DIR/go/src/github.com/junpayment/hoge/build.sh $DEST_DIR/go/
cp $DEST_DIR/go/src/github.com/junpayment/hoge/Buildfile $DEST_DIR/go/
cp $DEST_DIR/go/src/github.com/junpayment/hoge/Procfile $DEST_DIR/go/

cd $DEST_DIR/go
zip ../go.zip -r * .[^.]*
```

* 固める

```bash
$ sh archive.sh
```

そしたらこういう構成のzipができる

```
go.zip
 |- ebextensions/
 |   |- g++.config
 |   `- sqlite.config
 |- Buildfile
 |- build.sh
 |- Procfile
 |- bin/
 |- pkg/
 `- src/
     `- github/
         `- junpayment/
             `- hoge/
```

# EB側の準備
* アプリケーション,環境の作成,デプロイ
webコンソール上で環境まで作ります。
ElasticBeanstalk -> 新しいアプリケーションの作成 -> アクション -> 環境の作成

下記の設定で作成

プラットフォーム: Go
コードのアップロード: 先ほど作ったzipファイルを指定

Webコンソール上からお手軽にデプロイします。
あとは特にデフォルトでおk

以上です。

# ハマったこと
* libsass.soがビルドできない
g++が入ってなかったからでした。
前述の通り、g++.configを設定。

* libsass.soがリンクできない
こちらは/usr/local/libLD_LIBRARY_PATHに追加してクリア。

* /var/app/currentのvendor以下が空
glideを使っているので、../hoge/vendor/以下にパッケージがインストールされるはずでしたが、
空になっていたので、そこもハマっていました。
理由はデプロイ先の作業ディレクトリの指定間違いでした。

EBのデプロイ処理順序が下記のようにディレクトリを切り替えていて、

1. /var/app/staging/ 以下にソースをデプロイ
2. /var/app/staging/ 以下でビルドなど諸々作業
3. /var/app/current/ に最終的にコピー
4. /var/app/staging/ を削除

で、最初にbuild.shに書いてた glide install の展開先ディレクトリが /var/app/currentだったので
丸っと結果が消えていたのでした。
こちらも修正して対応。

* ログファイルがどこか分からない

```bash
$ tail -f /var/log/eb-activity.log # ビルド時のログ
$ tail -f /var/log/web-1.log       # webサーバのログ
$ tail -f /var/log/web-1.error.log # webのエラー
```

ここまで。