Перемещение из одного ведра S3 в другое

Продолжение обсуждения из темы Как перенести бакет загрузки S3 от одного провайдера к другому?:

Я пытаюсь перенести данные из бакета GCP в бакет AWS S3. В старой системе не использовался CDN для S3 (человек, который её настраивал, судя по всему, не очень понимал, что делает).

Я использовал s3cmd для синхронизации старого бакета GCP с локальной файловой системой, а затем снова применил его для загрузки файлов в новый бакет S3. Система теперь правильно настроена с использованием S3 и CDN сайта, как описано в теме Использование объектного хранилища для загрузок (S3 и клоны).

В связанной выше теме предлагалось использовать команду rake posts:remap для обновления постов (полагаю, мне также следует пересобрать все посты? Или хотя бы те, которые относятся к старому бакету?).

При выполнении posts:remap было обновлено только одно сообщение.

 Upload.order(Arel.sql('RANDOM()')).limit(10).pluck(:id, :url)

показывает, что все они содержат ссылку на старый бакет… Ага, вот в чём проблема. Нам нужна не команда rake posts:remap, а discourse remap, как описано здесь: Change the domain name or rename your Discourse.

Да, я так думаю.

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

  • создать новый бакет и CDN для него, пересобрать контейнер, чтобы использовать новый бакет/CDN, и убедиться, что всё работает;
  • настроить s3cmd для старого бакета и синхронизировать данные с локальной системой;
  • настроить s3cmd для нового бакета и загрузить данные в новый бакет;
  • выполнить discourse remap OLD-BUCKET-DOMAIN-NAME NEW-BUCKET-DOMAIN-NAME;
  • пересобрать (rebake).

Кажется, всё верно?

Если использовать один и тот же CDN для старого и нового бакета, возможно, удастся избежать пересборки (rebake), но правильно синхронизировать этот процесс довольно сложно (нельзя изменить источник CDN, пока данные не будут загружены в новый бакет, но при этом нужно как-то убедиться, что в процессе синхронизации ничего не было загружено в старый бакет?) — возможно, стоит просто указать, что такой вариант возможен.

Возможно, для руководства лучше использовать официальный AWS CLI?

Используйте здесь DbHelper.remap.

Не обязательно.

Используйте ту же CDN и просто измените источник CDN в панели управления CDN или используйте новую CDN и выполните маппинг с помощью DbHelper.remap. В любом случае rebake не требуется.

А, понятно. Я посмотрю на это… Возможно ли заставить AWS CLI работать с бакетами, не принадлежащими AWS?

Привет, Рафаэль. Я почти закончил. Моя текущая версия этого руководства указывает на aws cli и gsutil для синхронизации: от старого хранилища к локальному и от локального к новому (я просто даю ссылки на эти инструменты и привожу команды командной строки с заполненными именами бакетов в качестве плейсхолдеров). Затем используется DbHelper для обновления таблиц. Для моего сайта среднего размера это работает довольно быстро. Отлично.

Единственная проблема сейчас в том, что в старой конфигурации не было параметра s3_cdn_url, поэтому изображения в постах всё ещё ссылаются напрямую на бакет (не на CDN). Перепечка (rebake) не помогает. Новые загрузки корректно ссылаются на CDN. Исправить это установкой DISCOURSE_S3_ENDPOINT: '' нельзя, так как это не имеет эффекта, поэтому после восстановления базы данных мне пришлось очистить SiteSetting. Это не так уж плохо, но мне потребовалось много пересборок, чтобы это понять.

В старой конфигурации не было определено S3 CDN. Я могу исправить это, перепечатав все 1250 постов, в которых есть URL/имя хоста бакета, но это приводит к тому, что все эти изображения скачиваются и оптимизируются заново (старый сервер работает на версии 2.7.0.beta5, поэтому я думал, что некоторые недавние повторные оптимизации уже выполнены?). Это сильно нагружает (средняя нагрузка 10–20) мой слабый сервер с 2 ГБ ОЗУ (с Postgres и Redis на RDS и Elasticache) в течение довольно долгого времени. Думаю, мне всё равно понадобится более мощный экземпляр EC2 для этого сайта, но меня всё ещё удивляет, что такая перепечка выводит сервер из строя (ошибки 500 в интерфейсе).

Может быть, мне лучше заменить имя хоста бакета на URL CDN в поле cooked в этих постах?

@pfaffman Спасибо, что указали мне этот путь.
Однако моя проблема усугубляется на последних двух шагах.

Текущая проблема: некоторые изображения отсутствуют, вместо них отображаются маленькие иконки. При наведении курсора на них в подсказке показывается адрес ‘olds3bucket’. Но при клике на них изображения корректно открываются в полном размере, и в адресной строке отображается путь к ‘news3bucket’.

  1. В основном вы советовали синхронизировать данные старого бакета с новым, что я уже успешно выполнил.
  2. Затем заполнить настройки нового бакета в веб-интерфейсе Discourse, который я уже использую в течение года.
  3. Теперь вы говорите о ‘пере映射’ (remap) старого URL бакета на новый, а затем о пересборке (rebake). Вот где возникает проблема. Когда я это делаю (или даже просто выполняю ‘rebake’, или даже выбираю ‘Rebuild Html’ из меню настроек поста, с выполнением шага ‘remap’ или без него), те изображения, которые ранее отображались только как иконки, исчезают полностью. Вместо них остаётся только ‘белое пространство’. Поэтому я сразу же откатываю/восстанавливаю изменения.

Ещё раз спасибо.
(У меня очень небольшой сайт, и у вас, наверное, тоже…).

rclone — это отличный инструмент, который позволяет синхронизировать данные с несколькими хранилищами. В настоящее время мы используем его для резервного копирования.

Привет, Джей,

Извини, что снова напоминаю, но есть ли какие-то успехи с руководством? Спасибо!