【问题标题】:How to programatically create a Cloud Run service from Node.js?如何以编程方式从 Node.js 创建 Cloud Run 服务?
【发布时间】:2020-07-11 05:27:35
【问题描述】:

我正在尝试使用 googleapis 客户端库从 firebase 函数创建新的 Cloud Run 服务。以下代码:

  const auth = new google.auth.GoogleAuth({
    projectId,
    scopes: ['https://www.googleapis.com/auth/cloud-platform']
  });
  const authClient = await auth.getClient();

  const result = await google.run({
    version: 'v1',
    auth: authClient
  }).namespaces.services.create({
    parent: `namespaces/${projectId}`,
    requestBody: {
      metadata: {
        name: 'asdf'
      },
      spec: {
        template: {
          spec: {
            containers: [
              {
                image: 'gcr.io/graph-4d1ec/graph@sha256:80c764961657d7e2fe548b3886c4662c55c9b5ac881aad5a74cce2d1f97895b8',
                env: [
                  { name: 'URL', value: url }
                ]
              }
            ]
          }
        },
        traffic: [{ percent: 100, latestRevision: true }]
      }
    }
  }, {})

产生错误:

Error: The request has errors
    at Gaxios._request (/srv/node_modules/gaxios/build/src/gaxios.js:85:23)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

没有提供有关此请求有什么问题的进一步信息。

我做错了什么?

【问题讨论】:

    标签: node.js google-api google-cloud-run


    【解决方案1】:

    最值得注意的是,您使用的 API 客户端库默认指向 run.googleapis.com

    但是,在使用namespaces.services.create 时,您需要一个区域api 端点,例如us-central1-run.googleapis.com。我对 Node.js 不熟悉,但您需要将 API 端点从默认值更改为此值。

    你太幸运了,我刚刚在 5 分钟前发表了一篇博文,解释了 gcloud run deploy 如何在幕后工作,详细介绍 API 调用、如何进行更新等。https://ahmet.im/blog/gcloud-run-deploy/ 它有示例 Go 代码链接在最后,你可以学习。请注意,“更新” Cloud Run 服务还有其他几个复杂的问题需要了解,因此请务必查看博文。

    此外,为了调试您遇到的问题,我假设(我再次对 Node.js 一无所知)您可能会在存储一些错误值或 http 响应代码或正文的 result 对象中找到更多信息。

    【讨论】:

    • 我尝试设置await google.run({..., rootUrl: 'us-central1-run.googleapis.com'}),从库的代码来看似乎是正确的参数,但现在我得到404 Not Found
    • 我认为您需要 https://,并且可能需要一个尾随 /。您能否在中间插入一个mitmproxy 并为您的应用设置 https_proxy 环境变量以从您的应用中捕获流量?那,结合我的博文可以帮你调试。由于您直接使用 API 调用,因此不能期望太多的宽恕,一切都必须准确无误。
    • 是的,抱歉忘记在我的评论中添加https://,但我实际上已经尝试过了。
    • 我也尝试复制gcloud --log-http run deploy ...的请求,还是同样的问题。
    • 您复制的请求中的错误信息是什么?正如我所说,我已经在 Go 中重新实现了它并公开了示例代码。我建议你学习它。
    猜你喜欢
    • 2021-09-14
    • 2023-02-10
    • 2020-01-26
    • 2012-09-29
    • 1970-01-01
    • 2021-07-07
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多