Firebase 存储工件

gla*_*aze 97 firebase firebase-storage

我试图了解什么eu.artifacts.%PROJECT NAME%.appspot.com是。它目前占用了我每天 5GB 限制的 800MB 存储空间。它只包含应用程序/八位字节流类型的文件。这个bucket是自动创建的,文件路径是eu.artifacts....appspot.com/containers/images。2 个最重的文件有 200 mb 和 130 mb。我尝试删除它,但它再次自动创建。用户可以在我的网站上上传图片,但该存储桶目前只需要大约 10mb 包含所有用户图像。

所以我的问题是:这个桶是做什么用的,为什么它这么重?

Fra*_*len 65

火力士在这里

如果您使用的是 Cloud Functions,则您看到的文件与构建运行时(适用于 Node 10 及更高版本)的方式最近发生的变化有关。

Cloud Functions 现在使用Cloud Build为您的 Cloud Functions 创建运行时(适用于 Node 10 及更高版本)。Cloud Build 反过来使用Container Registry来存储这些运行时,这些运行时将它们存储在您项目下的新 Cloud Storage 存储桶中。

有关这方面的更多信息,另请参阅 Firebase 定价常见问题中关于为什么我需要结算帐户才能将 Node.js 10 或更高版本用于 Cloud Functions for Firebase?

另请参阅有关这些工件的 firebase-talk 邮件列表中的线程


更新:其他一些答案建议从存储桶中删除工件,甚至在它们上设置生命周期管理以自动执行此操作。这会导致对 Container Registry 中这些工件的悬空引用,这会破坏未来的构建。

要安全地删除工件,请从 Container Registry控制台(位于gcf文件夹下)或使用脚本删除容器。这反过来也会从您的存储桶中删除工件。

从 CLI 9.14 版开始,该firebase deploy过程会在部署后自动清理其容器映像。因此,如果您升级到最新版本,您的存储桶中不应再有额外的工件。

  • 奇怪的是,firebase 并没有给我们任何对此的控制权,只是增加了 Storage 的使用,几乎迫使我们在不知不觉中付费。 (98认同)
  • 剩下的问题是:如何删除那些过时的工件?Firebase 中没有文档与这些相关。我有一个使用 18 GB 存储的项目,因为我的团队最近在处理云功能。我认为这不是一个好的开发者体验。 (25认同)
  • 我的项目的工件文件每天使用 500MB,当免费套餐高达 5GB 时,我需要支付 0.01 美元的费用。有人可以解释为什么会发生这种情况吗?除了这些自动生成的文件之外,我不会将云存储用于其他用途。 (8认同)
  • 据我了解(自从撰写此答案以来),免费套餐仅适用于您的默认存储桶。由于容器存储在其他存储桶中,因此它们不属于免费层。另请参阅道格的答案:/sf/ask/4472538941/#63893563 和此处:https://stackoverflow.com/问题/63884429/如何从-gc-storage删除过时的-firebase-cloud-function-containers-/63888296#63888296 (8认同)
  • 好问题。我们如何删除未使用的? (5认同)
  • 对我来说也+1,工件不会随着后续功能的部署而被删除。我正在使用 Firebase CLI - 9.23.0 有少量功能(~10),但在 GCP Console(不是 firebase)中检查时可以看到有 228 个不同大小的工件。 (3认同)
  • 我使用的是 10+ 版本,它在部署函数时仍然会收集工件。 (3认同)

yo1*_*995 29

我已经咨询了 GCP 支持,这里有一些事情

  • Cloud Functions 导致存储使用量激增
  • 由于这些工件未存储在默认存储桶中,因此即使您存储的总字节数未达到免费层限制,它们也会向您收费
  • https://console.cloud.google.com/storage/browser删除工件存储桶。据支持人员说

关于 artifacts 存储桶,您实际上可以摆脱它们,因为它们存储的是该函数的先前版本。但是,我不建议删除 "gcf-sources..." 存储桶,因为它包含当前图像,因此删除此存储桶会弄乱您的功能。

我试图将它整体删除,到目前为止它没有造成麻烦。如果以后有问题,我会更新。


编辑 201118:请参阅下面的评论,您可能需要保留存储桶,同时删除其中的所有内容。

  • @WeijingJayLin 他们应该这样做,但 Firebase 开发人员似乎仍在研究它。根据支持人员的说法,我们的工程团队正在努力实现自动删除,我建议您密切关注发行说明或我们的博客,以了解平台的新功能和改进。 (4认同)
  • @samueldple 等待为我解决了这个问题。但我联系了支持人员,得到的答复是:“解决该问题的一种选择是单独部署功能。然后在设置功能映像后,您可以再次部署所有功能。删除映像是可选的,有一天对象生命周期很好,您可以通过单独部署函数来解决该问题。请记住,由于未找到函数映像,部署有时可能会出现类似这样的问题。” (3认同)
  • 我删除了工件,现在我无法再部署新功能。我收到:部署错误。构建失败:构建错误详细信息不可用。此外,在日志中它告诉我工件上有一个 404。有什么解决办法吗? (2认同)

小智 14

添加到 @yo1995
我咨询了 Firebase 支持,他们确认不应删除工件存储桶。基本上,工件用于帮助构建要存储在“gcf-sources”存储桶中的最终图像。

直接引用它们
“您可以随意删除“XX.artifacts”中的内容,但请保持存储桶不变,它将在以下部署周期中使用。”

如果您完全删除工件存储桶,则可能会出现一些意外行为。
此外,“团队正在努力自动清理这个存储桶,但在发布解决方案之前,他们需要解决一些限制。”

目前,我将存储桶设置为自动删除超过 1 天的文件。


Mik*_*nji 13

添加到@yo1995 的响应中,您可以删除存储桶中的工件,而无需进入 GCP。留在 Firebase 中,您转到存储,然后“添加存储桶”。从那里,您将看到导入 gcp 和工件存储桶的选项。接下来,您可以相应地删除存储桶中的工件。

根据收到的一些评论,重要的是不要删除存储桶。相反,只删除存储桶中的工件!

神器桶位置图片

  • 不要这样做,它会导致错误。往上看 (3认同)

Bee*_*ler 6

如何减少存储

所以这个问题有一个很好的答案,但如何解决它需要进一步深入研究。

为了帮助未来的开发人员切入正题,以下是在 GCP 中将以下规则添加到您的项目后应该看到的结果

完全清理工件存储

橙色线是us-artifacts.<your-project>.appspot.com桶。

解决问题的步骤

  1. 导航到https://console.cloud.google.com/
  2. 打开 Firebase 项目对应的 GCP 项目
  3. 在菜单中,选择存储 -> 浏览器 导航菜单
  4. 单击违规us-artifacts.<your-project>.appspot.com存储桶
  5. 转到“生命周期”选项卡并添加 3 天的生命周期
  • 添加规则
  • 删除对象
  • 年龄,3生命周期规则 注意:结果将在大约24 小时后才会出现在使用图表上

警告

Firebase 使用反向引用先前容器的容器,因此如果您设置了 3 天的时间段并且您的 Firebase 部署函数开始失败,您将需要更新函数的本地名称以包含版本控制,并指定构建标志以删除旧的版本,从 firebase.json 中删除它们,或手动删除过时的函数。

使用版本化 API 类型函数

在您的入口点中,假设index.ts,并假设您已使用

admin.initializeApp(functions.config().firebase)
import * as functions from 'firebase-functions'

// define the app as a cloud function called APIv1 build xxxxxx
export const APIv1b20201202 = functions.https.onRequest(main)
Run Code Online (Sandbox Code Playgroud)

main你的应用程序的名称在哪里

并且在你的 firebase.json

...
"hosting": {
    "public": "dist",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**", "**/tests/**"],
    "rewrites": [
      {
        "source": "/api/v1/**",
        "function": "APIv1b2021202"
      }
    ]
  },
...

Run Code Online (Sandbox Code Playgroud)

或者,手动更新

# Deploy new function called APIv11
$ firebase deploy --only functions:APIv11

# Wait until deployment is done; now both APIv11 and APIv10 are running

# Delete APIv10
$ firebase functions:delete APIv10
Run Code Online (Sandbox Code Playgroud)

  • 警告部分很有趣。在什么情况下 Firebase 部署功能会开始失败?我想避免这种版本控制魔法。 (2认同)
  • 构建容器使用分层文件来有效地缓存您的函数执行环境。其中一些缓存的有效期似乎是几天或可能几周,因此函数部署将查找缓存版本(如果它仍然有效)。如果您删除了它(并且您无法告诉 firebase 您删除了它),则构建会失败。版本控制只是强制执行环境的完全重建 (2认同)