Firebase 云函数部署错误,错误代码为“NoSuchKey”

tub*_*tub 4 firebase google-cloud-functions

我正在尝试从 firebase CLI(版本 8.12.1)部署我的功能之一,但它一直失败。该功能在几周内没有改变,所以我对它现在失败的原因感到有些困惑。

来自 CLI 的错误

功能[http-api-(europe-west1)]:部署错误。构建失败:构建错误详细信息不可用。请查看https://console.cloud.google.com/logs/viewer?project= &advancedFilter=resource.type%3Dbuild%0Aresource.labels.build_id%3Dfeb2697d-29b4-4ab7-9b84-90d9f847be42%0AlogName%3Dprojects 上的日志%2Fvestico-dev%2Flogs%2Fcloudbuild

来自云控制台的日志

第 3 步 - “恢复器”:从缓存中恢复“google.nodejs.functions-framework:functions-framework”的数据

第 3 步 - “恢复器”:\u001b[31;1mERROR:\u001b[0m 无法恢复:恢复数据:获取 https://storage.googleapis.com/eu.artifacts..appspot.com/containers/images/sha256 :484d08dfc6a8f356c34a86fa4440fedf86f4fc398967eea66e4aab4e9ee81e3d?access_token=REDACTED:不支持的状态代码404;正文:NoSuchKey指定的密钥不存在。没有这样的对象:eu.artifacts..appspot.com/containers/images/sha256:484d08dfc6a8f356c34a86fa4440fedf86f4fc398967eea66e4aab4e9ee81e3d

完成第 3 步 - “恢复器”

错误:构建步骤 3“eu.gcr.io/fn-img/buildpacks/nodejs10/builder:nodejs10_20201005_20_RC00”失败:步骤以非零状态退出:46

有趣的部分可能是上面的错误:

<Error>
  <Code>NoSuchKey</Code>
  <Message>The specified key does not exist.</Message>
  <Details>No such object: eu.artifacts.<project-id>.appspot.com/containers/images/sha256:484d08dfc6a8f356c34a86fa4440fedf86f4fc398967eea66e4aab4e9ee81e3d</Details>
</Error>
Run Code Online (Sandbox Code Playgroud)

builder指的是什么键?<project-id>@appspot.gserviceaccount.com可以使用角色Cloud Functions Admin和访问云功能Editor

编辑

部署通过 firebase deploy --only functions:<my-api>

该函数用于@google-cloud/storage获取存储资源的公共 url。

我正在加载这样的服务帐户配置:

<Error>
  <Code>NoSuchKey</Code>
  <Message>The specified key does not exist.</Message>
  <Details>No such object: eu.artifacts.<project-id>.appspot.com/containers/images/sha256:484d08dfc6a8f356c34a86fa4440fedf86f4fc398967eea66e4aab4e9ee81e3d</Details>
</Error>
Run Code Online (Sandbox Code Playgroud)

这里使用了云存储。


const devServiceAccount = require("../../service-accounts/dev.json");
const prodServiceAccount = require("../../service-accounts/prod.json");

export const getAdminConfig = (): (AppOptions | undefined) => {
  const baseConfigEnv = process.env.FIREBASE_CONFIG;
  if (!baseConfigEnv) {
    console.error("no firebase config environment");
    return undefined;
  }

  const app = functions.config().app;
  if (app === undefined) {
    console.error("no firebase app config");
    return undefined;
  }

  const serviceAccount = app.environment === 'dev' ? devServiceAccount : prodServiceAccount;
  const adminConfig = JSON.parse(baseConfigEnv) as AppOptions;
  adminConfig.credential = credential.cert(serviceAccount);

  return adminConfig;
}
Run Code Online (Sandbox Code Playgroud)

我的文件夹结构如下。

+ functions
  + lib
    + function.js
  + service-accounts
    + dev.json
    + prod.json
  + src
    + function.ts
Run Code Online (Sandbox Code Playgroud)

鉴于getAdminConfig()为项目中的所有功能加载了文件,我排除了服务帐户文件的问题。

更新 10/13/20

我已经验证了上传到 GCF 存储容器的文件。JSON 密钥就在那里并且位于正确的位置。路径匹配,因此应该在 GCF 运行时找到它们。

mar*_*son 6

为下一个遇到此问题的灵魂添加提示。这似乎是由于还原/回滚过程中文件丢失/无法访问造成的。

我通过简单地成功解决了这个问题:

  1. 使用 web firebase 控制台删除我的函数。
  2. 再次正常部署 >firebase deploy