サーバーで動かす
tegata v0.3.1 の文書
サーバーが新しい値を自分で取りにいくようにして、入れ替えのたびに各サーバーへログインしなくて済むようにします。タイマーが数分ごとに tegata render を流します。中身が変わったファイルだけを書き、それを使うものだけを再起動するか、読み直させます。
1. サーバーに要るもの
Section titled “1. サーバーに要るもの”tegataの実行ファイル(インストール)。設定のファイルも、プロバイダーも、tegata initも要りません。- 自分のシークレットを読めるアイデンティティ。Compute Engine の VM なら、その VM のサービスアカウントを、そのシークレットの読み手であるアイデンティティに入れておきます。
tegata check <identity> <templates>で、雛形の中のすべての名前を読めるかを確かめられます。 - 雛形。たとえば
/opt/app/templatesに置きます。
2. タイマーで埋める
Section titled “2. タイマーで埋める”[Unit]Description=Fill the app's configuration from Secret ManagerWants=network-online.targetAfter=network-online.target
[Service]Type=oneshotExecStart=/usr/local/bin/tegata render --fail-on-missing \ --on-change 'systemctl reload-or-restart app.service' \ /opt/app/templates /etc/app[Unit]Description=Fill the app's configuration from Secret Manager every 5 minutes
[Timer]OnBootSec=1minOnUnitActiveSec=5minRandomizedDelaySec=60
[Install]WantedBy=timers.targetsudo systemctl daemon-reloadsudo systemctl enable --now tegata-render-app.timerjournalctl -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-changefor f in $TEGATA_CHANGED; do case "$f" in app.env) systemctl restart app.service ;; cloudflared.env) systemctl restart cloudflared.service ;; *) ;; esacdone3. タイマーを使って入れ替える
Section titled “3. タイマーを使って入れ替える”入れ替えのときのサーバーの側の手順は、タイマーの 1 周期を待つだけになります(ここでは長くても 6 分)。
tegata rotate session_key # the servers pick up the new value within one periodtegata settle session_key # after the old value is no longer needed; again one periodtegata prune session_keyprune の前に、すべてのサーバーが新しい値を持っていることを確かめてください。たとえば、各サーバーのジャーナルに 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 分が合います。