Kubernetes Secret に登録した情報を Base64 デコードして表示する

Kubernetes の Secret に登録した情報は、Base64 エンコードされた状態で保持される。そのため、kubectl get secret で情報を表示させても、Base64 文字列しか見えず、内容が確認しづらい。

勿論、登録された値を base64 --decode コマンドに流してやれば見えるものの、--from-env-file で一括登録したような環境変数たちを見る時は大変だ。

# 環境変数ファイルを登録した場合
$ kubectl create secret generic my-env-file-secret --from-env-file=./.env

そこで、JSON パーサの jq を組み合わせて、登録されている Secret を Base64 デコードして表示してみる。

まずは生の Secret の状態を確認。

$ kubectl get secret my-env-file-secret -o json

{
  "apiVersion": "v1",
  "data": {
    "MY_ENV": "Hzzzzz=",
    "MY_API_KEY": "Lyyyyy=",
    "MY_TOKEN": "Rxxxxx="
  },
  "kind": "Secret",
  "type": "Opaque"
}

こんな風に、data プロパティ配下に3つの環境変数が見えるが、値はいずれも Base64 エンコードされている。

そこで、この出力結果をパイプで jq に渡して、以下のように処理する。

$ kubectl get secret my-env-file-secret -o json | jq -r '.data | to_entries | map( .key + "=" + (.value|@base64d) )[]'

MY_ENV=HelloWorld
MY_API_KEY=KeyHogeHoge
MY_TOKEN=TokenTokenToken

すると、こんな感じで表示される。

data プロパティに絞り込んだら、to_entries というパイプを使い、通常の連想配列を以下のような配列に変換する。

[
  {
    "key": "MY_ENV",
    "value": "Hzzzzz="
  },
  // 以下略…
]

そしたら map() にパイプして、.key.value を連結させてやる。そして、.value の方は Base64 エンコードされた文字列なので、jq が持つ @base64d というパイプを適用してデコードする。

ココまでやると、

[
  "MY_ENV=HelloWorld",
  "MY_API_KEY=KeyHogeHoge",
  // 以下略
]

といった出力形式になるので、末尾に [] を付与して配列内にフィルタして出力する、というワケ。

コレでよきよき。