配置 S3 上传后图片未加载

你好。我们刚刚从 Discourse EC2 迁移到了 Discourse ECS(容器服务)。在 EC2 阶段,我们尚未配置 S3 上传功能。迁移前,我们将所有图片从 EC2 复制到了 S3 存储桶(已开启公共访问权限)。然而,在启用 S3 上传功能(尚未配置 CDN)完成迁移后,我们发现图片(包括头像)完全无法加载。

app.yml 配置如下:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: us-east-1
  DISCOURSE_S3_ACCESS_KEY_ID: aws_access_key
  DISCOURSE_S3_SECRET_ACCESS_KEY: aws_secret_key
  DISCOURSE_S3_BUCKET: <uploads-bucket>
  DISCOURSE_S3_BACKUP_BUCKET: <backups-bucket>
  DISCOURSE_BACKUP_LOCATION: s3

hooks:
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

在容器中运行以下命令也未解决问题:

rake posts:rebake
rake posts:missing_uploads
rake avatars:refresh

我们还注意到图片 URL 存在差异(Discourse 仍在使用“EC2 本地上传”的 URL)。

S3 中的链接是:https://[s3-bucket].s3.amazonaws.com/original/1X/831092e27d6c066c3618a587a5c378e1c794f2c6.png

Discourse 中的链接(URL 仍来自 EC2 上传):https://[domain]/uploads/default/original/1X/831092e27d6c066c3618a587a5c378e1c794f2c6.png

浏览器报错:404 NOT FOUND

我们该如何配置 Discourse,使其使用正确的 S3 URL 来加载图片?

你运行了迁移到 S3 的 Rake 任务吗?

我建议在迁移之前在 EC2 上执行该操作。

1 个赞

嗨,Jay。尝试在 ECS 中执行该命令时遇到了错误:

想确认一下,这是否只能在 EC2 上运行?是否有其他方式可以迁移上传文件或更新图片 URL?目前 EC2 实例已停止,而当前的 ECS 设置已使用了域名、数据库和缓存。我不确定是否可以在不造成停机的情况下,将域名、数据库和缓存重新指向旧的 EC2 实例(然后重建)。谢谢。

您需要在能够访问这些图像的实例中运行该命令。不过,如果您已经手动将它们迁移到 S3,那么您可能需要对 uploads 表进行一些调整。

我一直在编写一份操作指南,介绍如何从一个存储桶迁移到另一个存储桶,您可以参考它来解决您的问题。不过,您需要根据实际情况修改其中的步骤,因为您的情况是从本地迁移到存储桶,而不是存储桶之间的迁移。

如果按固定费用收取此项工作的费用,我可能会收取 4 小时的费用;但如果按小时计费,可能只需 1 小时。

哦!抱歉,我刚刚注意到这一点。如果 EC2 实例使用的是同一个数据库,那么您或许可以将其重新启动(保留 ECS 不变),并在该实例上运行 migrate-to-s3 任务。首先,您需要按照《使用对象存储进行上传(S3 及克隆)》中的说明,将所有与 S3 相关的内容设置为环境变量:Using Object Storage for Uploads (S3 & Clones)。这很可能是最简单的解决方案。我建议在开始之前先仅备份数据库。

1 个赞

你好,Jay。谢谢回复。明白了,我想这样应该可以。

1 个赞