我们有一个基于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)创建一个新项目。在此项目中,以数据存储方式数据库创建Cloud Firestore。
2)使用托管导出服务,将应用程序的某些数据导出到Cloud Storage。
3)使用托管导入服务,将应用程序的数据导入到新项目中。
4)将要测试的应用逻辑复制到新项目或针对新项目模拟应用行为。
这就是我们所做的,在出现一些问题之后,我们可以使应用程序的一部分与新的数据存储一起在单独的测试项目中正常运行。
现在是实际问题...
我们想测试更新的应用程序是否也可以与被取代的Cloud Datastore一起运行,因此我们不必担心何时进行自动升级(因为我们的应用程序已经准备就绪)。 因此,我们将其部署为现有AppEngine项目(v2-dot -.....)的新版本:不幸的是,一旦应用尝试读取数据存储,运行新版本就会引发权限错误:
com.google.cloud.datastore.DatastoreException: Missing or insufficient permissions
所以问题是: -这可能与我们的项目尚未将Cloud Datastore升级到Data Store模式下的Cloud Firestore有关吗? -有什么我们可以做的(也许添加特定的权限)以使其正常工作吗?
我们担心的是,我们需要在2020年7月之前部署新版本的应用程序(届时旧的AppEngine SDK将停止工作),并且我们担心数据存储区的自动升级将在以后发生。
谢谢您的帮助。
答案 0 :(得分:1)
原来我们的项目在IAM中没有 PROJECT_ID@appspot.gserviceaccount.com 成员。
它具有大量其他成员(例如: PROJECT_NUMBER-compute@developer.gserviceaccount.com , PROJECT_NUMBER@cloudservices.gserviceaccount.com , service -PROJECT_NUMBER@compute-system.iam.gserviceaccount.com 等),我猜这是以前版本的Google App Engine中使用的旧成员。
添加具有 Editor 角色的 PROJECT_ID@appspot.gserviceaccount.com 可以解决此问题:现在可以将新版本部署到旧项目中,即使该数据存储区尚未以数据存储区模式转换为Cloud Firestore。
答案 1 :(得分:0)
我刚刚遇到了这个问题,并花了太多时间对其进行故障排除。如果您遇到此问题,十分之九是因为默认 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"