ハマった詳細
docker環境でGCPのSecretManagerの値を参照しようとすると下記エラーが発生し、権限不足でエラー
google.api_core.exceptions.PermissionDenied: 403 Permission 'secretmanager.versions.access' denied for resource 'projects/pj-love-shizuka/secrets/API_KEY/versions/1' (or it may not exist).
解消した方法
解消方法はシンプルですが、このエラーで1時間程溶かしたので同士はご注意ください。色々と調べていると下記のような情報にたどり着き、謎がどんどん深まっていきます。
上記の兄さん達と今回は微妙に条件が違う?ためか解消できずに「secretmanager」モジュールの関数やクラスの引数などの値の与え方が悪いかもと思い色々試しました..
実装しているコード
1. ローカルのzsrhcに追加した環境変数
export GOOGLE_APPLICATION_CREDENTIALS="/Users/bokudoraemon/dev/project_configs/gcp/{gcpサービスアカウントの鍵}.json"
2. docker-compose.ymlの設定
version: "3.7"
services:
web:
build:
context: ./
dockerfile: Dockerfile.local
env_file:
- ./.env
command: "uvicorn main:app --host 0.0.0.0 --port ${PORT} --reload"
environment:
GOOGLE_APPLICATION_CREDENTIALS: /code/gc.json
volumes:
- .:/code
- ${GOOGLE_APPLICATION_CREDENTIALS}:/code/gc.json:ro
ports:
- "${PORT}:${PORT}"
networks:
- default
3. pythonでSecretManagerの利用
from google.cloud import secretmanager
def get_secret_key(project_id, secret_ver, secret_name):
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')
project_id = "pj-love-shizuka"
secret_ver = "1"
API_KEY = get_secret_text(project_id, secret_ver, "API_KEY")
ついでに、
上記スクショの赤枠の部分について、pythonのコードで呼び出すときはGCPのproject-idを指定して呼び出すのにGCPのSecretManagerのコンソール画面では数値になっているのでここが悪いのか?という疑念が浮かびます。
結論としは数値になっていることはスルーでおkで、僕が記載しているpythonコードで参照可能となっています