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経由やり方もある、らしいけど。。。