Как получить 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. Но у меня две проблемы:

  1. Мне нужно использовать секретный файл.json в качестве ключа для получения разрешения на доступ к секрету через API Google Secret Manager, так что это снова вызывает ту же проблему, которую я изначально пытался решить: выяснение того, как автоматически настраивать и получать доступ к json в приложении Google Cloud Build / Google App Engine.
  2. Когда я получаю секрет через 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), которая ищет учетные данные в следующем порядке:

  1. GOOGLE_APPLICATION_CREDENTIALS переменная окружения
  2. Учетная запись службы по умолчанию, предоставляемая App Engine.
  3. В противном случае выдается ошибка

В документации 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()

Другие вопросы по тегам