読者です 読者をやめる 読者になる 読者になる

golangで書いたアプリケーションをどう動かすか?

まとまりなく、何パターンか列挙します。

アプリケーションコンテナで動かす

通常ステートレスなアプリに限られると思いますけど、dockerで動かすというやり方です。
# 個人的にはdocker 1.12で組み込まれたswarmモードがすごくお手軽でよいと最近思ってます。

バイナリはstatic linkでビルドして、alpineで動かすと軽量でイイカンジです。
Dockerfileは以下みたいなカンジ

FROM alpine
RUN apk add --no-cache ca-certificates
COPY your_app /usr/local/bin/
CMD ["your_app"]

外部サービスにssl/tls接続するのに必要なのでca-certificatesを突っ込んでます。
証明書周りを自分でなんとかするんなら、busyboxにするのもアリかと。

supervisordで動かす

定番ですね。
個人的にはOSのお決まりのサービス管理方法(init.dやsystemd)と異なるレイヤが増えるので好きではないです。

initスクリプトを頑張って書く

/etc/init.d/hogehoge みたいなスクリプトを用意しておいて、以下のように使うイメージです。

# service hogehoge start

中身はnohupを使ってなんちゃってdaemonize、とかですね。
スクリプト書くのは正直ダルいですけど、前処理/後処理を柔軟に書けるので、systemd以前はコレを好んでやってました。

systemdのサービスで動かす

/etc/systemd/system/ 以下にserviceファイルを書いて、systemctlで頑張ります。

serviceファイルはミニマムだと以下のようなカンジです。

[Unit]
Description=hogehoge

[Service]
Type=simple
ExecStart=/path/to/hogehoge
ExecStop=/bin/kill -SIGTERM $MAINPID

[Install]
WantedBy = multi-user.target

ExecStartPre/ExecStartPost/ExecStopPostで前処理、後処理も書けます。
ExecStopPreは存在しませんが、停止時の前処理はExecStopが複数記述できるので、それで対応しましょう

なお、limitsの設定とか実行ユーザの指定も簡単です。

[Service]
LimitNOFILE=65536
User=hogehoge

また、Type=simpleの場合は、起動したタイミングでsystemdは起動完了とみなしてくれるんですが、 アプリケーション的に初期化に時間が掛かるケースもあると思います。

そんな時はアプリをsd_notifyに対応させた上で、Type=notifyにしてあげればイイカンジになります。

というわけでsd_notifyに対応するためのライブラリを書いてみました。
使い方はsampleを見ればすぐわかると思います。

Google App Engineで動かす

書いといてアレですけど、すみません、やったコトないです(;・∀・)
docker以上に軽量でいいんじゃないですかね? 知らんけど。

Herokuで動かす

やったコトないですけど、選択肢の一つとして。

AWS lamda?

公式対応があるといいなぁ。。。
# node経由やり方もある、らしいけど。。。