# Советы по Google Cloud S3

**URL:** https://meta.discourse.org/t/tips-on-google-cloud-s3/247555
**Category:** Sysadmins
**Tags:** reference, google-cloud
**Created:** [20.Июль.2022 15:21:52 UTC](https://meta.discourse.org/t/tips-on-google-cloud-s3/247555 "2022-07-20T15:21:52Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Jerome\_Hordies](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jerome_hordies/32/267141_2.png) [@Jerome\_Hordies](https://meta.discourse.org/u/Jerome_Hordies)
#### Post date: [20.Июль.2022 15:04:38 UTC](https://meta.discourse.org/t/tips-on-google-cloud-s3/247555/1 "2022-07-20T15:04:38Z")

</div>

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

* * *

Привет,

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

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

**Storage Legacy Object Owner**

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

**Storage Legacy Bucket Owner**

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

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

---

<div class="post-metadata">

### Author: ![Jerome\_Hordies](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jerome_hordies/32/267141_2.png) [@Jerome\_Hordies](https://meta.discourse.org/u/Jerome_Hordies)
#### Post date: [20.Июль.2022 15:21:52 UTC](https://meta.discourse.org/t/tips-on-google-cloud-s3/247555/2 "2022-07-20T15:21:52Z")

</div>

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

> [@Falco](#):
>
> Поскольку вы не можете перечислять файлы, вы не сможете перечислять резервные копии, и автоматическое резервное копирование будет завершаться ошибкой, поэтому мы не рекомендуем использовать его для резервного копирования. Однако, возможно, [решение есть в этом ответе](https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/235).

Как я уже упоминал здесь:  
[https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/334](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](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `NORTHAMERICA-NORTHEAST2` | Торонто | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `US-CENTRAL1` | Айова | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `US-EAST1` | Южная Каролина | |
| | `US-EAST4` | Северная Вирджиния | |
| | `US-EAST5` | Колумбус | |
| | `US-SOUTH1` | Даллас | |
| | `US-WEST1` | Орегон | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `US-WEST2` | Лос-Анджелес | |
| | `US-WEST3` | Солт-Лейк-Сити | |
| | `US-WEST4` | Лас-Вегас | |
| **Южная Америка** | | | |
| | `SOUTHAMERICA-EAST1` | Сан-Паулу | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `SOUTHAMERICA-WEST1` | Сантьяго | |
| **Европа** | | | |
| | `EUROPE-CENTRAL2` | Варшава | |
| | `EUROPE-NORTH1` | Финляндия | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `EUROPE-SOUTHWEST1` | Мадрид | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `EUROPE-WEST1` | Бельгия | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `EUROPE-WEST2` | Лондон | |
| | `EUROPE-WEST3` | Франкфурт | |
| | `EUROPE-WEST4` | Нидерланды | |
| | `EUROPE-WEST6` | Цюрих | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| | `EUROPE-WEST8` | Милан | |
| | `EUROPE-WEST9` | Париж | ![leaf icon](https://global.discourse-cdn.com/meta/original/4X/9/a/7/9a78b39036c846bccd7f500db059efe2988575cc.svg) [Низкий уровень CO2](https://cloud.google.com/sustainability/region-carbon) |
| **Азия** | | | |
| | `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/](https://discourse.example.com/logs/)  
…  
Не удалось перечислить резервные копии из S3: указанное ограничение местоположения недопустимо. → Проблема с регионом  
…  
Не удалось перечислить резервные копии из S3: доступ запрещен. → Нужно использовать роль Storage Legacy Object Owner вместо Storage Legacy Bucket Owner

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [20.Июль.2022 17:17:16 UTC](https://meta.discourse.org/t/tips-on-google-cloud-s3/247555/3 "2022-07-20T17:17:16Z")

</div>

> [@Jerome Hordies](#):
>
> Я считаю глупым, что нужно выбирать из выпадающего меню с проверкой на стороне сервера (я пытался вмешиваться в API без успеха), вместо того чтобы просто ввести значение.

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

---

<div class="post-metadata">

### Author: ![Jerome\_Hordies](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jerome_hordies/32/267141_2.png) [@Jerome\_Hordies](https://meta.discourse.org/u/Jerome_Hordies)
#### Post date: [20.Июль.2022 17:41:05 UTC](https://meta.discourse.org/t/tips-on-google-cloud-s3/247555/4 "2022-07-20T17:41:05Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![Jerome\_Hordies](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jerome_hordies/32/267141_2.png) [@Jerome\_Hordies](https://meta.discourse.org/u/Jerome_Hordies)
#### Post date: [25.Август.2022 14:08:01 UTC](https://meta.discourse.org/t/tips-on-google-cloud-s3/247555/5 "2022-08-25T14:08:01Z")

</div>

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

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

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

```

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

Я нашел [эту тему](https://github.com/janko/tus-ruby-server/issues/20), где предполагается, что может быть несовместимость с Google Storage по сравнению с Amazon S3.

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

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

```plaintext
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](https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/debugging.html).  
Ответ «Invalid argument» от googleapis объясняет это:  
Cannot insert legacy ACL for an object when uniform bucket-level access is enabled. Read more at [Uniform bucket-level access &nbsp;|&nbsp; Cloud Storage &nbsp;|&nbsp; Google Cloud Documentation](https://cloud.google.com/storage/docs/uniform-bucket-level-access)

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

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

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