くりにっき

フルスタックキュアエンジニアです

gcp-secretmanagerenvを作った

gcp-secretmanagerenvについて

GCPのSecret Managerのラッパみたいなやつで、 gcp-kmsenv のSecret Manager版です。

github.com

作った経緯

本番環境(GCP)ではSecret Managerを使うのでいいんだけど、ローカル開発時は環境変数を使いたかった *1 のですが、Secret Managerの値の取得と環境変数の取得を透過的に扱う部分をアプリケーションコード内に書きたくなくて先にライブラリ化しました。

使い方

READMEからの抜粋ですがこれがだいたい全てです。

package main

import (
    "context"
    "github.com/sue445/gcp-secretmanagerenv"
)

func main() {
    projectID := "gcp-project-id"
    c, err := secretmanagerenv.NewClient(context.Background(), projectID)
    if err != nil {
        panic(err)
    }

    // get from environment variable
    value, err := c.GetValueFromEnvOrSecretManager("SOME_KEY", true)
    // => return value from environment variable or Secret Manager

    // When key is not found in both environment variable and Secret Manager, returned empty string (not error)
    value, err := c.GetValueFromEnvOrSecretManager("INVALID_KEY", false)
    // => ""

    // When key is not found in both environment variable and Secret Manager, returned error
    value, err := c.GetValueFromEnvOrSecretManager("INVALID_KEY", true)
    // => error
}
  • GetValueFromEnvOrSecretManager の第1引数は検索するkey
    • 環境変数にkeyがあればその値を、SecretManagerにkeyがあればその値を返す
    • 探索順は環境変数 -> Secret Managerの順
  • projectIDが渡されなければSecretManagerの呼び出し自体を行わない
    • 本番環境のみ GCP_PROJECT のような環境変数を設定しておくような想定
  • GetValueFromEnvOrSecretManager の第2引数は必須とみなすかどうかのフラグ
    • true ならkeyが環境変数とSecret Managerの両方になかった場合にはエラーを返す
    • false ならkeyが環境変数とSecret Managerの両方になかった場合にはエラーを返さない(空文字を返す)

*1:OSSとして公開する可能性があるのでローカル開発時にサービスアカウント必須にしたくなかった