Изображения не загрузились после настройки загрузки в 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 по-прежнему использовал URL-адреса «локальных загрузок из EC2»).

Вот ссылка в 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 так, чтобы он использовал правильные URL-адреса S3 для изображений?

Вы запустили задачу Rake для миграции в S3?

Я бы сделал это на EC2 перед миграцией.

Привет, Джей. Попробовал выполнить команду в ECS, но столкнулся с ошибкой:

Хотел уточнить: запускать это нужно только в EC2? Есть ли другой способ миграции загруженных файлов или обновления ссылок на изображения? В данный момент экземпляр EC2 остановлен, а текущая настройка ECS использует домен, базу данных и кэш, поэтому я не уверен, можно ли без простоя перенаправить домен, базу данных и кэш обратно на старый EC2 (а затем выполнить пересборку). Спасибо.

Вам нужно будет выполнить команду на экземпляре, имеющем доступ к изображениям. Но если вы переместили их в S3 вручную, возможно, вам придется внести изменения непосредственно в таблицу uploads.

Я работаю над инструкцией по переносу данных из одного бакета в другой, которая может помочь решить вашу проблему. Однако вам потребуется адаптировать эти инструкции под вашу ситуацию: перенос с локального хранилища в бакет, а не из бакета в бакет.

Если бы я брал с вас фиксированную плату за эту работу, я бы, вероятно, рассчитал её на 4 часа, хотя при почасовой оплате это могло бы занять всего один час.

Ой! Извините, я только что это заметил. Если EC2 использует ту же базу данных, вы, возможно, сможете снова запустить его (оставив ECS без изменений) и выполнить задачу migrate-to-s3 на нём. Для этого сначала нужно добавить все переменные окружения, связанные с S3, как описано в статье Использование объектного хранилища для загрузок (S3 и клонирование). Это, скорее всего, самое простое решение. Перед началом я рекомендую сделать резервную копию только базы данных.

Привет, Джей. Спасибо за ответ. Понял. Думаю, это сработает.