1

语境:

我有一个本地工作的 Python Flask 应用程序,它使用 Google Vision API 来检测照片中的标签。

为了使用 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文件中,因此我的密钥不会公开,并且我有来自远程 GitHub 存储库的 Google Cloud Build 源。

我是创建自动构建/部署管道的新手,我正在尝试了解如何让我的 Google App Engine 应用程序GOOGLE_APPLICATION_CREDENTIALS在构建时自动设置环境变量,或者以其他方式访问相关凭据,以成功创建vision.ImageAnnotatorClient().

我对任何可行的方法持开放态度。我已经在互联网上搜索了几天,但无法解决这个问题。

我目前追求的解决路径:Google Secret Manager API。

我可以在本地使用 Google Secret Manager API 访问具有我的应用程序使用 Google Vision API 所需的 json 密钥的秘密版本。但我面临两个问题:

  1. 我需要使用 .json 机密文件作为密钥来获得通过 Google Secret Manager API 访问机密的权限,所以这重新提出了我最初试图解决的相同问题:弄清楚如何自动设置和访问Google Cloud Build / Google App Engine 应用程序上的 json 密钥。
  2. 当我通过 Google Secret Manager API 检索密钥时,我不知道如何将其转换为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'

您能提供的任何帮助将不胜感激!

4

2 回答 2

1

App Engine 将使用应用程序默认凭据 (ADC)策略,该策略按以下顺序查找凭据:

  1. GOOGLE_APPLICATION_CREDENTIALS环境变量
  2. App Engine 提供的默认服务帐号
  3. 否则会抛出错误

GCP 的 App Engine 文档在此处提供了在标准环境中使用 Cloud Storage API 的示例:https ://cloud.google.com/docs/authentication/production#obtaining_credentials_on_app_engine_standard_environment

于 2020-03-22T20:17:12.260 回答
0

我需要使用 .json 机密文件作为密钥来获得通过 Google Secret Manager API 访问机密的权限,所以这重新提出了我最初试图解决的相同问题:弄清楚如何自动设置和访问Google Cloud Build / Google App Engine 应用程序上的 json 密钥。

您可以使用默认 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()

于 2020-03-22T21:31:17.423 回答