LoginSignup
6
4

More than 1 year has passed since last update.

GCPのSecret Managerで値を取得しようとしてハマった

Last updated at Posted at 2021-05-30

やりたかった事

Secret Manager に登録してある値を取得したい

公式ドキュメントを探す

公式に書いてある方法は、シークレットを追加してから取得する方法のみ
https://cloud.google.com/secret-manager/docs/reference/libraries

値の取得だけをしたいんじゃ

「GCP Secret Manager Python」等で検索をかけると、取得する方法を書いた記事が出てくる。
ありがたくコードを拝借する。

from google.cloud import secretmanager


def get_secret_text(project_id, secret_name, secret_ver):
    client = secretmanager.SecretManagerServiceClient()
    name = client.secret_version_path(project_id, secret_name, secret_ver)
    response = client.access_secret_version(name)
    return response.payload.data.decode("UTF-8")


if __name__ == "__main__":
    print(get_secret_text("project_id", "secret_id", "latest"))

動かない

Traceback (most recent call last):
  File "/Users/chun/programs/secret.py", line 13, in <module>
    print(get_secret_text("project_id", "secret_id", "latest"))
  File "/Users/chun/programs/secret.py", line 7, in get_secret_text
    response = client.access_secret_version(name)
  File "/Users/chun/programs/.venv/lib/python3.9/site-packages/google/cloud/secretmanager_v1/services/secret_manager_service/client.py", line 1136, in access_secret_version
    request = service.AccessSecretVersionRequest(request)
  File "/Users/chun/programs/.venv/lib/python3.9/site-packages/proto/message.py", line 486, in __init__
    raise TypeError(
TypeError: Invalid constructor input for AccessSecretVersionRequest: 'projects/project_id/secrets/secret_id/versions/latest'

google-cloud-secret-manager のドキュメントを見る

access_secret_version の引数がおかしいっぽいので、モジュールのドキュメントを探す

現在の最新(2.4.0)では、第一引数が AccessSecretVersionRequest というオブジェクトを引き受けるようになっている。

コレは何かよくわからない。

name を渡したいので、

client.access_secret_version(name=name)

とすると、うまく動いた。

バージョン 2.0.0 から、access_secret_version の引数が変更されたようだ。

最終的な動くコード

from google.cloud import secretmanager


def get_secret_text(project_id, secret_name, secret_ver):
    client = secretmanager.SecretManagerServiceClient()
    name = client.secret_version_path(project_id, secret_name, secret_ver)
    response = client.access_secret_version(name=name)
    return response.payload.data.decode("UTF-8")


if __name__ == "__main__":
    print(get_secret_text("project_id", "secret_id", "latest"))

最後に

Google の公式ドキュメントでは、作成したのちに作成したものを取得する内容しか書いてなかった。
非常に不便だと感じた。
google-cloud-secret-manager のドキュメントは非常に読みづらいし、Basic Usage とか書かれていなかったし、つらい。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4