firebase - 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 运行时找到它们。
解决方案
为遇到此问题的下一个灵魂添加提示。这似乎是由还原/回滚过程中丢失/无法访问的文件引起的。
我通过简单地成功解决了这个问题:
- 使用 web firebase 控制台删除我的函数。
- 再次正常部署
>firebase deploy
推荐阅读
- sdk - 必应地图 SDK
- r - 如何在ggplot中使用带有密度图的stat_peaks
- css - 当Angular 8中存在文本溢出时动画滚动文本
- ruby-on-rails - 我可以在 Ruby on Rails 模型中使用 JSON 文件作为数据源吗
- c++ - 在大整数数组中查找子数组
- ionic-framework - 如何以编程方式删除 Ionic 3 中的 TabsPage?
- android - 在回收站视图中删除一个项目会复制另一个项目
- ms-word - OOXML 格式的复选框控件被转换为“?”
- excel - 检查日期范围是否等于今天并将低于日期范围的值复制到新单元格
- powershell - PSCustomObject 等式运算符