尝试从容器引擎 pod 将数据插入 BigQuery 失败

Trying to insert data into BigQuery fails from container engine pod

我有一个简单的 node.js 应用程序试图将一些数据插入 BigQuery。它使用提供的 gcloud node.js 库。

BigQuery客户端是这样创建的,根据documentation:

google.auth.getApplicationDefault(function(err, authClient) {
  if (err) {
    return cb(err);
  }
  let bq = BigQuery({
    auth: authClient,
    projectId: "my-project"
  });
  let dataset = bq.dataset("my-dataset");
  let table = dataset.table("my-table");
});

然后我尝试将数据插入 BiqQuery。

table.insert(someRows).then(...)

这失败了,因为 BigQuery 客户端 returns 一个 403 告诉我身份验证缺少所需的范围。文档告诉我使用以下代码段:

if (authClient.createScopedRequired &&
    authClient.createScopedRequired()) {
  authClient = authClient.createScoped([
     "https://www.googleapis.com/auth/bigquery",
     "https://www.googleapis.com/auth/bigquery.insertdata",
     "https://www.googleapis.com/auth/cloud-platform"
  ]);
}

这也没有用,因为 if 语句永远不会执行。我每次都跳过 if 并设置范围,但错误仍然存​​在。

我在这里错过了什么?为什么无论 authClient 配置如何,范围总是错误的?有没有人找到一种方法来让这个或类似的 gcloud 客户端库(如数据存储)在容器引擎 pod 上使用所描述的身份验证方案?

目前我发现的唯一可行的解​​决方案是创建一个 json 密钥文件并将其提供给 BigQuery 客户端,但我宁愿即时创建凭据,然后将它们放在代码旁边。

旁注:在 Compute Engine VM 上 运行 时,节点服务无需向 BigQuery 提供身份验证选项即可完美运行,因为身份验证由 Google 自动协商。

将 JSON-Keyfiles 烘焙到图像(容器)中是个坏主意(安全明智 [如您所说])。

您应该能够在 Kubernetes 集群创建期间将这些范围添加到它(之后无法调整)。

看看这个doc“--scopes”