とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

Secret Managerの使い方

Cloud Functionsで環境変数トークンなんかを置いてはだめって知ったのでSecret Managerを使ってみることにした。

Secretの作成

コマンド例

echo -n "my super secret data" | gcloud secrets create my-secret \
    --replication-policy="automatic" \
    --data-file=-

解説

  • echoコマンドの-n オプションは改行を含まない
  • --replication-policyautomaticuser-managedがある
    • user-managedを指定した場合は--locationsの設定が必用
  • --data-file=--は標準出力の結果をファイルとするもの

Secret一覧の取得

gcloud secrets list

Secretの読み取り

コマンド例

gcloud secrets versions access latest --secret="my-secret"

解説

  • gcloud secrets versions accessコマンドでSecretへアクセス
  • versionの指定が必用(ここではlatestで最新版を取得)
    • バージョン番号(1~)を指定することで任意のバージョンのSecretを取得可能
  • --secret で鍵の名前の指定が必用

プログラム(Python)からの読み取り

requirements.txt

google-cloud-secret-manager

sample.py

def add_secret_version(project_id, secret_id, payload):
    """
    Add a new secret version to the given secret with the provided payload.
    """

    # Import the Secret Manager client library.
    from google.cloud import secretmanager

    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent secret.
    parent = client.secret_path(project_id, secret_id)

    # Convert the string payload into a bytes. This step can be omitted if you
    # pass in bytes instead of a str for the payload argument.
    payload = payload.encode('UTF-8')

    # Add the secret version.
    response = client.add_secret_version(parent, {'data': payload})

    # Print the new secret version name.
    print('Added secret version: {}'.format(response.name))

その他

Secretにアクセスすると403が返ってくる

次のいずれか

  • Secretの名前、バージョンのいずれかが間違えている(存在しないSecretへのアクセス)
  • アクセスする権限がない
    • Secretに対してアクセスするService Accountへ「Secret Manager のシークレット アクセサー」のロールを付与する

参考