シンプルな PaaS 「Now」で Go で書いたアプリのデプロイを試した

けっこう前に存在を知ったんですが、全然触っていなかったので試してみました。

Now 自体の説明は、公式サイト( Now – Realtime global deployments )や中の人の翻訳( http://qiita.com/nkzawa/items/8bf62549f79ebbcaafd8 )を読むのがいいと思います。

Now を運営している Zeit は、Next.js を開発していたり、Socket.IO の開発で有名な @rauchg が所属していて、そういった点でも興味を引きますね。 Now は、Node.js と Docker で動作するアプリのデプロイに対応しています。

今回は Go で書いたアプリを Docker をターゲットにデプロイしてみます。デプロイは、アプリのリポジトリに Dockerfile を用意して、now コマンドを叩くだけです。

事前にバイナリをビルドする

最初、golangをDockerでデプロイする — そこはかとなく書くよん。 のノリで事前にバイナリをビルド( GOOS=linux GOARCH=amd64 go build )して、Dockerfile の COPY でバイナリを追加する形でのデプロイを試みました。

こんなかんじです。

FROM scratch
LABEL name "hello"
COPY hello /hello
EXPOSE 80
ENTRYPOINT ["/hello"]

ただ、Go が出力するバイナリは helloworld 程度の内容でも 1 MB を超えるので(バイナリのサイズをめっちゃ減らす術があったら教えてください)、無料の OSS プランの最大ファイル容量( refs: ZEIT – Now Pricing )にひっかかってデプロイできませんでした。とぼとぼ。 ひとつ上の Premium プランであれば、問題なくデプロイできそうです。

デプロイの過程でビルドする

月 $15 は、お遊びで使うにはちょっと高いので、デプロイの過程でビルドさせることにしました。Dockerfile はこんなかんじです。

FROM golang:1.8
LABEL name "hello"
WORKDIR /go/src/app
COPY . .
RUN go-wrapper download
RUN go-wrapper install
EXPOSE 80
ENTRYPOINT ["go-wrapper", "run"]

使ってみた感想として、now コマンドを叩くだけでデプロイできる( git を使う必要すらない )というところで、非常にお手軽です。 アプリが Now の固有の仕様に引きずられない、ロックインされないのも好印象でした。特に Docker の上で動かすことができれば、他の Docker に対応している PaaS への移行も容易なので気持ちが楽です。 ちょっとした静的サイトをサクッと公開したり、プレゼンのデモアプリや趣味アプリを動かすサービスとして、有力な選択肢のひとつではないでしょうか。