FireBase sendMessage 函数更新到 v1 Google Cloud Endpoint

FireBase sendMessage Function update to v1 Google Cloud Endpoint

所以...今天早上...我收到一封电子邮件说:

Our records show that you own projects with App Engine applications or Cloud Functions that are still calling the pre-GA v0.1 and v1beta1 endpoints of the App Engine and Cloud Functions metadata server.

We’re writing to let you know that these legacy endpoints are scheduled to be turned down on April 30, 2020. After April 30, 2020, requests to the v0.1 and v1beta1 endpoints will no longer be supported, and may return HTTP 404 NOT FOUND responses.

我只使用 Firebase Functions 发送消息...然后电子邮件将我的 sendMessage 函数确定为罪魁祸首。但我不能……终其一生……弄清楚我需要在哪里更新端点。我的sendMessage函数如下:

exports.sendMessage = functions.database.ref('/messages/{receiverUid}/{senderUid}/{msgId}')
    .onWrite(async (change, context) => {
      const message = change.after.val().body;
      const receiverUid = change.after.val().receiverUid;
      const senderUid = change.after.val().senderUid;
      const msgId = change.after.val().msgId;
      if (!change.after.val()) {
        return console.log('Sender ', senderUid, 'receiver ', receiverUid, 'message ', message);
      }
      console.log('We have a new message: ', message, 'for: ', receiverUid);

我尝试遵循此 link 中的一些 Curl 建议:https://cloud.google.com/compute/docs/migrating-to-v1-metadata-server

...但每次我尝试其中之一时,我都会得到:

curl: (6) Couldn't resolve host 'metadata.google.internal'

所以...在这一点上...我不知道我应该更改什么或我应该看哪里。任何帮助将不胜感激。

我在 https://github.com/firebase/firebase-functions repo 最新版本 (3.3.0) 中搜索,我找到了文件:spec/fixtures/https.ts。在这个文件中有一些模拟函数,它们使用旧的:/computeMetadata/v1beta1 端点。

这可能意味着 firebase-functions 模块包应该更新为使用 /computeMetadata/v1 端点。

我发现 package.json 中的旧依赖项正在拖入其他非常旧的包:

"@google-cloud/functions-emulator": "^1.0.0-beta.6",

特别是它引入了 gcs-resumable-upload v 0.10.2,低于 google 推荐的 v 0.13.0(参见 https://cloud.google.com/compute/docs/migrating-to-v1-metadata-server#apps-to-update)。可能还有其他人。

解决方法是:

  • 删除@google-cloud/functions-emulator,或
  • 切换到现代替代品,@google-cloud/functions-framework

我遇到了同样的问题,并且没有看到我使用的任何库列出 here

就我而言,罪魁祸首是 firebase-admin。我使用的是 7.3.0 版本,我发现了这个 gem:

$ grep -rni "computeMetadata/" *
firebase-admin/lib/auth/credential.js:30:var GOOGLE_METADATA_SERVICE_PATH = '/computeMetadata/v1beta1/instance/service-accounts/default/token';

因此,我更新了我的 Cloud Functions 库,如图所示 here:

npm install firebase-functions@latest --save
npm install firebase-admin@latest --save-exact

然后,瞧!

$ grep -rni "computeMetadata/" *
node_modules/firebase-admin/lib/auth/credential.js:30:var GOOGLE_METADATA_SERVICE_PATH = '/computeMetadata/v1/instance/service-accounts/default/token';

然后我重新部署,问题解决了。