Как получить Google App Engine, используя правильные учетные данные для Vision API?
Контекст:
У меня есть приложение Python Flask, работающее локально, которое использует API Google Vision для обнаружения этикеток на фотографиях.
Чтобы использовать Google Vision API, я использую GOOGLE_APPLICATION_CREDENTIALS
переменная окружающей среды. у меня есть"google-secret.json"
ключ, хранящийся локально, который я использую для установки GOOGLE_APPLICATION_CREDENTIALS
переменную со следующими двумя строками:
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "google-secret.json"
Вышеупомянутое позволяет мне успешно запустить эту строку локально:
image_label_client = vision.ImageAnnotatorClient()
Я использую Google Cloud Build для автоматического развертывания этого приложения в стандартной среде Google App Engine. я имею*google-secret.json
включен в мой .gitignore
файл, чтобы мой ключ не стал общедоступным, и у меня есть исходный код Google Cloud Build из моего удаленного репозитория GitHub.
Я новичок в создании автоматических конвейеров сборки / развертывания и пытаюсь понять, как заставить мое приложение Google App Engine либо автоматически устанавливать GOOGLE_APPLICATION_CREDENTIALS
переменную среды при сборке или получить доступ к соответствующим учетным данным другим способом, чтобы успешно создать vision.ImageAnnotatorClient()
.
Я открыт для любого метода, который работает. Я искал в Интернете несколько дней, но не смог решить эту проблему.
Путь решения, который я сейчас ищу: API Google Secret Manager.
Я могу использовать API Google Secret Manager локально, чтобы получить доступ к секретной версии, которая имеет ключ json, необходимый моему приложению для использования API Google Vision. Но у меня две проблемы:
- Мне нужно использовать секретный файл.json в качестве ключа для получения разрешения на доступ к секрету через API Google Secret Manager, так что это снова вызывает ту же проблему, которую я изначально пытался решить: выяснение того, как автоматически настраивать и получать доступ к json в приложении Google Cloud Build / Google App Engine.
- Когда я получаю секрет через API Google Secret Manager, я не знаю, как превратить его в учетные данные для
vision.ImageAnnotatorClient()
.
Для проблемы № 2: Обычно я бы не использовал явный аргумент учетных данных для vision.ImageAnnotatorClient()
. Вместо этого потребуется учетные данные из этой предыдущей строки:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "google_secret.json"
Если я попытаюсь превратить полезную нагрузку Google Secret API в файл.json, я сделаю это так:
payload = response.payload.data.decode('UTF-8')
payload_json = json.dumps(payload)
google_api_secret = payload_json
затем запишите его в файл:
with open("google_secret.json", "w") as write_file:
json.dump(google_api_secret, write_file)
Но при запуске появляется следующая ошибка
image_label_client = vision.ImageAnnotatorClient()
AttributeError: 'str' object has no attribute 'get'
Любая помощь, которую вы могли бы оказать, будет очень признательна!
2 ответа
App Engine будет использовать стратегию учетных данных по умолчанию (ADC), которая ищет учетные данные в следующем порядке:
GOOGLE_APPLICATION_CREDENTIALS
переменная окружения- Учетная запись службы по умолчанию, предоставляемая App Engine.
- В противном случае выдается ошибка
В документации GCP App Engine приведен пример использования API облачного хранилища в стандартной среде здесь: https://cloud.google.com/docs/authentication/production.
Мне нужно использовать секретный файл.json в качестве ключа для получения разрешения на доступ к секрету через API Google Secret Manager, так что это вновь вызывает ту же проблему, которую я изначально пытался решить: выяснение того, как автоматически настраивать и получать доступ к json в приложении Google Cloud Build / Google App Engine.
Вы можете использовать учетную запись службы App Engine по умолчанию (YOUR_PROJECT_ID@appspot.gserviceaccount.com
) для доступа к Vision API. Учетная запись службы по умолчанию имеетEditor
роль, которая включает в себя все необходимые разрешения, вам не требуется доступ к другой учетной записи службы из Google Secret Manager.
import googleapiclient.discovery
vision_client = googleapiclient.discovery.build(
'vision', 'v1')
vision_client.files().annotate(body={}).execute()