我试图从firebase CLI(版本8.12.1(部署我的一个函数,但它一直失败。这个功能已经好几个星期没有改变了,所以我有点困惑为什么它现在失败了。
CLI错误
functions[http-api-(europe-west1(]:部署错误。生成失败:生成错误详细信息不可用。请查看日志https://console.cloud.google.com/logs/viewer?project=&advancedFilter=resource.type%3Build%0Resource.labels.build_id%3Dfeb2697d-29b4-4ab7-9b84-90d9f847be42%0AlogName%3Dprojects%2Fvestico-dev%2Logs%2Fcloudbuild
来自云控制台的日志
步骤#3-";恢复器":正在恢复";google.nodejs.functionsframework:函数框架"来自缓存
步骤#3-";恢复器":\u001b[31;1错误:\u001b[0]无法还原:还原数据:GEThttps://storage.googleapis.com/eu.artifacts..appspot.com/containers/images/sha256:484d08dfc6a8f356c34a86fa4440fedf86f4fc398967eea66e4aab4e9ee81e3d?access_token=REDACTED:不受支持的状态代码404;body:
NoSuchKey
指定的密钥不存在。没有这样的对象:eu.appspot.com/containers/images/sha256:484d08dfc6a8f356c34a86fa4440fed86f4fc39886eea6e4aab4e9ee81e3d
完成步骤#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>
建设者指的是什么钥匙?CCD_ 1具有对具有角色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()
中为项目中的所有功能加载的。
更新日期:10/13/20
我已经验证了上传到GCF存储容器的文件。JSON键就在那里,并且位于正确的位置。路径匹配,因此它们应该在GCF运行时被找到。
为下一个遇到这个问题的灵魂添加提示。这似乎是由于在恢复/回滚过程中丢失/无法访问文件造成的。
我通过简单的成功地消除了问题
- 使用web firebase控制台删除我的函数
- 再次正常部署
>firebase deploy
Firebase Cloud Functions或GCF中似乎存在间歇性问题。我刚刚再次运行了firebase deploy --only functions
,它成功地部署了。