Consejos sobre Google Cloud S3

@Pfaffman separó esta información de Google Cloud, que no encaja necesariamente en el OP, pero debería guardarse para aquellos que tienen problemas con Google Cloud


Hola,

Gracias por el consejo, pero no me funcionó hasta que cambié el rol de Propietario de objetos heredado de almacenamiento a Propietario de bucket heredado de almacenamiento.

Está escrito específicamente en la información sobre herramientas al seleccionar el rol:

Propietario de objetos heredado de almacenamiento

Acceso de lectura/escritura a objetos existentes sin listarlos.

Propietario de bucket heredado de almacenamiento

Acceso de lectura y escritura a buckets existentes con listado/creación/eliminación de objetos.

¡Ahora funciona, incluido el listado, lo que permite la copia de seguridad automática! ¡hurra!

3 Me gusta

Como mencioné aquí:
https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/334
Puedo confirmar que la lista funciona y la copia de seguridad automática funciona utilizando una cuenta de servicio con el rol de Propietario del bucket heredado de almacenamiento en el bucket.

Ten en cuenta que usar S3 para Google Buckets implica seleccionar solo una Región que tenga el mismo nombre en Amazon que en Google.
Me parece tonto que tengas que elegir de un menú desplegable con validación de backend (intenté manipular la API sin éxito) en lugar de escribirlo.

Esto implica que no puedes usar un bucket en Europa, por ejemplo, ya que el prefijo en Amazon es EU y EUROPE en Google, ni tampoco puedes usar multi-región.

AWS:

Nombre de la región Código
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:

Continente Nombre de la región Descripción de la región
América del Norte
NORTHAMERICA-NORTHEAST1 Montreal icono de hoja Bajo CO2
NORTHAMERICA-NORTHEAST2 Toronto icono de hoja Bajo CO2
US-CENTRAL1 Iowa icono de hoja Bajo CO2
US-EAST1 Carolina del Sur
US-EAST4 Norte de Virginia
US-EAST5 Columbus
US-SOUTH1 Dallas
US-WEST1 Oregón icono de hoja Bajo CO2
US-WEST2 Los Ángeles
US-WEST3 Salt Lake City
US-WEST4 Las Vegas
América del Sur
SOUTHAMERICA-EAST1 São Paulo icono de hoja Bajo CO2
SOUTHAMERICA-WEST1 Santiago
Europa
EUROPE-CENTRAL2 Varsovia
EUROPE-NORTH1 Finlandia icono de hoja Bajo CO2
EUROPE-SOUTHWEST1 Madrid icono de hoja Bajo CO2
EUROPE-WEST1 Bélgica icono de hoja Bajo CO2
EUROPE-WEST2 Londres
EUROPE-WEST3 Fráncfort
EUROPE-WEST4 Países Bajos
EUROPE-WEST6 Zúrich icono de hoja Bajo CO2
EUROPE-WEST8 Milán
EUROPE-WEST9 París icono de hoja Bajo CO2
Asia
ASIA-EAST1 Taiwán
ASIA-EAST2 Hong Kong
ASIA-NORTHEAST1 Tokio
ASIA-NORTHEAST2 Osaka
ASIA-NORTHEAST3 Seúl
ASIA-SOUTH1 Mumbai
ASIA-SOUTH2 Delhi
ASIA-SOUTHEAST1 Singapur
Indonesia
ASIA-SOUTHEAST2 Yakarta
Australia
AUSTRALIA-SOUTHEAST1 Sídney
AUSTRALIA-SOUTHEAST2 Melbourne

También me parece tonto tener que configurar estas opciones en la configuración de archivos. No usé S3 para subir archivos, solo lo uso para la copia de seguridad. Se requiere tener un bucket diferente para cargas y copias de seguridad, pero solo hay un lugar para configurar la región, que es en la configuración de archivos.

Espero que esto ahorre tiempo a alguien más al descifrar esto.

PD: Lo depuré usando https://discourse.example.com/logs/

Error al listar copias de seguridad de S3: La restricción de ubicación especificada no es válida. –\u003e Problema de región

Error al listar copias de seguridad de S3: Acceso denegado. –\u003e Propietario del objeto heredado de almacenamiento en lugar de Propietario del bucket heredado de almacenamiento

1 me gusta

Si lo configuras usando las variables de entorno como se describe en el OP, y estableces DISCOURSE_S3_ENDPOINT como se recomienda, DISCOURSE_S3_REGION se ignora, lo que hace que esto no sea un problema.

2 Me gusta

Gracias,
El caso es que uso la instalación de un clic de la VM de Bitnami del Google Cloud Marketplace.
Probablemente sea posible personalizar las variables de entorno, pero no es sencillo.
Establecer el endpoint en la interfaz de usuario no ignora la región.

Gracias de todos modos.

¡Muchas gracias!
De hecho, olvidé agregar el fragmento.

Desafortunadamente, obtengo el siguiente error:

Aws::S3::Errors::InvalidArgument: Argumento inválido.

Eso es muy consistente con el error que obtuve al usar la interfaz web, pero no hay mucho con lo que trabajar para resolver el problema…

Encontré este hilo que sugiere que podría haber una incompatibilidad con Google Storage en comparación con Amazon S3.

¿Podría esto estar roto para Google Storage?

Pila completa al ejecutar la tarea manualmente:

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: Argumento inválido.
/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/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

PD: No estoy considerando cambiar el bucket, pero me pregunto qué pasaría con las imágenes previamente cargadas en el disco de la VM.

EDITAR (RESUELTO):
@gerhard @Falco
Encontré cuál era el problema al habilitar el http_wire_trace.
La respuesta de argumento inválido de googleapis lo explica:
No se puede insertar ACL heredada para un objeto cuando el acceso uniforme a nivel de bucket está habilitado. Lea más en Uniform bucket-level access  |  Cloud Storage  |  Google Cloud

Habilité la ACL detallada en el bucket en lugar de la ACL uniforme porque la cabecera establecida durante la carga especifica que es pública. (Tenía una ACL uniforme y configuré todo el bucket como público).

No tengo derecho a actualizar la OP, pero creo que debería mencionar que para que los buckets de Google funcionen, la cuenta de servicio necesita el rol Propietario heredado de bucket de almacenamiento en el bucket de copia de seguridad y el bucket de carga necesita usar la ACL detallada.

Espero que esto ahorre tiempo a la comunidad.
Gracias de nuevo a @Falco @pfaffman @gerhard @tuanpembual por la ayuda aquí.

2 Me gusta