Cloud Functionsで環境変数にトークンなんかを置いてはだめって知ったのでSecret Managerを使ってみることにした。
Secretの作成
コマンド例
echo -n "my super secret data" | gcloud secrets create my-secret \ --replication-policy="automatic" \ --data-file=-
解説
echo
コマンドの-n
オプションは改行を含まない--replication-policy
はautomatic
とuser-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 のシークレット アクセサー」のロールを付与する