Для создания подписанного URL-адреса вам нужен закрытый ключ.
Когда вы используете сервисы GCP (здесь, в Compute Instances, узел вашего кластера K8S, но то же самое с Cloud RUn, Cloud Functions и другими сервисами GCP) и вы используете учетные данные по умолчанию (и там не определена переменная GOOGLE_APPLICATION_CREDENTIALS env), библиотека использует сервер метаданных .
Сервер метаданных позволяет вам сгенерировать токен доступа
curl -H "Metadata-Flavor: Google" \
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
или идентификационный токен (с аудиторией в параметре)
curl -H "Metadata-Flavor: Google" \
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.google.com
Таким образом, не имея на вашей стороне какого-либо секретного или закрытого ключа, библиотеки могут генерировать токен (доступ или идентификацию) для доступа к внешнему API.
Однако сервер метаданных не предоставляет секрет (закрытый ключ), и вы не можете использовать его для сгенерированных подписанных URL-адресов.
Здесь вам нужен файл ключа учетной записи службы
У вас есть несколько способов предоставить его модулю безопасным образом.
Я не рекомендую вам класть файл ключей своей сервисной учетной записи прямо в контейнер, это небезопасно
Другое решение
В конечном итоге вы можете сгенерировать на лету ключ и определить его как ключ учетной записи службы (его имя ключ пользовательской учетной записи службы ).
- Вы можете сгенерировать его при развертывании службы в кластере. Таким образом, вам не нужно хранить секрет, он генерируется каждый раз на лету.
- Вы можете сгенерировать ключ при запуске контейнера, установить его в учетной записи службы и сохранить в памяти.
Затем используйте его, когда он вам нужен в вашем коде, и он должен работать, потому что он связан с вашей учетной записью службы.
Однако вам также нужно подумать, как очистить старую и бесполезные ключи.