# 由于AWS SDK gem版本升级和新的AWS数据完整性保护，无法重建

**URL:** <https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217>\
**Category:** Self-hosting\
**Created:** [2025年二月24日 17:39 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217 "2025-02-24T17:39:21Z")\
**Posts on this page:** 14\
**Page:** 3

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2025年三月1日 14:52 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/41 "2025-03-01T14:52:01Z")

</div>

> [@AntiMetaman](#):
>
> 我重新构建了应用程序，它奏效了！

如果你重新构建了应用程序，那么在容器中所做的更改就丢失了。也许在你进行操作时，Backblaze 的工作人员修复了问题。

---

<div class="post-metadata">

**Author:** ![AntiMetaman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/antimetaman/32/186978_2.png) [@AntiMetaman](https://meta.discourse.org/u/AntiMetaman)\
**Post date:** [2025年三月2日 03:49 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/42 "2025-03-02T03:49:54Z")

</div>

我刚刚注释掉了 S3 并重新构建。我想我以后还是会坚持使用本地存储。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2025年三月2日 12:31 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/43 "2025-03-02T12:31:50Z")

</div>

本地存储工作正常。只是删除不起作用。

---

<div class="post-metadata">

**Author:** ![tedpearson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tedpearson/32/492986_2.png) [@tedpearson](https://meta.discourse.org/u/tedpearson)\
**Post date:** [2025年三月9日 06:18 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/44 "2025-03-09T06:18:05Z")

</div>

> [@PatPatterson](#):
>
> 这是因为在 S3 API 定义中，[DeleteObjects 操作](https://github.com/aws/aws-sdk-ruby/blob/877b459c03ce053a2e311d3d6873ce1b210180a5/apis/s3/2006-03-01/api-2.json#L314) 将 [`httpChecksum.requestChecksumRequired`](https://github.com/aws/aws-sdk-ruby/blob/877b459c03ce053a2e311d3d6873ce1b210180a5/apis/s3/2006-03-01/api-2.json#L326) 设置为 `true`，而 PutObject 等操作则设置为 `false`。因此，SDK 遵循 `WHEN_REQUIRED`，因为校验和是_必需_的。
> 
> 所有 AWS SDK 现在都从 API 定义生成，只有极少的额外代码来处理边缘情况。代码会看到 `DeleteObjects` 需要校验和，而现在执行此操作的方法是使用新的校验和之一，而不是 `Content-MD5`。
> 
> 不幸的是，AWS 没有提供“像以前一样使用 `Content-MD5`”的配置。他们在进行此类更改时，通常不会考虑第三方对象存储生态系统，因为他们实际上不需要这样做。只有当这种情况意外地在某个角落案例中损坏了他们自己的某项服务时，才会得到修复。

感谢您发帖并确认目前没有不降级 aws SDK 的解决方法。我在另一个使用 golang aws sdk 的项目中遇到了 b2 s3 api 的问题，该项目试图备份 VictoriaMetrics 数据库。

您是否从您的工程团队那里了解到他们将如何或何时解决此问题，或者是否有任何方法可以跟踪/获取有关支持的解决方法的更新？我正在考虑是分叉并重新编译一个项目以更改依赖项，还是只等一段时间等待更新！

谢谢！

---

<div class="post-metadata">

**Author:** ![bjmc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bjmc/32/494867_2.png) [@bjmc](https://meta.discourse.org/u/bjmc)\
**Post date:** [2025年三月19日 23:17 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/45 "2025-03-19T23:17:38Z")

</div>

以下是我用来降级AWS Gems的操作步骤：

```bash
 # 进入容器：
./launcher enter app
# 显然需要解冻Gemfile.lock：
bundle config set frozen false
# 设置较旧版本的sdk-s3 gem：
sed -i 's/gem "aws-sdk-s3", require: false/gem "aws-sdk-s3", "1.177.0", require: false/' Gemfile
# 将S3 gem降级以匹配当前的Gemfile中的版本：
bundle update aws-sdk-s3
# 同样降级aws-sdk-core gem：
bundle add aws-sdk-core --version 3.215.

```

在进行这些更改后，我成功地将备份保存到了B2。我相信这只是一个临时解决方案，在下一次Discourse更新时会失效，所以我希望@PatPatterson 和Backblaze团队能尽快提供一个更永久的兼容性修复方案。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2025年三月19日 23:59 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/46 "2025-03-19T23:59:12Z")

</div>

希望您不需要这样做，但可以将该 `sed` 命令放入 `app.yml` 中，以便在重建时自动执行。我认为将其放在插件克隆的下方即可。但这可能比我想象的要复杂。

---

<div class="post-metadata">

**Author:** ![becl](https://avatars.discourse-cdn.com/v4/letter/b/b9bd4f/32.png) [@becl](https://meta.discourse.org/u/becl)\
**Post date:** [2025年四月18日 05:52 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/47 "2025-04-18T05:52:42Z")

</div>

您好 AntiMetaman，

我花了一周的时间尝试让 S3 存储的备份正常工作，并最终通过此线程解决了备份问题。老实说，我不确定是哪个部分起作用了。

我按照您卸载和安装 gem 的方法操作，但现在上传图片时出现错误。我的错误日志显示：

not entitled /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.219.0/lib/seahorse/client/plugins/raise\_response\_errors.rb:17:in `call’ /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aw

在我不得不彻底重装服务器并重新开始之前（老实说，此时我甚至不确定是否还想继续），您是否知道如何撤销 gem 的卸载和安装，以便我尝试查看这是否能解决问题？

---

<div class="post-metadata">

**Author:** ![Stéfan\_van\_der\_Walt](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/st%C3%A9fan_van_der_walt/32/236024_2.png) [@Stéfan\_van\_der\_Walt](https://meta.discourse.org/u/St%C3%A9fan_van_der_Walt)\
**Post date:** [2025年四月25日 17:24 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/48 "2025-04-25T17:24:18Z")

</div>

我在我们的实例（使用Backblaze进行备份）上发现的行为是，备份在二月开始失败，没有通知。我只是今天偶然注意到这个问题，因为我会不时检查我们的备份。这我认为是一个相当严重的问题？

是否可以将AWS SDK降级，直到为Backblaze和其他非AWS提供商找到解决方案？

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2025年四月29日 19:35 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/49 "2025-04-29T19:35:15Z")

</div>

> [@pfaffman](#):
>
> 希望你不需要这样做，

但我为一个使用 Backblaze 的网站这样做了。我创建了一个模板，放在 `/root/aws-revert-template.yml`，内容如下：

```plaintext
# This template reverts aws-sdk-s3 to a version that works with backblaze
# 这个模板将 aws-sdk-s3 回滚到一个可以与 backblaze 兼容的版本

params:
  home: /var/www/discourse

hooks:
  after_bundle_exec:
    - exec:
        cd: $home
        cmd:
          - bundle config set frozen false
          - "sed -i 's/gem \\\"aws-sdk-s3\\\", require: false/gem \\\"aws-sdk-s3\\\", \\\"1.177.0\\\", require: false/' Gemfile"
          - bundle update aws-sdk-s3
          - bundle add aws-sdk-core --version 3.215

```

然后像这样将它添加到我的 `app.yml` 中：

```plaintext
# IMPORTANT: SET A SECRET PASSWORD in Postgres for the Discourse User
# 重要提示：为 Discourse 用户在 Postgres 中设置一个秘密密码
# TODO: change SOME_SECRET in this template
# TODO：在此模板中更改 SOME_SECRET

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
## 如果您想添加 Let's Encrypt (https)，请取消注释这两行
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "/root/aws-revert-template.yml"

```

然后我运行了一个升级到 stable 的命令，似乎有效。

您也可以直接将模板中的内容添加到您的 `app.yml` 中。

---

<div class="post-metadata">

**Author:** ![MattJankowski](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mattjankowski/32/527928_2.png) [@MattJankowski](https://meta.discourse.org/u/MattJankowski)\
**Post date:** [2025年十一月3日 14:37 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/50 "2025-11-03T14:37:28Z")

</div>

注意到此页面 - [S3-Compatible API](https://www.backblaze.com/docs/cloud-storage-s3-compatible-api) - 不再列出各种 `checksum-*` 标头不受支持。

@PatPatterson 不确定您是否还在该主题中 - 但是否已正式支持这些？

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2025年十一月3日 22:03 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/51 "2025-11-03T22:03:00Z")

</div>

您能确认您的 backblaze b2 在没有我建议的修复的情况下是否正常工作吗？

---

<div class="post-metadata">

**Author:** ![MattJankowski](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mattjankowski/32/527928_2.png) [@MattJankowski](https://meta.discourse.org/u/MattJankowski)\
**Post date:** [2025年十一月4日 12:47 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/52 "2025-11-04T12:47:58Z")

</div>

感谢您的快速回复，抱歉——我本应提供更多细节。在另一个开源软件包（Mastodon）中，我们也曾将 `aws-sdk-core` gem 锁定在 ` < 3.216.0` 以处理那些使用 Backblaze（我怀疑还有其他服务，但问题是在那里出现的）的用户遇到的确切问题。

但在最近几周，我注意到：

- Backblaze 网站上的那个页面不再将那些标头列为不支持。
- 最近的一个 aws gem 版本提到了修复了之前 `when_required` 未完全遵守的问题。

在之前的研究中，我曾看到这个帖子，其中遇到的问题大致相同，我想了解的是，如果 Backblaze 确实增加了支持，或者 gem 现在已完全解决了该问题，我们是否可以安全地进行 gem 更新。

---

<div class="post-metadata">

**Author:** ![PatPatterson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/patpatterson/32/445451_2.png) [@PatPatterson](https://meta.discourse.org/u/PatPatterson)\
**Post date:** [2025年十一月4日 15:58 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/53 "2025-11-04T15:58:10Z")

</div>

您好 - 是的，Backblaze B2 今年早些时候增加了对校验和标头的官方支持。

---

<div class="post-metadata">

**Author:** ![MattJankowski](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mattjankowski/32/527928_2.png) [@MattJankowski](https://meta.discourse.org/u/MattJankowski)\
**Post date:** [2025年十一月4日 16:14 UTC](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217/54 "2025-11-04T16:14:23Z")

</div>

太好了！感谢您的确认。

[上一頁](https://meta.discourse.org/t/cant-rebuild-due-to-aws-sdk-gem-bump-and-new-aws-data-integrity-protections/354217.md?page=2)
