コンテンツにスキップ

サーバーで動かす

tegata v0.3.1 の文書

サーバーが新しい値を自分で取りにいくようにして、入れ替えのたびに各サーバーへログインしなくて済むようにします。タイマーが数分ごとに tegata render を流します。中身が変わったファイルだけを書き、それを使うものだけを再起動するか、読み直させます。

  • tegata の実行ファイル(インストール)。設定のファイルも、プロバイダーも、tegata init も要りません。
  • 自分のシークレットを読めるアイデンティティ。Compute Engine の VM なら、その VM のサービスアカウントを、そのシークレットの読み手であるアイデンティティに入れておきます。tegata check <identity> <templates> で、雛形の中のすべての名前を読めるかを確かめられます。
  • 雛形。たとえば /opt/app/templates に置きます。
/etc/systemd/system/tegata-render-app.service
[Unit]
Description=Fill the app's configuration from Secret Manager
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/tegata render --fail-on-missing \
--on-change 'systemctl reload-or-restart app.service' \
/opt/app/templates /etc/app
/etc/systemd/system/tegata-render-app.timer
[Unit]
Description=Fill the app's configuration from Secret Manager every 5 minutes
[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
RandomizedDelaySec=60
[Install]
WantedBy=timers.target
ターミナルウィンドウ
sudo systemctl daemon-reload
sudo systemctl enable --now tegata-render-app.timer
journalctl -u tegata-render-app.service # "changed: ..." and "ran: ..." when something changed
  • --on-change は、ファイルが変わったときだけ、1 回の実行につき 1 回、すべてのファイルを書いたあとに動きます。何も変わらなければ、何も書かず、何も再起動しません。
  • --fail-on-missing を付けると、読む権限の付け忘れ(サーバーが読めない名前)が、__NAME__ のままディスクに書かれることがありません。実行は失敗し、前のファイルが残り、どの名前かがジャーナルに出ます。
  • Compute Engine の VM なら、プロジェクトはメタデータのサーバーから取ります。ほかの場所では --project <project> を足し、サーバーが Google Cloud に認証できるようにしておきます。
  • systemd の外(cron、コンテナーの entrypoint)では、--exit-code で、何か変わったかを呼び出し元に伝えます。変わったら 3、変わらなければ 0 です。

変わったものだけを再起動する

Section titled “変わったものだけを再起動する”

1 つの雛形のディレクトリから複数のサービスの設定を作るときは、TEGATA_CHANGED に入る、変わったファイルの名前を使います。

#!/bin/sh
# /usr/local/bin/app-reload: called by --on-change
for f in $TEGATA_CHANGED; do
case "$f" in
app.env) systemctl restart app.service ;;
cloudflared.env) systemctl restart cloudflared.service ;;
*) ;;
esac
done

3. タイマーを使って入れ替える

Section titled “3. タイマーを使って入れ替える”

入れ替えのときのサーバーの側の手順は、タイマーの 1 周期を待つだけになります(ここでは長くても 6 分)。

ターミナルウィンドウ
tegata rotate session_key # the servers pick up the new value within one period
tegata settle session_key # after the old value is no longer needed; again one period
tegata prune session_key

prune の前に、すべてのサーバーが新しい値を持っていることを確かめてください。たとえば、各サーバーのジャーナルに changed: の行があるかを見ます。すぐに置き換わる値(データベースのパスワード、Tunnel のトークン)は、タイマーが動くまで新しい接続が失敗します。そういう値では待たずに、rotate のすぐあとに各サーバーでサービスを手で動かしてください(systemctl start tegata-render-app.service)。

4. どれくらいの間隔で、いくらかかるか

Section titled “4. どれくらいの間隔で、いくらかかるか”

1 回の実行で、雛形の中のシークレットをそれぞれ 1 回ずつ読みます。Secret Manager は、この読み出しに料金がかかります。請求先のアカウントごとに月 10,000 回までは無料で、それを超えると 10,000 回あたり $0.03 です(料金)。

間隔 月の実行回数 シークレット 10 個、サーバー 1 台 シークレット 10 個、サーバー 5 台
5 分 8,640 86,400 回、約 $0.23 432,000 回、約 $1.27
15 分 2,880 28,800 回、約 $0.05 144,000 回、約 $0.40
1 時間 720 7,200 回、無料 36,000 回、約 $0.08

金額は、無料の 10,000 回を 1 回だけ引いたものです。間隔が短いほど、入れ替えが早くサーバーに届きます。長いほど安くなります。たいていのサービスには、5〜15 分が合います。

このページの問題を報告する(GitHub。英語でも日本語でも)