🎃
kamalでデプロイしたアプリケーションのhealthchek間隔を伸ばしたい
結論
deploy.yml
にinterval
を追加します
# Configure a custom healthcheck (default is /up on port 3000)
healthcheck:
interval: 20s
蛇足
以前,こんな記事を書きましたが
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
の値も大きくすることができるようです
Discussion
こんにちは、この
interval
の最大値ですが、max_attempts
の値も合わせて大きくすればもっと大きい値にできないでしょうか。手元のアプリは
interval: 30s
とmax_attempts: 20
にしてみていて、問題なくデプロイできて動いているようでした。