【问题标题】:How can you connect to Google Cloud Datastore from Cloud Run?如何从 Cloud Run 连接到 Google Cloud Datastore?
【发布时间】:2020-02-23 23:38:51
【问题描述】:

我愿意在 Google-Cloud-Run 中部署一项服务。这将是一个 (python) Flask 应用程序,它将连接到数据存储区(数据存储模式下的 firestore)以写入或读取一个小 blob。

问题在于文档中没有解释:Accessing your Database 如何在 GCP 中访问数据存储区,而不是从 GCE 或 AppEngine。是否有一种奇特/无缝的方式来实现这一点,还是我应该像提供外部平台一样提供服务帐户凭据?

提前感谢您的帮助和回答。

【问题讨论】:

  • 您从哪里调用 Datastore DB API?在您的帖子中,我不清楚是 Cloud Run、GCE 还是 AppEngine。
  • 数据存储区 API 调用将在 Google Cloud Run 中运行的服务中进行。

标签: python-3.x google-cloud-firestore google-cloud-datastore google-client google-cloud-run


【解决方案1】:

当您的 Cloud Run 逻辑执行时,它会以 GCP 服务帐号的身份执行。您可以在配置时配置它运行的服务帐户。您可以创建和配置具有正确角色的服务帐户,以允许/提供对数据存储的访问权限。这意味着当您的 Cloud Run 逻辑执行时,它将具有执行所需操作的正确权限。这个故事记录在这里:

Using per-service identity

如果由于某种原因您觉得这还不够,另一种方法是将访问所需的令牌保存在计算元数据中,然后在您的云运行逻辑中显式地动态检索这些令牌。此处对此进行了描述:

Fetching identity and access tokens

希望这涵盖了您正在寻找的基础知识。如果在阅读这些领域后出现新问题,请随时提出更具体、更详细的新问题,我们会跟进。

【讨论】:

  • 感谢您的回答 Kolban,我早就料到了。我将继续尝试使用服务帐户管理和配置解决方案。
【解决方案2】:

从部署到 Cloud Run 的 Flask 应用连接到 Cloud Datastore...

  1. 确保您已在具有有效结算帐户的项目中启用这两种服务。
  2. 确保您的 requirements.txt 文件中至少包含 Flask 和 Datastore 包(带有任何所需的版本):
flask
google-cloud-datastore
  1. 将 Datastore 使用集成到您的应用中...这是我的演示 main.py 中的一些示例使用(为简单起见,删除了 Flask 代码):
from google.cloud import datastore

ds_client = datastore.Client()
KEY_TYPE = 'Record'

def insert(**data):
    entity = datastore.Entity(key=ds_client.key(KEY_TYPE))
    entity.update(**data)  ## where data = dict/JSON of key-value pairs
    ds_client.put(entity)

def query(limit):
    return ds_client.query(kind=KEY_TYPE).fetch(limit=limit)
  1. 您可以拥有一个Dockerfile(下面是最小的一个),但更好的是,跳过它,让 Google (Cloud Buildpacks) 为您构建您的容器,这样您就没有多余的东西了像这样担心。
FROM python:3-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
  1. 想出一个应用程序/服务名称SVC_NAME,然后使用gcloud beta run deploy SVC_NAME --source . --platform managed --allow-unauthenticated 构建和部署您的原型容器。 (想想docker build,然后是docker push然后 docker run,全部来自 1 个命令!)如果你有一个 Dockerfile,Buildpacks 将使用它,但如果没有,它会内省您的代码和依赖项,以构建最高效的容器。

就是这样。你们中的一些人会被service accounts 分散注意力并制作public/private key-pair,两者都很好。然而,为了简单起见,尤其是在原型设计期间,只需使用default service account you get for free on Cloud Run。上面的 sn-p 在没有任何服务帐户或 IAM 代码的情况下工作。

顺便说一句,以上是 prototype 让您继续前进。如果您要部署到生产环境,则不会使用 Flask 开发服务器。您可能会将gunicorn 添加到您的requirements.txtDockerfile,并且您可能会创建一个具有特定IAM 权限的唯一服务帐户密钥,可能还会添加其他要求,例如IAP、VPC 和/或负载-平衡器。

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2019-09-05
    • 2021-12-07
    • 2017-09-09
    相关资源
    最近更新 更多