Советы по Google Cloud S3

@Pfaffman вынес эту информацию о Google Cloud, которая не обязательно подходит для исходного сообщения, но должна быть сохранена для тех, у кого возникают проблемы с Google Cloud.


Привет,

Спасибо за совет, но у меня это не сработало, пока я не изменил роль с «Storage Legacy Object Owner» на «Storage Legacy Bucket Owner».

Это конкретно указано во всплывающей подсказке при выборе роли:

Storage Legacy Object Owner

Чтение и запись существующих объектов без перечисления.

Storage Legacy Bucket Owner

Чтение и запись существующих бакетов с перечислением/созданием/удалением объектов.

Теперь всё работает, включая перечисление, что позволяет выполнять автоматическое резервное копирование! Ура!!

3 лайка

Об использовании S3 в Google Buckets:

Как я уже упоминал здесь:
https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/334
Я могу подтвердить, что перечисление работает, и автоматическое резервное копирование работает при использовании сервисной учетной записи с ролью Storage Legacy Bucket Owner для бакета.

Обратите внимание, что использование S3 для Google Bucket подразумевает выбор только тех регионов, которые имеют одинаковое название в Amazon и в Google.
Кажется нелепым, что нужно выбирать из выпадающего списка с валидацией на стороне сервера (я пытался работать с API, но без успеха), вместо того чтобы вводить название вручную.

Это означает, что вы не можете использовать бакет в Европе, например, так как префикс в Amazon — EU, а в Google — EUROPE, а также нельзя использовать мультирегиональные бакеты.

AWS:

Название региона Код
US East (Ohio) us-east-2
US East (N. Virginia) us-east-1
US West (N. California) us-west-1
US West (Oregon) us-west-2
Africa (Cape Town) af-south-1
Asia Pacific (Hong Kong) ap-east-1
Asia Pacific (Jakarta) ap-southeast-3
Asia Pacific (Mumbai) ap-south-1
Asia Pacific (Osaka) ap-northeast-3
Asia Pacific (Seoul) ap-northeast-2
Asia Pacific (Singapore) ap-southeast-1
Asia Pacific (Sydney) ap-southeast-2
Asia Pacific (Tokyo) ap-northeast-1
Canada (Central) ca-central-1
China (Beijing) cn-north-1
China (Ningxia) cn-northwest-1
Europe (Frankfurt) eu-central-1
Europe (Ireland) eu-west-1
Europe (London) eu-west-2
Europe (Milan) eu-south-1
Europe (Paris) eu-west-3
Europe (Stockholm) eu-north-1
Middle East (Bahrain) me-south-1
South America (São Paulo) sa-east-1

Google:

Континент Название региона Описание региона
Северная Америка
NORTHAMERICA-NORTHEAST1 Монреаль leaf icon Низкий уровень CO2
NORTHAMERICA-NORTHEAST2 Торонто leaf icon Низкий уровень CO2
US-CENTRAL1 Айова leaf icon Низкий уровень CO2
US-EAST1 Южная Каролина
US-EAST4 Северная Вирджиния
US-EAST5 Колумбус
US-SOUTH1 Даллас
US-WEST1 Орегон leaf icon Низкий уровень CO2
US-WEST2 Лос-Анджелес
US-WEST3 Солт-Лейк-Сити
US-WEST4 Лас-Вегас
Южная Америка
SOUTHAMERICA-EAST1 Сан-Паулу leaf icon Низкий уровень CO2
SOUTHAMERICA-WEST1 Сантьяго
Европа
EUROPE-CENTRAL2 Варшава
EUROPE-NORTH1 Финляндия leaf icon Низкий уровень CO2
EUROPE-SOUTHWEST1 Мадрид leaf icon Низкий уровень CO2
EUROPE-WEST1 Бельгия leaf icon Низкий уровень CO2
EUROPE-WEST2 Лондон
EUROPE-WEST3 Франкфурт
EUROPE-WEST4 Нидерланды
EUROPE-WEST6 Цюрих leaf icon Низкий уровень CO2
EUROPE-WEST8 Милан
EUROPE-WEST9 Париж leaf icon Низкий уровень CO2
Азия
ASIA-EAST1 Тайвань
ASIA-EAST2 Гонконг
ASIA-NORTHEAST1 Токио
ASIA-NORTHEAST2 Осака
ASIA-NORTHEAST3 Сеул
ASIA-SOUTH1 Мумбаи
ASIA-SOUTH2 Дели
ASIA-SOUTHEAST1 Сингапур
Индонезия
ASIA-SOUTHEAST2 Джакарта
Австралия
AUSTRALIA-SOUTHEAST1 Сидней
AUSTRALIA-SOUTHEAST2 Мельбурн

Мне также кажется нелепым необходимость настраивать эти параметры в разделе «Настройки файлов». Я не использую S3 для загрузки файлов, только для резервного копирования. Требуется использовать разные бакеты для загрузки и резервного копирования, но есть только одно место для настройки региона — в разделе «Настройки файлов».

Надеюсь, это сэкономит время кому-то еще, кто столкнется с этой проблемой.

PS: Я отлаживал проблему с помощью https://discourse.example.com/logs/

Не удалось перечислить резервные копии из S3: указанное ограничение местоположения недопустимо. → Проблема с регионом

Не удалось перечислить резервные копии из S3: доступ запрещен. → Нужно использовать роль Storage Legacy Object Owner вместо Storage Legacy Bucket Owner

1 лайк

Если вы настроили всё через переменные окружения, как описано в первом посте, и установили DISCOURSE_S3_ENDPOINT согласно рекомендации, то переменная DISCOURSE_S3_REGION игнорируется, что делает эту проблему несущественной.

2 лайка

Спасибо.
Дело в том, что я использую готовый образ Bitnami из Google Cloud Marketplace.
Вероятно, можно настроить переменные окружения, но это не так просто.
Указание конечной точки в интерфейсе не игнорирует регион.

В любом случае спасибо.

Большое спасибо!
Действительно, я забыл добавить фрагмент кода.

К сожалению, я получаю следующую ошибку:

Aws::S3::Errors::InvalidArgument: Invalid argument.

Это очень похоже на ошибку, которую я получал при использовании веб-интерфейса, но информации недостаточно для решения проблемы…

Я нашел эту тему, где предполагается, что может быть несовместимость с Google Storage по сравнению с Amazon S3.

Возможно, это не работает для Google Storage?

Полный стек вызовов при ручном запуске задачи:

root@discourse-2-app:/var/www/discourse# sudo -E -u discourse bundle exec rake s3:upload_assets --trace
** Invoke s3:upload_assets (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke s3:ensure_cors_rules (first_time)
** Invoke environment 
** Execute s3:ensure_cors_rules
Installing CORS rules...
skipping
** Execute s3:upload_assets
Uploading: assets/docker-manager-app-ecd2975f42c4096057a046c086d6a43905c8a18442900d5293ae9a3489422bb0.js
rake aborted!
Aws::S3::Errors::InvalidArgument: Invalid argument.
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:27:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:56:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/client.rb:12369:in `put_object'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/object.rb:1472:in `put'
/var/www/discourse/lib/s3_helper.rb:75:in `upload'
/var/www/discourse/lib/tasks/s3.rake:37:in `block in upload'
/var/www/discourse/lib/tasks/s3.rake:36:in `open'
/var/www/discourse/lib/tasks/s3.rake:36:in `upload'
/var/www/discourse/lib/tasks/s3.rake:192:in `block (2 levels) in <main>'
/var/www/discourse/lib/tasks/s3.rake:191:in `each'
/var/www/discourse/lib/tasks/s3.rake:191:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake:25:in `load'
/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake:25:in `<top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli.rb:485:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli.rb:31:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/cli.rb:25:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/exe/bundle:48:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.20/exe/bundle:36:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => s3:upload_assets

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

EDIT (РЕШЕНО):
@gerhard @Falco
Я нашел проблему, включив http_wire_trace.
Ответ «Invalid argument» от googleapis объясняет это:
Cannot insert legacy ACL for an object when uniform bucket-level access is enabled. Read more at Uniform bucket-level access  |  Cloud Storage  |  Google Cloud Documentation

Я включил детализированный ACL для бакета вместо единого ACL, так как заголовок, устанавливаемый при загрузке, указывает, что объект является публичным. (У меня был единый ACL, и весь бакет был установлен как публичный).

У меня нет прав на редактирование исходного сообщения, но, думаю, стоит упомянуть, что для работы бакетов Google учетная запись службы должна иметь роль Storage Legacy Bucket Owner для резервного бакета, а бакет для загрузки должен использовать детализированный ACL.

Надеюсь, это сэкономит время сообществу.
Еще раз спасибо @Falco @pfaffman @gerhard @tuanpembual за помощь.

2 лайка