Copie gsutil renvoyant «AccessDeniedException: 403 Autorisation insuffisante» de GCE


90

Je suis connecté à une instance GCE via SSH. De là, je voudrais accéder au stockage à l'aide d'un compte de service:

GCE> gcloud auth list
Credentialed accounts:
 - 1234567890-compute@developer.gserviceaccount.com (active)

Je me suis d'abord assuré que ce compte de service était marqué "Peut modifier" dans les autorisations du projet dans lequel je travaille. Je me suis également assuré de lui donner la LCA d'écriture sur le bucket Je voudrais qu'il copie un fichier:

local> gsutil acl ch -u 1234567890-compute@developer.gserviceaccount.com:W gs://mybucket

Mais alors la commande suivante échoue:

GCE> gsutil cp test.txt gs://mybucket/logs

(Je me suis également assuré que "logs" est créé sous "mybucket").

Le message d'erreur que je reçois est:

Copying file://test.txt [Content-Type=text/plain]...
AccessDeniedException: 403 Insufficient Permission               0 B  

Qu'est-ce que je rate?


7
La machine virtuelle GCE a-t-elle été créée avec un contrôle total ou une portée GCS en lecture / écriture?
jterrace

1
Merci d'avoir fait remarquer cela. Je n'étais en effet pas au courant de cette option. J'ai recréé l'instance avec l'option activée et cela a fonctionné. Si vous pouviez suggérer d'activer le drapeau comme réponse, je le signalerais volontiers.
Christophe

Réponses:


131

Une autre chose à rechercher est de vous assurer de configurer les étendues appropriées lors de la création de la machine virtuelle GCE. Même si une machine virtuelle est associée à un compte de service, des étendues devstorage doivent lui être attribuées afin d'accéder à GCS.

Par exemple, si vous avez créé votre VM avec une devstorage.read_onlyétendue, la tentative d'écriture dans un compartiment échouerait, même si votre compte de service est autorisé à écrire dans le compartiment. Vous auriez besoin de devstorage.full_controlou devstorage.read_write.

Consultez la section Préparation d'une instance pour utiliser des comptes de service pour plus de détails.

Remarque: le compte de service de calcul par défaut a des portées très limitées (y compris la lecture seule de GCS). Cela est fait car le compte de service par défaut dispose des autorisations IAM de l'éditeur de projet. Si vous utilisez un compte de service utilisateur, cela ne pose généralement pas de problème car les comptes de service créés par l'utilisateur obtiennent par défaut tous les accès à l'étendue.

Après avoir ajouté les étendues nécessaires à la machine virtuelle, gsutilvous pouvez toujours utiliser des informations d'identification mises en cache qui n'ont pas les nouvelles étendues. Supprimez ~/.gsutilavant de réessayer les commandes gsutil. (Merci à @mndrix pour l'avoir signalé dans les commentaires.)


1
J'ai recréé mon instance avec les autorisations et tout fonctionne maintenant. Merci
Syclone

33
À partir de maintenant, vous pouvez modifier les étendues. Arrêtez la machine, modifiez-la, puis modifiez les étendues d'accès à l'API Cloud. Je pense que cela n'est disponible que depuis environ un mois maintenant.
Warren

143
Après avoir ajouté les étendues nécessaires à la machine virtuelle, gsutilvous pouvez toujours utiliser des informations d'identification mises en cache qui n'ont pas les nouvelles étendues. Supprimez ~ / .gsutil avant de réessayer les gsutilcommandes.
mndrix

2
Merci beaucoup mndrix!
Guillermo

2
@mndrix sauve la mise
Ben Guild

50

Vous devez vous connecter avec un compte disposant des autorisations dont vous avez besoin pour ce projet:

gcloud auth login

1
N'oubliez pas d'émettre une gcloud auth revoke <email-account>fois que vous avez terminé.
ssasa

50

gsutil config -b

Puis naviguez jusqu'à l'URL qu'il fournit, [CLIQUEZ Autoriser]

Copiez ensuite le code de vérification et collez-le dans le terminal.


Notez que cela ne fonctionne pas si vous exécutez à gsutilpartir de ssh.
bfontaine

3
Cela "ne fonctionne pas" dans la mesure où vous n'ouvrez pas votre navigateur. Au lieu de cela, il fournit une URL que vous pouvez copier et coller manuellement.
BuvinJ

6
Cela fonctionne également très bien pour tout le monde si vous supprimez le fichier-b . Cela n'ouvrira pas de navigateur, mais crachera simplement une URL qui peut être ouverte en dehors du shell.
oligofren

8

J'ai écrit une réponse à cette question car je ne peux pas poster de commentaires:

Cette erreur peut également se produire si vous exécutez la gsutilcommande avec un sudopréfixe dans certains cas.


3
C'est vraiment un commentaire, pas une réponse. Avec un peu plus de rep, vous pourrez poster des commentaires .
Lece

1
J'ai donné la réponse (+1) pour que @TheLoneDeranger soit plus proche en réputation du privilège «Publier un commentaire».
Rann Lifshitz

8
  1. Arrêter la VM
  2. got -> Détails de l'instance de VM.
  3. dans "Champs d'application d'accès aux API Cloud", sélectionnez "Autoriser l'accès complet à toutes les API Cloud", puis cliquez sur "Enregistrer".
  4. redémarrez la VM et supprimez ~ / .gsutil.



2

J'ai donc essayé un tas de choses en essayant de copier du bucket GCS vers ma VM. J'espère que ce message aide quelqu'un.

Par connexion SSHed: entrez la description de l'image ici

et en suivant ce script:

sudo gsutil cp gs://[BUCKET_NAME]/[OBJECT_NAME] [OBJECT_DESTINATION_IN_LOCAL]

Vous avez cette erreur:

AccessDeniedException: accès 403 non configuré. Accédez à la console Google Cloud Platform ( https://cloud.google.com/console#/project ) pour votre projet, sélectionnez API et authentification et activez l'API JSON Google Cloud Storage.

Ce qui a résolu ce problème était la suite de la section «Activation de l'API» mentionnée dans ce lien - https://cloud.google.com/storage/docs/json_api/

entrez la description de l'image ici

Une fois que j'ai activé l'API, je me suis authentifié dans la fenêtre SSHed via

gcloud auth login

Suite à la procédure d'authentification, j'ai finalement pu télécharger depuis Google Storage Bucket vers ma VM.

PS

Je me suis assuré de:

  1. Assurez-vous que gsutils est installé sur mon instance de VM.
  2. Accédez à mon compartiment, accédez à l'onglet autorisations, ajoutez les comptes de service souhaités et définissez l'autorisation / le rôle d'administrateur de stockage. entrez la description de l'image ici

    3.Assurez-vous que ma VM disposait d'étendues d'accès à l'API Cloud appropriées: entrez la description de l'image ici

entrez la description de l'image ici


1

À partir de la documentation: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

Vous devez d'abord arrêter l'instance -> aller à la page de modification -> aller à "Portées d'accès à l'API Cloud" et choisir "Accès complet au stockage ou lecture / écriture ou tout ce dont vous avez besoin"

Modification du compte de service et des étendues d'accès pour une instance Si vous souhaitez exécuter la VM sous une identité différente, ou si vous déterminez que l'instance a besoin d'un ensemble d'étendues différent pour appeler les API requises, vous pouvez modifier le compte de service et les étendues d'accès d'une instance existante. Par exemple, vous pouvez modifier les portées d'accès pour accorder l'accès à une nouvelle API ou modifier une instance pour qu'elle s'exécute en tant que compte de service que vous avez créé, au lieu du compte de service par défaut Compute Engine.

Pour modifier le compte de service et les étendues d'accès d'une instance, l'instance doit être temporairement arrêtée. Pour arrêter votre instance, lisez la documentation sur l'arrêt d'une instance. Après avoir modifié le compte de service ou les étendues d'accès, n'oubliez pas de redémarrer l'instance. Utilisez l'une des méthodes suivantes pour modifier le compte de service ou accéder aux étendues de l'instance arrêtée.


0

Modifiez les autorisations du bucket.

Ajoutez un utilisateur pour "Tous les utilisateurs" et accordez un accès "Administrateur de stockage".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.