pre-connectフックでsecretsが利用可能に
Kamalでは、pre-connectフックでsecretsを参照できるようになりました。これにより、接続先のAPIキーや認証情報をsecretsから取得して使用することが可能になります。
背景
Kamalの4つの主要フック(pre-connect、pre-build、pre-deploy、post-deploy)のうち、pre-deployとpost-deployのみがsecretsをロードしていました。#924でsecretsの仕組みが導入された際、フックごとのsecretsロード対応に一貫性がない状態でした。
pre-connectフックは接続前処理を実行するタイミングであり、外部サービスへの接続時にAPIキーや認証トークンが必要になるケースが想定されます。しかし、このタイミングでsecretsが利用できないため、機密情報をフック内で直接記述するか、別の方法で管理する必要がありました。
技術的な変更
lib/kamal/cli/base.rbのpre_connect_if_requiredメソッドが変更され、run_hook呼び出しにsecrets: trueパラメータが追加されました。
変更前:
def pre_connect_if_required
if !KAMAL.connected?
run_hook "pre-connect" unless options[:skip_hooks]
KAMAL.connected = true
end
end
変更後:
def pre_connect_if_required
if !KAMAL.connected?
run_hook "pre-connect", secrets: true unless options[:skip_hooks]
KAMAL.connected = true
end
end
この変更により、pre-connectフック内で.kamal/secretsまたは.kamal/secrets.<destination>に定義されたsecretsを環境変数として参照できます。フックスクリプトは以下のように記述できます:
#!/bin/bash
curl -H "Authorization: Bearer $API_TOKEN" https://api.example.com/notify
設計判断
4つの主要フック全体で一貫したsecretsの取り扱いを実現する方針が採用されました。
PR内の議論では、フックドキュメントにsecretsのロード有無が明示されていない点が指摘されています。#924でsecretsの仕組みが導入された際、pre-deployとpost-deployのみがsecretsをロードする実装になっていましたが、本PRはその設計の一貫性を改善しています。
pre-connectはpre-buildよりも前に実行されるフックであり、接続確立時に機密情報が必要になるユースケースを想定した判断です。secrets: trueパラメータの追加のみで実現しており、既存のrun_hookメカニズムを変更していません。
まとめ
本PRは、pre-connectフックにsecrets: trueパラメータを追加することで、接続前処理でのsecretsアクセスを可能にしました。これにより、Kamalの4つの主要フックすべてでsecretsが利用可能となり、フック間の一貫性が向上しています。外部サービスへの接続時に必要な認証情報を安全に管理できるようになり、フックスクリプトの実装選択肢が広がります。