"DatastoreException: Missing or insufficient permissions" 在被取代的 Cloud Datastore 上

"DatastoreException: Missing or insufficient permissions" on superseded Cloud Datastore

我们有一个基于 AppEngine SDK(现已弃用)和被取代的 Cloud Datastore 的旧应用程序。 在迁移到 Google Cloud SDK 的过程中,我们还决定从 JPA/Datanucleus 迁移到 Objectify。

鉴于 Cloud Datastore 将在未来某个时间自动升级到 Datastore 模式下的 Cloud Firestore,我们决定按照本页底部的描述测试我们的应用程序: https://cloud.google.com/datastore/docs/upgrade-to-firestore#testing_an_existing_application

1) Create a new project. In this project, create a Cloud Firestore in Datastore mode database.

2) Using the managed export service, export some of your application's data to Cloud Storage.

3) Using the managed import service, import your application's data to your new project.

4) Copy app logic you want to test to the new project or simulate app behaviour against the new project.

这就是我们所做的,在出现一些问题后,我们可以使应用程序的一部分 运行 在单独的测试项目中使用新数据存储正常运行。

现在进入实际问题...

我们想测试更新后的应用程序是否也可以 运行 使用被取代的 Cloud Datastore,这样我们就不必担心自动升级发生的时间(因为我们的应用程序已经准备就绪)。 因此我们将其部署为现有 AppEngine 项目的新版本 (v2-dot-.....):不幸的是 运行 一旦应用程序尝试读取数据存储,新版本就会抛出权限错误:

com.google.cloud.datastore.DatastoreException: Missing or insufficient permissions

所以问题是: - 这可能与我们项目的 Cloud Datastore 尚未升级到 Datastore 模式下的 Cloud Firestore 有关吗? - 有什么我们可以做的(也许添加特定权限)让它正常工作吗?

我们担心的是我们需要在 2020 年 7 月之前部署新版本的应用程序(届时旧的 AppEngine SDK 将停止工作),我们担心数据存储的自动升级会在稍后发生。

感谢您的帮助。

原来我们的项目在 IAM 中没有 PROJECT_ID@appspot.gserviceaccount.com 成员。

它还有很多其他成员(例如:PROJECT_NUMBER-compute@developer.gserviceaccount.comPROJECT_NUMBER@cloudservices.gserviceaccount.com, service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com, 等等)我猜是以前版本的 Google应用引擎。

添加 PROJECT_ID@appspot.gserviceaccount.com 角色 Editor 修复了问题:现在新版本可以部署到旧项目,即使数据存储尚未在数据存储模式下转换为 Cloud Firestore,它也能正常工作。

我刚刚 运行 解决了这个问题,花了太多时间来解决它。如果您 运行 遇到此问题,十分之九是因为默认的 App Engine 服务帐户没有编辑 Cloud Datastore 的权限。如果您正在做一个简单的 gcloud app deploy 而没有其他花哨的事情,则默认情况下会使用默认的 App Engine 服务帐户。我通过给默认的 App Engine 服务帐户 roles/datastore.owner 角色解决了这个问题:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:PROJECT_ID@appspot.gserviceaccount.com" \
    --role="roles/datastore.owner"