首页 > 解决方案 > Firebase Cloud Functions 部署错误,错误代码为“NoSuchKey”

问题描述

我正在尝试从 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 - “restorer”:从缓存中恢复“google.nodejs.functions-framework:functions-framework”的数据

步骤#3 - “restorer”:\u001b[31;1mERROR:\u001b[0m无法恢复:恢复数据:GET https://storage.googleapis.com/eu.artifacts..appspot.com/containers/images/sha256 :484d08dfc6a8f356c34a86fa4440fedf86f4fc398967eea66e4aab4e9ee81e3d?access_token=已编辑:不支持的状态码 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>

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

编辑

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

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

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


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;
}

此处使用云存储。

const options = {
    action: 'read',
    expires: Date.now() + 1000 * 60 * 60 //1 hour
  } as GetSignedUrlConfig;

const file = bucket.file(path);
filePathPromises.push(file.getSignedUrl(options))
  });

我的文件夹结构如下。

+ functions
  + lib
    + function.js
  + service-accounts
    + dev.json
    + prod.json
  + src
    + function.ts

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

20 年 10 月 13 日更新

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

标签: firebasegoogle-cloud-functions

解决方案


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

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

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

推荐阅读