🎃

kamalでデプロイしたアプリケーションのhealthchek間隔を伸ばしたい

2023/10/15に公開
1

結論

deploy.ymlintervalを追加します

# Configure a custom healthcheck (default is /up on port 3000)
healthcheck:
  interval: 20s

蛇足

以前,こんな記事を書きましたが
https://zenn.dev/onikukirai/articles/9f5c07278a5a14

kamal app logs

でログを覗いてみると,1秒毎にlocalhostからhealthcheckが行われていました

イメージ

 Started GET "/up" for 127.0.0.1 at 2023-10-14 17:45:21 +0000
I, [2023-10-10T17:45:21.563789 #1]  INFO -- : [64d8742d-895c-43cc-9b71-6b7bb543a7a6] Processing by HealthController#up as */*
 Started GET "/up" for 127.0.0.1 at 2023-10-14 17:46:21 +0000
I, [2023-10-10T17:45:21.563789 #1]  INFO -- : [64d8742d-895c-43cc-9b71-6b7bb543a7a6] Processing by HealthController#up as */*
 Started GET "/up" for 127.0.0.1 at 2023-10-14 17:47:21 +0000
I, [2023-10-10T17:45:21.563789 #1]  INFO -- : [64d8742d-895c-43cc-9b71-6b7bb543a7a6] Processing by HealthController#up as */*
 Started GET "/up" for 127.0.0.1 at 2023-10-14 17:48:21 +0000
I, [2023-10-10T17:45:21.563789 #1]  INFO -- : [64d8742d-895c-43cc-9b71-6b7bb543a7a6] Processing by HealthController#up as */*
 Started GET "/up" for 127.0.0.1 at 2023-10-14 17:49:21 +0000
I, [2023-10-10T17:45:21.563789 #1]  INFO -- : [64d8742d-895c-43cc-9b71-6b7bb543a7a6] Processing by HealthController#up as */*

そんな要件を求めてない場合,ここまでのヘルスチェックは過剰じゃないでしょうか
また,AWS cloudwatchにログを流している場合料金もあがりそうです
邪魔くさいのでこの間隔を伸ばせないかと試してみました

docker inspectでコンテナの情報を拾ってみる

  "Healthcheck": {
                "Test": [
                    "CMD-SHELL",
                    "(curl -f http://localhost:3000/up || exit 1) && (stat /tmp/kamal-cord/cord > /dev/null || exit 1)"
                ],
                "Interval": 1000000000
            },

"Interval" : 1000000000
なにやらそれっぽいものをみつけました
Dockerfileに

# Dockerfile
HEALTHCHECK NONE

を追加してみたりしましたが効果がありません

kamal setupでのログをよく見てみる

# 必要な部分だけ抜粋
Ensure app can pass healthcheck...

INFO [02be2305] Running docker run --health-cmd "curl -f http://localhost:3000/up || exit 1" --health-interval "1s" 

docker run --health-interval "1s" している!

deploy.ymlのここでintervalを設定していないと1sになるようだ

# deploy.yml
healthcheck:
  path: /healthz
  port: 4000
  max_attempts: 7
  interval: 20s

docker runのドキュメントを見ると
--health-intervalにはms,s,m,hを指定できると書いてあり
1時間にしようとしたのだが

healthcheck:
  interval: 1h
Releasing the deploy lock...
  Finished all in 54.2 seconds
  ERROR (Kamal::Cli::Healthcheck::Poller::HealthcheckError): Exception while executing on host 13.230.17.150: container not ready (starting)

healthcheckの結果をまっているのでintervalを長くしすぎるとデプロイが失敗したとみなされてしまうみたい..?

試してみたところ20sが最大でした

max_attemptsを調整することで, intervalの値も大きくすることができるようです

GitHubで編集を提案

Discussion

takahashimtakahashim

こんにちは、このintervalの最大値ですが、max_attemptsの値も合わせて大きくすればもっと大きい値にできないでしょうか。
手元のアプリはinterval: 30smax_attempts: 20にしてみていて、問題なくデプロイできて動いているようでした。