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

Posted

技术标签:

【中文标题】尝试从容器引擎 pod 将数据插入 BigQuery 失败【英文标题】:Trying to insert data into BigQuery fails from container engine pod 【发布时间】:2017-04-21 07:25:06 【问题描述】:

我有一个简单的 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 客户端返回 403 告诉我身份验证缺少所需的范围。文档告诉我使用以下 sn-p:

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 客户端库(如 Datastore)在 Container Engine pod 上使用所描述的身份验证方案?

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

旁注:在 Compute Engine VM 上运行时,节点服务在不向 BigQuery 提供身份验证选项的情况下完美运行,因为身份验证是由 Google 自动协商的。

【问题讨论】:

【参考方案1】:

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

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

看看这个doc“--scopes”

【讨论】:

啊,我没有建集群。看起来这就是解决方案。谢谢,伙计!

以上是关于尝试从容器引擎 pod 将数据插入 BigQuery 失败的主要内容,如果未能解决你的问题,请参考以下文章

POD崩溃时持久卷声明中的容器数据

容器引擎版kubectl 查看日志

Pod容器共享、ConfigMap及在容器内获取Pod信息

容器引擎上的服务访问

批量插入在 docker 容器中运行的 Postgres 数据库挂起

podman.命令集锦