Conseils sur Google Cloud S3

@Pfaffman a extrait ces informations sur Google Cloud, qui ne correspondent pas nécessairement à la publication initiale, mais qui devraient être conservées pour ceux qui ont des problèmes avec Google Cloud.


Bonjour,

Merci pour l’astuce, mais cela n’a pas fonctionné pour moi jusqu’à ce que je change le rôle de « Propriétaire d’objet hérité de stockage » à « Propriétaire de compartiment hérité de stockage ».

C’est spécifiquement écrit dans l’info-bulle lors de la sélection du rôle :

Propriétaire d’objet hérité de stockage

Accès en lecture/écriture aux objets existants sans liste.

Propriétaire de compartiment hérité de stockage

Accès en lecture et écriture aux compartiments existants avec liste d’objets/création/suppression.

Maintenant, cela fonctionne, y compris la liste, ce qui permet la sauvegarde automatique ! Hourra !!

3 « J'aime »

À propos de l’utilisation de S3 sur les buckets Google :

Comme je l’ai mentionné ici :
https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916/334
Je peux confirmer que la liste fonctionne et que la sauvegarde automatique fonctionne en utilisant un compte de service avec le rôle “Storage Legacy Bucket Owner” sur le bucket.

Soyez conscient que l’utilisation de S3 pour les buckets Google implique de ne sélectionner qu’une région dont le nom est identique sur Amazon et sur Google.
Je trouve idiot qu’il faille choisir dans un menu déroulant avec validation côté serveur (j’ai essayé de manipuler l’API sans succès) au lieu de pouvoir le taper.

Cela implique que vous ne pouvez pas utiliser un bucket en Europe par exemple, car le préfixe sur Amazon est EU et EUROPE sur Google, ni utiliser le multi-région.

AWS :

Nom de la région Code
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 :

Continent Nom de la région Description de la région
Amérique du Nord
NORTHAMERICA-NORTHEAST1 Montréal icône de feuille Faible émission de CO2
NORTHAMERICA-NORTHEAST2 Toronto icône de feuille Faible émission de CO2
US-CENTRAL1 Iowa icône de feuille Faible émission de CO2
US-EAST1 Caroline du Sud
US-EAST4 Virginie du Nord
US-EAST5 Columbus
US-SOUTH1 Dallas
US-WEST1 Oregon icône de feuille Faible émission de CO2
US-WEST2 Los Angeles
US-WEST3 Salt Lake City
US-WEST4 Las Vegas
Amérique du Sud
SOUTHAMERICA-EAST1 São Paulo icône de feuille Faible émission de CO2
SOUTHAMERICA-WEST1 Santiago
Europe
EUROPE-CENTRAL2 Varsovie
EUROPE-NORTH1 Finlande icône de feuille Faible émission de CO2
EUROPE-SOUTHWEST1 Madrid icône de feuille Faible émission de CO2
EUROPE-WEST1 Belgique icône de feuille Faible émission de CO2
EUROPE-WEST2 Londres
EUROPE-WEST3 Francfort
EUROPE-WEST4 Pays-Bas
EUROPE-WEST6 Zurich icône de feuille Faible émission de CO2
EUROPE-WEST8 Milan
EUROPE-WEST9 Paris icône de feuille Faible émission de CO2
Asie
ASIA-EAST1 Taïwan
ASIA-EAST2 Hong Kong
ASIA-NORTHEAST1 Tokyo
ASIA-NORTHEAST2 Osaka
ASIA-NORTHEAST3 Séoul
ASIA-SOUTH1 Mumbai
ASIA-SOUTH2 Delhi
ASIA-SOUTHEAST1 Singapour
Indonésie
ASIA-SOUTHEAST2 Jakarta
Australie
AUSTRALIA-SOUTHEAST1 Sydney
AUSTRALIA-SOUTHEAST2 Melbourne

Je trouve également idiot de devoir définir ces options dans les paramètres des fichiers. Je n’ai pas utilisé S3 pour télécharger des fichiers, je l’utilise uniquement pour la sauvegarde. Il est nécessaire d’avoir un bucket différent pour les téléchargements et les sauvegardes, mais il n’y a qu’un seul endroit pour définir la région, qui est dans les paramètres des fichiers.

J’espère que cela fera gagner du temps à quelqu’un d’autre pour comprendre cela.

PS : J’ai débogué cela en utilisant https://discourse.example.com/logs/

Échec de la liste des sauvegardes depuis S3 : La contrainte d’emplacement spécifiée n’est pas valide. – > Problème de région

Échec de la liste des sauvegardes depuis S3 : Accès refusé. → Storage Legacy Object Owner au lieu de Storage Legacy Bucket Owner

1 « J'aime »

Si vous configurez en utilisant les variables d’environnement comme décrit dans le message initial, et que vous définissez DISCOURSE_S3_ENDPOINT comme recommandé, DISCOURSE_S3_REGION est ignoré, ce qui rend ce point non problématique.

2 « J'aime »

Merci,
Le problème est que j’utilise l’installation en un clic de la VM Bitnami depuis le Google Cloud Marketplace.
Il est probablement possible de personnaliser les variables d’environnement, mais ce n’est pas simple.
Définir le point de terminaison dans l’interface utilisateur n’ignore pas la région.

Merci quand même.

Merci beaucoup !
En effet, j’ai oublié d’ajouter le snippet.

Malheureusement, j’obtiens l’erreur suivante :

Aws::S3::Errors::InvalidArgument: Argument invalide.

C’est très cohérent avec l’erreur que j’ai obtenue en utilisant l’interface Web, mais il n’y a pas grand-chose à faire pour résoudre le problème…

J’ai trouvé ce fil de discussion qui suggère qu’il pourrait y avoir une incompatibilité avec Google Storage par rapport à Amazon S3.

Cela pourrait-il être défectueux pour Google Storage ?

Pile d’appels complète lors de l’exécution manuelle de la tâche :

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: Argument invalide.
/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 : Je n’envisage pas de changer de bucket, mais je me demande ce qu’il adviendrait des images précédemment téléchargées sur le disque de la VM.

EDIT (RÉSOLU) :
@gerhard @Falco
J’ai trouvé ce qui causait le problème en activant le http_wire_trace.
La réponse d’argument invalide de googleapis l’explique :
Impossible d’insérer un ACL hérité pour un objet lorsque l’accès au niveau du bucket est uniforme. En savoir plus sur Uniform bucket-level access  |  Cloud Storage  |  Google Cloud

J’ai activé l’ACL fine-grained sur le bucket au lieu de l’ACL uniforme car l’en-tête défini lors du téléchargement spécifie qu’il est public. (J’avais une ACL uniforme et j’ai rendu tout le bucket public)

Je n’ai pas le droit de mettre à jour le message initial, mais je pense qu’il devrait mentionner qu’afin que les buckets Google fonctionnent, le compte de service doit avoir le rôle Storage Legacy Bucket Owner sur le bucket de sauvegarde et le bucket de téléchargement doit utiliser l’ACL fine-grained.

J’espère que cela fera gagner du temps à la communauté.
Merci encore à @Falco @pfaffman @gerhard @tuanpembual pour leur aide ici.

2 « J'aime »