0

我正在尝试使用 Google Drive API 从 GDrive 文件夹中读取文件作为 Cloud Dataflow 管道(包装在 Spotify Scio Scala SDK 中)的输入。

当我在本地运行管道时(使用 DirectRunner),在将GOOGLE_APPLICATION_CREDENTIALSenv var 设置为与我共享目标 GDrive 文件夹的服务帐户文件后,它可以很好地读取 GDrive 文件。但是,当我尝试使用以下命令在云中运行时:

export GOOGLE_APPLICATION_CREDENTIALS=~/gcp_keys/my_service_account.json
gcloud auth activate-service-account --key-file $GOOGLE_APPLICATION_CREDENTIALS

sbt "run --project=<my_project_id> --runner=DataflowRunner --region=us-central1 --tempLocation=gs://... --serviceAccount=<my_service_account_email>"

我一次又一次地看到以下权限错误(我的管道没有失败,我必须手动取消它,因为没有任何进展):

ERROR org.apache.beam.runners.dataflow.util.MonitoringUtil$LoggingHandler - 2021-03-06T23:56:51.218Z: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
GET https://www.googleapis.com/drive/v3/files?fields=files(name,id,size,modifiedTime)&q='1GnXMd1GqYg7EYOqc_5mzNQrBAXiz6RDT'%20IN%20parents%20AND%20trashed%20%3D%20false
{
  "code": 403,
  "errors": [
    {
      "domain": "global",
      "message": "Insufficient Permission: Request had insufficient authentication scopes.",
      "reason": "insufficientPermissions"
    }
  ],
  "message": "Insufficient Permission: Request had insufficient authentication scopes."
}
        com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
        com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:118)
        com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:37)
        com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:428)
        com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1108)
        com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:514)
        com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:455)
        com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:565)
        com.dowjones.sayari.sanctions.ScioGDrive$$anon$3.apply(ScioGDrive.scala:107)
        com.dowjones.sayari.sanctions.ScioGDrive$$anon$3.apply(ScioGDrive.scala:95)
        org.apache.beam.sdk.transforms.Watch$WatchGrowthFn.process(Watch.java:854)

我已验证我与用于运行管道的服务帐户共享目标文件夹及其父文件夹(以及计算引擎默认 SA,数据流工作人员根据默认情况使用docs),具有编辑权限。

这是导致抛出异常的代码(特别是该setFields行):

        val drive = googleDriveClient
        val files = drive
          .files()
          .list()
          .setQ(
            s"'$folderId' IN parents AND trashed = false"
          )
          .setFields("files(name,id,size,modifiedTime)")
          .execute()

https://www.googleapis.com/auth/driveDrive 客户端是使用具有范围的应用程序默认凭据设置的。

我正在考虑设置一个云功能来将 GDrive 中的数据通过管道传输到 PubSub 主题中,但我想我会先在这里问一下,在从云数据流管道。

4

0 回答 0