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 のシークレット アクセサー」のロールを付与する