1password/connect のインストールをhelm install以外で行う場合、1password-credentials.jsonを予めencodeする必要がある
TL; DR
kustomization.
helm chartで提供されている1password/connect をkustomizeでインストールする場合、以下のようなkustomization.yaml となる。
code:kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: onepassword
resources:
- namespace.yaml
helmCharts:
- name: connect
releaseName: connect
namespace: 1password
version: 1.10.0
includeCRDs: true
valuesInline:
operator:
autoRestart: true
create: true
generatorOptions:
disableNameSuffixHash: true
secretGenerator:
- name: op-credentials
files:
- 1password-credentials.json=secrets/1password-credentials.json
- name: onepassword-token
files:
- token=secrets/token
この時、secret/op-credentials のdata.1password-credentials.json に含まれるsecretの値は、 1password-credentials.json のjson文字列をbase64encodeした結果を含めなければならない。
何が起きたのか
helm installコマンドでは正常にインストールができるのに、同じcredential fileを用いてkustomize経由でインストールした時だけ1password/connectが正常に動作しなかった。
その時のエラーがこれ
code:error.log
onepassword-connect-59d567b-lsrgk connect-sync {"log_message":"(E) Server: (unable to get credentials and initialize API, retrying in 30s), Wrapped: (failed to FindCredentialsUniqueKey), Wrapped: (failed to loadCredentialsFile), Wrapped: (LoadLocalAuthV2 failed to credentialsDataFromBase64), illegal base64 data at input byte 0","timestamp":"2023-03-05T18:48:27.147061743Z","level":1}
onepassword-connectのconnect-sync containerはbase64 encodeされたjson文字列を受け取ろうとしていることがわかる。
helm installではなぜ成功したのか
helm install時に、 --set-file="secret/1password-credentials.json" で文字列を渡す場合、helm chart内のsecretは stringData.1password-credentials.json に、base64encodeした状態で設定されている。
つまり、以下2つは同義である。
secret.data.1password-credentials.json -> base64decode -> base64decode = json
secret.stringData.1password-credentials.json -> base64decode = json
1password-credentials.json というkeyでありながら、中身はbase64encodeされたjson文字列であったわけだ。
kustomizeでのインストールではなぜ失敗したのか
code:fail-kustomization.yaml
secretGenerator:
- name: op-credentials
files:
- 1password-credentials.json=secrets/1password-credentials.json
secretGeneratorは、渡されたファイルを secret.data.<key> にbase64 encodeして保存する。
これは、data.<key> への保管がbase64必須であり、格納のためのbase64encodeである。
したがって、secret.data.1password-credentials.json をdecodeしたとたんにjson文字列がでてくるわけである。本来はbase64encodeされたjson文字列を期待値としているわけなので、credentialの読み込みに失敗する。
よくよくchartsのdeploymentの中身を見に行くと、環境変数としてセットしていることがわかった。 実装としてbase64encodeされた文字列を入力することは疑問にはならないけど、かといって予め 1password-credentals.json をencodeしないと行けないのはどうなのか。
ref先にもかいてるけど、これは仕様としてどうなのか・・・?