しばらくKamal 1系を使っていたのだが、このほどRails 8になってKamalがデフォルトでインストールされるようになった。 これをきっかけに私も環境変数からkamal secretsを利用してみようと思う。

まずはパスワードマネージャーが必要だ。

私はこれまで特にパスワードマネージャーの類を使っておらず、自らの記憶に頼る方法を使っていたのだがいい加減こういったものを頼ってみることにした。 正直なところ、パスワードマネージャーを使っていれば安心という風潮はあるが、昔マスターパスワードを紛失してちょうどSMSが使えなくて困ったりといろいろと苦い記憶があるのでいつかまた同じことが起こりうることを憂いている。

そもそも自分のパスワードをあまりクラウドに預けるのも、自分が管理するのにもリスクが伴うのはさておき、単純にパスワードを他所様に預けるだけで年間数千円ものコストが発生する。 幸い私はシスアドを自称しているのでプライベートクラウドにパスワードを保存する方法を採用することにした。 回りくどいのだが1Passwordは論外で、VaultWardenを使うことにした。

細かい使用感は省くが、私はすでにこれを利用して数ヶ月は経つが概ね快適である。 ローカルでパスワード生成もできるようになって非常によい。 個人的にはAppleのパスワードマネージャーで生成できた頃が最もよかったのだが、これも昔話である。 SSLの証明書が必要だったりまあまあハードルは高いが、VaultWardenが動いていることを前提とする。

$ vw config server https://vw.lvh.me
$ vw login

vwコマンドをインストールしたら、configを使用すると自分のサーバーを指定できる。 コマンド経由でもパスワードを保存できるようなのだが、私はブラウザ経由を選んだ。

screenshot

  • New ItemからSecure Noteを選択する。
  • Nameには今回使用するプロジェクトでも指定しておく。
  • CUSTOM FIELDSに環境変数を入力して保存する。
# .kamal/secrets

# Example of extracting secrets from 1password (or another compatible pw manager)
SECRETS=$(kamal secrets fetch --adapter bitwarden --account admin@example.com --from Sample KAMAL_REGISTRY_PASSWORD RAILS_MASTER_KEY)
KAMAL_REGISTRY_PASSWORD=$(kamal secrets extract KAMAL_REGISTRY_PASSWORD ${SECRETS})

--fromNameで指定する。個人的にはKamalフォルダーを指定したかったのだが、この機能は他では使わないと思うのでおそらく問題ないだろう。

kamalを実行するたびにパスワードを入力しなければならないが、APIキーの入力よりはメールアドレスのほうがそれっぽいのでこちらを使うことにしようと思う。 正直なところ誰かとコード共有しているわけでもないし、パスワードをベタに書いてもよいかとも思うのだがこのあたりのお作法は慣れておきたいかなと思う。

追記:

kamal secrets extract JSON parse error on shell escaped secrets

どうやら何度か試してもうまくいかないので調べてみると、kamal secrets extractにバグがあるようだ。

こちらのコメントを参考に試してみる。

KAMAL_REGISTRY_PASSWORD=$(bw get item Sample | jq '.fields[] | select(.name=="KAMAL_REGISTRY_PASSWORD") | .value' | tr -d '"')

最終的にはこれに加えてSSHユーザーをdockerグループに加える必要もあった。 普段はrootというのもあり、予想以上にハマってしまった。 今回は比較的早い段階でデプロイしているため、他の要因が重ならなかったのもよかったかもしれない。

表題のkamal secretsが使えないのは残念だが、デプロイがより簡単になったので開発が捗ると思う。

追記:

[bw get item returns 'not found' #95](https://github.com/bitwarden/cli/issues/95)

どうやらbwクライアントは必要に応じてbw syncというコマンドを実行する必要があるらしい。