🔑

GCPのサービスアカウントのKeyfile.jsonを環境変数で管理する

2022/08/01に公開

サービスアカウントのkey fileはjsonファイルでダウンロードできる。
しかし、Keyfile.jsonをそのままリポジトリに配置するのは、セキュリティ的にあまり良くない。

そこで良い方法が無いかと調べていたところ、下記のdiscusstionにKeyfile.jsonをbase64でエンコードして環境変数で管理するという良さげな解決方法があったので紹介する。

https://github.com/vercel/community/discussions/219#discussioncomment-128702

まずKeyfile.jsonの中身をbase64でエンコードしたものを環境変数に設定する。

.env.local
# Keyfile.jsonの中身をbase64でエンコードしたもの
GOOGLE_SERVICE_KEY=eyJ0eXBlIjoic2VydmljZV9hY...........

上記の環境変数をデコードして使うのだが、上記のdiscussionの例のままではprivate_keyに改行が含まれており、JSON.parseでエラーが発生してしまうので下記のように書き換えた。

const decodeAndParseKey = (key: string) => {
  // デコード
  const decoded = Buffer.from(key, "base64").toString();
  // 改行を置換してからJSON.parse
  const credentials: Credentials = JSON.parse(decoded.replace(/\n/g, "\\n"));
  // 置換を戻したものを返す
  return {
    ...credentials,
    private_key: credentials.private_key.replace(/\\n/, "\n"),
  };
};

const credentials = decodeAndParseKey(process.env.GOOGLE_SERVICE_KEY);

// このように取り出して使える
const { client_email, private_key } = credentials;
const jwt = new google.auth.JWT(
  client_email,
  undefined,
  private_key,
  scopes
);

上記の方法よりも良い管理があるよ!という方いたらコメントで教えて欲しいです〜!

Discussion