如何从 Cloud 运行 连接到 Google Cloud Datastore?

How can you connect to Google Cloud Datastore from Cloud Run?

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

问题是它没有在文档中解释:Accessing your Database如何在 GCP 中而不是从 GCE 或 AppEngine 访问数据存储。有没有 fancy/seamless 方法可以实现此目的,还是我应该像提供外部平台一样提供服务帐户凭据?

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

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

Using per-service identity

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

Fetching identity and access tokens

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

从部署到云的 Flask 应用程序连接到云数据存储 运行...

  1. 确保您已在具有有效结算帐户的项目中启用这两项服务。
  2. 确保您的 requirements.txt 文件中至少有 Flask 和 Datastore 包(w/any 所需的版本控制):
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) 构建你的容器 for 你这样你就不用担心这些额外的事情了。
FROM python:3-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
  1. 想出一个 app/service 名称 SVC_NAME,然后使用 gcloud beta run deploy SVC_NAME --source . --platform managed --allow-unauthenticated 构建和部署您的原型容器。 (想想 docker build 后跟 docker push 然后 docker run,全部来自 1 个命令!)如果你有 Dockerfile,Buildpacks 将使用它,但如果不使用它,它会自省您的代码和依赖项,以尽可能构建最高效的容器。

就是这样。你们中的一些人会被 service accounts and making a public/private key-pair, both of which are fine. However to keep things simple, especially during prototyping, just use the default service account you get for free on Cloud Run 分散注意力。上面的代码片段在没有任何服务帐户或 IAM 代码的情况下工作。

顺便说一句,上面是 原型 让你继续。如果要部署到生产环境,则不会使用 Flask 开发服务器。您可能会将 gunicorn 添加到 requirements.txtDockerfile,并且您可能会创建一个唯一的服务帐户密钥 w/specific IAM 权限,也许会添加其他要求,例如 IAP, VPC,and/or 一个负载均衡器。