当前位置: 首页 > 知识库问答 >
问题:

尝试通过数据流访问Google Cloud Datastore时出现403错误

冷越泽
2023-03-14

我有一个Google App Engine应用程序,其中数据存储在Google Cloud Datastore中。我想使用Dataflow将部分数据放入BigQuery,但我想我应该从从Datastore获取一些信息并将其写入Google Cloud Storage开始。我的代码如下所示:

public class DatastorePipeline {
    private static final Logger LOG = LoggerFactory.getLogger(DatastorePipeline.class);

static class GetEmailFn extends DoFn<Entity, String> {

    @Override
    public void processElement(ProcessContext c) throws Exception {
        Map<String, Value> properties = DatastoreHelper.getPropertyMap(c.element());
        Value value = properties.get("email_address");
        if(value != null) {
            c.output(DatastoreHelper.getString(value));
        }
    }
}

    public static void main(String[] args) {
        Pipeline p = Pipeline.create(PipelineOptionsFactory.fromArgs(args).withValidation().create());

        Query.Builder q = Query.newBuilder();
        q.addKindBuilder().setName("User");
        Query query = q.build();

        DatastoreIO.Source source = DatastoreIO.source()
        .withDataset("my-project-id")
        .withQuery(query);

        p.apply("ReadUsersFromDatastore", Read.from(source))
        .apply(ParDo.named("GetEmailAddress").of(new GetEmailFn()))
        .apply(TextIO.Write.to("gs://dataflow-output-bucket/emails.txt"));

        p.run();
    }
}

但是,当我尝试运行它时,我在进行Datastore查询时收到403个错误:

Request failed with code 403, will NOT retry: https://www.googleapis.com/datastore/v1beta2/datasets/my-project-id/runQuery

我使用Google Cloud Dataflow插件从Eclipse运行它。运行没有数据存储读取的数据流作业工作正常。我做了一个

gcloud auth login

在运行作业之前,如教程中所述。我做错了什么?

编辑:这是完整的堆栈跟踪。

2015年10月11日下午12:03:13(b6119cca307b4d9a):com.google.api。服务。数据存储。客户DatastoreException:未经授权。在com.google.api。服务。数据存储。客户RemoteRpc。com上的makeException(RemoteRpc.java:115)。谷歌。api。服务。数据存储。客户RemoteRpc。在com上调用(RemoteRpc.java:81)。谷歌。api。服务。数据存储。客户BaseDatastoreFactory$RemoteRpc。在com上调用(BaseDatastoreFactory.java:41)。谷歌。api。服务。数据存储。客户数据存储。com上的runQuery(Datastore.java:109)。谷歌。api。服务。数据存储。客户QuerySplitterImpl。com上的getScatterKeys(QuerySplitterImpl.java:189)。谷歌。api。服务。数据存储。客户QuerySplitterImpl。com上的getSplits(QuerySplitterImpl.java:75)。谷歌。云数据流。sdk。io。DatastoreIO$源。com上的getSplitQueries(DatastoreIO.java:427)。谷歌。云数据流。sdk。io。DatastoreIO$源。com上的splitintobules(DatastoreIO.java:306)。谷歌。云数据流。sdk。跑步者。数据流。BasicSerializableSourceFormat。performSplit(BasicSerializableSourceFormat.java:318)位于com.google.云数据流。sdk。跑步者。数据流。BasicSerializableSourceFormat。在com上执行资源操作(BasicSerializableSourceOperation.java:167)。谷歌。云数据流。sdk。跑步者。工人SourceOperationExecutor。在com上执行(SourceOperationExecutor.java:80)。谷歌。云数据流。sdk。跑步者。工人DataflowWorker。在com上执行工作(DataflowWorker.java:257)。谷歌。云数据流。sdk。跑步者。工人DataflowWorker。com上的doWork(DataflowWorker.java:193)。谷歌。云数据流。sdk。跑步者。工人DataflowWorker。com上的getAndPerformWork(DataflowWorker.java:146)。谷歌。云数据流。sdk。跑步者。工人DataflowWorkerHarness$WorkerThread。com上的doWork(DataflowWorkerHarness.java:164)。谷歌。云数据流。sdk。跑步者。工人DataflowWorkerHarness$WorkerThread。在com上调用(DataflowWorkerHarness.java:145)。谷歌。云数据流。sdk。跑步者。工人DataflowWorkerHarness$WorkerThread。在java上调用(DataflowWorkerHarness.java:132)。util。同时发生的未来任务。在java上运行(FutureTask.java:266)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)。util。同时发生的ThreadPoolExecutor$工作者。在java上运行(ThreadPoolExecutor.java:617)。lang.Thread。运行(Thread.java:745)由:com引起。谷歌。api。客户http。HttpResponseException:403禁止未经授权。在com.google.api。客户http。HttpRequest。在com上执行(HttpRequest.java:1061)。谷歌。api。服务。数据存储。客户RemoteRpc。调用(RemoteRpc.java:78)。。。19个以上

回答:原来问题是我的项目限制了基于我公司域的访问,这阻止了服务号的连接。谢谢丹帮助我解决这个问题!

共有1个答案

楮法
2023-03-14

看来没有正确配置数据存储的权限。

以下是两条通用建议:

  1. 查看Google云数据流安全和权限文档非常有用
  2. 运行作业时,数据存储是否在同一项目中创建

但是,在您的情况下,您遇到了以下错误:

关联的AppEngine项目是否锁定为特定域的所有用户?如果是,则当前Cloud Datastore测试版中存在问题,阻止数据流服务号(以@cloudservices.gserviceaccount.com结尾的电子邮件)访问数据。

如果您使用的是OAuth API,我们可以应用一种临时的解决方法,成本很低。解决方案将不再强制用户来自应用程序的域。如果这对您来说很重要,那么您可以在代码中执行域强制。(普通用户API不受影响。)

要请求我们应用临时解决方案,您可以通过电子邮件发送给我们-feedback@html" target="_blank">google.com引用此问题并包含数字项目ID。

 类似资料:
  • 我对php和mySQL是完全陌生的,并且正在尝试连接到远程数据库。这是我的代码:- $result=mysql_query(“Select*FROM Constants”); while($ROW=mysql_fetch_array($result)){echo$ROW['name']; echo“ ”;} mysql_close($con); 对这个问题有什么想法吗?马特·蒂亚

  • 我有一个应用程序,通过Dropbox Javascript SDK尝试下载文件。我不知道怎么了。通过fetch调用访问Dropbox API,直接导致相同的错误。Dropbox API文档指出,错误400是因为输入参数不正确,而我发送的似乎没有问题-“Dropbox API参数”:“{\”path\“:\”/1/price.xlsx \“}”

  • 我带着一个我无法解决的问题来到这里。 我在版本1.7中有一个prestashop,我已经移动到另一台服务器,值得一提的是,在旧服务器中,prestashop运行良好。 当我将prestashop迁移到新服务器时,除了我想进入后台,当我想进入后台时,只需将页面留空,其他一切都可以正常工作。 我已经激活了调试模式,但它没有给我任何与后台相关的错误,有趣的是,当调试模式被激活时,我可以毫无问题地进入后台

  • 我试图将python连接到mysql数据库,但它为。我使用的是 linux 操作系统。 这是我的代码: 这就是错误。 回溯(最近的最后一次调用):文件"/home/Sandytom/. loc/lib/python3.6/Site e-的包/mysql/连接器/connection_cext.py",第216行,在_open_connection中。_cmysql.connect(**cnx_kw

  • 问题内容: 我正在尝试使用Sharepoint 2013上的rest api创建一个简单的列表项。我的代码: 尝试发送数据时,出现403“禁止”错误。 我在此站点和列表上具有完整的管理员特权。 问题答案: 几天前找到了解决方案:我忘记将请求摘要表格添加到正文中。它应具有以下结构;

  • 我们正尝试通过以下http请求获取Office 365组元数据:https://graph.microsoft.com/v1.0/groups/?$select=description、displayName、groupTypes、mail、mailEnabled、mailNickname、onpremissieslastsyncdatetime、onpremissiessecurityident