2016年8月21日日曜日

Docker + github + golang + Elastic BeanstalkでGo言語を用いたAPIサーバの開発的なお話(ローカルインポートもするよ)

  • このエントリーをはてなブックマークに追加

とりあえず新しいことに挑戦しようということで、現在Go言語で色々と開発してるっていう。
今度まとめるかもしれないかもだけど、Go言語は色々と便利だっていう感じなので使っちゃおうって感じ。
で、その際に環境をちゃんとまとめていかないとなぁと思って、Dockerを使おうとか、ちゃんとGithubでやっていこうとか思ったっていう。

そうなるとDeployをしたいわけだけども、Deploy環境ってどうやって整えようとか、
いちいちEC2のインスタンスに頑張ってアップしていくのもなぁ〜って思ってたところ、
Elastic Beanstalkがdockerにも対応してるじゃんってことで今回その環境でやろうかっていう感じで。

で、だいたいのサンプルは転がってはいるんだけど、ローカルインポートだとかそこらへんはのってないので、今回はそれを踏まえたお話的な。

■構成

.
├── Dockerfile
├── Dockerrun.aws.json
├── README.md
├── handler
│   └── handle.go
└── main.go

とりあえずやりたいこととしては、main.goでechoというフレームワークをインポートし、
/helloにアクセスしたらローカルパッケージhandlerのhandle.goにて表示をするという感じのことをしたい。

ちなみにさくっと手順を書くとこうなる。
1:main.goなどアプリケーションを記述
2:githubにpushする
3:DockerfileおよびDockerrun.aws.jsonを作成
4:Elastic Beanstalkでアプリケーションを作成
5:eb init、eb deployでデプロイをする


■main.goとhandler/handle.go

package main

import (
  "./handler"

  "github.com/labstack/echo"
  "github.com/labstack/echo/engine/standard"
  "github.com/labstack/echo/middleware"
)

func main() {
  e := echo.New()

  e.Use(middleware.Recover())

  /* routing */
  e.Get("/hello", handle.MainPage())

  e.Run(standard.New(":3000"))
}
package handle

import (
  "github.com/labstack/echo"
  "net/http"
)

/* func */
func MainPage() echo.HandlerFunc {
  return func(c echo.Context) error {
    return c.String(http.StatusOK, "Hello World")
  }
}

単純にインポートして表示するみたいな。
main.goでportを3000にしているのは、elastic beanstalkにおいてdockerコンテナは3000で呼び出されるため。
それに合わせる必要がある。


■DockerfileおよびDockerrun.aws.json

FROM golang:1.7

# Set GOPATH/GOROOT environment variables
RUN mkdir -p /go
ENV GOPATH /go
ENV PATH $GOPATH/bin:$PATH

# go get all of the dependencies
RUN go get github.com/labstack/echo
RUN go get github.com/labstack/echo/engine/standard
RUN go get github.com/labstack/echo/middleware

# Set up app
ADD . /app

EXPOSE 3000

CMD ["go", "run", "/app/main.go"]
{
  "AWSEBDockerrunVersion": "1",
  "Ports" : [{ "ContainerPort": "3000" }]
}

Dockerfileではgo公式のdockerリポジトリを引っ張ってくる。
その際に-onbuildとかはつけないようにする。
で、GOPATHなどの設定をし、main.goなどファイル内で使用するパッケージをgo getしてインポートする。
そしたら適当にappっていうフォルダを作ってその中にファイルを入れ、main.goをrunするといった感じ。
ちなみにEXPOSE3000としてるのは、main.goと合わせるため。
単純にgo runをするとローカルインポートなどの問題が出てくるため、ちゃんとmainを指定してあげる。

そしてDockerrun.aws.jsonではコンテナのポートを3000に合わせるために記述する必要がある。


ってな感じでとりあえずはファイルを構成してあげるっていう。
で、githubを使ってとりあえず色々とpushしたりする。

で、自分が作業しているディレクトリ(main.goが置いてあるところ)でeb-cliを使ってeb initをし、
アプリケーションを指定してeb deployをしてあげると見事にgithubを通してdockerコンテナをelastic beanstalkに渡せるみたいな。


■golangのonbuildを使ってサクッと構成する方法

ローカルインポートとか、あとはgithubのプライベートリポジトリに入っているパッケージを取得するということがなければ、onbuildを使うとサクッと出来上がって便利ではある。

FROM golang:1.7-onbuild

EXPOSE 3000

ってな感じでDockerfileを書いてあげるだけでサクッとアップできるという。
これは中で自動的にgo getをしてくれるからわざわざDockerfile内でgo getを記述する必要がないっていう。


っていうことでとりあえずgolangを書いて、Dockerとgithubを使ってElastic Beanstalkにデプロイするみたいな。
ローカルインポートのことを考えないのであればonbuild形式が一番楽だと思われるみたいな。

Adsense