gsutil-Kopie, die "AccessDeniedException: 403 Unzureichende Berechtigung" von GCE zurückgibt


90

Ich bin über SSH bei einer GCE-Instanz angemeldet. Von dort möchte ich mit Hilfe eines Dienstkontos auf den Speicher zugreifen:

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

Ich habe zuerst sichergestellt, dass dieses Dienstkonto in den Berechtigungen des Projekts, in dem ich arbeite, als "Kann bearbeiten" gekennzeichnet ist. Außerdem habe ich ihm die Schreib-ACL für den Bucket gegeben, in den er eine Datei kopieren soll:

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

Aber dann schlägt der folgende Befehl fehl:

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

(Ich habe auch sichergestellt, dass "logs" unter "mybucket" erstellt wird).

Die Fehlermeldung, die ich erhalte, lautet:

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

Was vermisse ich?


7
Wurde die GCE-VM mit voller Kontrolle oder Lese- / Schreib-GCS-Bereich erstellt?
Jterrace

1
Vielen Dank für den Hinweis. Diese Option war mir in der Tat nicht bekannt. Ich habe die Instanz mit aktivierter Option neu erstellt und es hat funktioniert. Wenn Sie vorschlagen könnten, die Flagge als Antwort einzuschalten, würde ich sie gerne markieren.
Christophe

Antworten:


130

Eine andere Sache, nach der Sie suchen müssen, ist sicherzustellen, dass Sie beim Erstellen der GCE-VM die entsprechenden Bereiche eingerichtet haben. Selbst wenn an eine VM ein Dienstkonto angehängt ist, müssen ihr Devstorage-Bereiche zugewiesen werden, um auf GCS zugreifen zu können.

Zum Beispiel, wenn Sie Ihre VM mit erstellt haben devstorage.read_only Gültigkeitsbereich erstellt haben, schlägt der Versuch, in einen Bucket zu schreiben, fehl, selbst wenn Ihr Dienstkonto über die Berechtigung zum Schreiben in den Bucket verfügt. Du würdest devstorage.full_controloder brauchen devstorage.read_write.

Siehe den Abschnitt über Informationen finden Vorbereiten einer Instanz für die Verwendung von Dienstkonten .

Hinweis: Das Standard-Rechendienstdienstkonto hat nur sehr begrenzte Bereiche (einschließlich schreibgeschützter GCS). Dies erfolgt, weil das Standarddienstkonto über IAM-Berechtigungen für den Projekteditor verfügt. Wenn Sie ein Benutzerservicekonto verwenden, ist dies normalerweise kein Problem, da vom Benutzer erstellte Dienstkonten standardmäßig den gesamten Bereichszugriff erhalten.

Nach dem Hinzufügen der erforderlichen Bereiche zur VM werden gsutilmöglicherweise weiterhin zwischengespeicherte Anmeldeinformationen verwendet, die nicht über die neuen Bereiche verfügen. Löschen Sie, ~/.gsutilbevor Sie die Befehle gsutil erneut versuchen. (Vielen Dank an @mndrix für den Hinweis in den Kommentaren.)


1
Ich habe meine Instanz mit den Berechtigungen neu erstellt und jetzt funktioniert alles. Danke
Syclone

33
Ab sofort können Sie die Bereiche bearbeiten. Stoppen Sie den Computer - bearbeiten Sie ihn - und ändern Sie dann die Cloud-API-Zugriffsbereiche. Ich glaube, das ist erst seit ungefähr einem Monat verfügbar.
Warren

143
Nach dem Hinzufügen der erforderlichen Bereiche zur VM werden gsutilmöglicherweise weiterhin zwischengespeicherte Anmeldeinformationen verwendet, die nicht über die neuen Bereiche verfügen. Löschen Sie ~ / .gsutil, bevor Sie die gsutilBefehle erneut versuchen .
Mndrix

2
Vielen Dank mndrix!
Guillermo

2
@ Mndrix rettet den Tag
Ben Guild

50

Sie müssen sich mit einem Konto anmelden, das über die für dieses Projekt erforderlichen Berechtigungen verfügt:

gcloud auth login

1
Vergessen Sie nicht, die Ausgabe zu erstellen, gcloud auth revoke <email-account>wenn Sie fertig sind.
ssasa

50

gsutil config -b

Surfen Sie dann zu der angegebenen URL. [KLICKEN Zulassen]

Kopieren Sie dann den Bestätigungscode und fügen Sie ihn in das Terminal ein.


Beachten Sie dies nicht , wenn Sie laufen funktioniert gsutilaus ssh.
Bfontaine

3
Es "funktioniert nicht", sofern Sie Ihren Browser nicht öffnen. Stattdessen wird eine URL bereitgestellt, die Sie manuell kopieren und einfügen können.
BuvinJ

6
Dies funktioniert auch gut für alle anderen, wenn Sie die fallen lassen-b . Dadurch wird kein Browser geöffnet, sondern lediglich eine URL ausgespuckt, die außerhalb der Shell geöffnet werden kann.
Oligofren

8

Ich habe eine Antwort auf diese Frage geschrieben, da ich keine Kommentare posten kann:

Dieser Fehler kann auch auftreten, wenn Sie den gsutilBefehl sudoin einigen Fällen mit einem Präfix ausführen.


3
Dies ist wirklich ein Kommentar, keine Antwort. Mit etwas mehr Wiederholungen können Sie Kommentare posten .
Lece

1
Ich habe die Antwort (+1) gegeben, damit @TheLoneDeranger dem Privileg "Kommentar kommentieren" näher kommt.
Rann Lifshitz

8
  1. Stoppen Sie die VM
  2. got -> VM-Instanzdetails.
  3. Wählen Sie unter "Zugriffsbereiche für Cloud-APIs" die Option "Vollständigen Zugriff auf alle Cloud-APIs zulassen" und klicken Sie dann auf "Speichern".
  4. Starten Sie die VM neu und löschen Sie ~ / .gsutil.



2

Also habe ich eine Reihe von Dingen ausprobiert, um vom GCS-Bucket auf meine VM zu kopieren. Hoffe dieser Beitrag hilft jemandem.

Über SSHed-Verbindung: Geben Sie hier die Bildbeschreibung ein

und folgendes diesem Skript:

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

Habe diesen Fehler bekommen:

AccessDeniedException: 403 Zugriff nicht konfiguriert. Rufen Sie für Ihr Projekt die Google Cloud Platform Console ( https://cloud.google.com/console#/project ) auf, wählen Sie APIs und Auth aus und aktivieren Sie die JSON-API für Google Cloud Storage.

Was behoben wurde, war der folgende Abschnitt "Aktivieren der API" in diesem Link - https://cloud.google.com/storage/docs/json_api/

Geben Sie hier die Bildbeschreibung ein

Sobald ich die API aktiviert habe, habe ich mich im SSHed-Fenster über authentifiziert

gcloud auth login

Nach dem Authentifizierungsvorgang konnte ich endlich von Google Storage Bucket auf meine VM herunterladen.

PS

Ich habe darauf geachtet:

  1. Stellen Sie sicher, dass gsutils auf meiner VM-Instanz installiert ist.
  2. Gehen Sie zu meinem Bucket, wechseln Sie zur Registerkarte Berechtigungen, fügen Sie die gewünschten Dienstkonten hinzu und legen Sie die Berechtigung / Rolle für den Speicheradministrator fest. Geben Sie hier die Bildbeschreibung ein

    3.Stellen Sie sicher, dass meine VM über die richtigen Cloud-API-Zugriffsbereiche verfügt: Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


1

Aus den Dokumenten: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

Sie müssen zuerst die Instanz stoppen -> zur Bearbeitungsseite gehen -> zu "Cloud-API-Zugriffsbereiche" gehen und "Speicher-Vollzugriff oder Lesen / Schreiben oder was auch immer Sie benötigen" auswählen.

Ändern des Dienstkontos und der Zugriffsbereiche für eine Instanz Wenn Sie die VM als andere Identität ausführen möchten oder feststellen, dass die Instanz einen anderen Satz von Bereichen benötigt, um die erforderlichen APIs aufzurufen, können Sie das Dienstkonto und die Zugriffsbereiche ändern einer vorhandenen Instanz. Sie können beispielsweise die Zugriffsbereiche ändern, um Zugriff auf eine neue API zu gewähren, oder eine Instanz so ändern, dass sie als von Ihnen erstelltes Dienstkonto anstelle des Compute Engine-Standarddienstkontos ausgeführt wird.

Um das Dienstkonto und die Zugriffsbereiche einer Instanz zu ändern, muss die Instanz vorübergehend gestoppt werden. Lesen Sie zum Stoppen Ihrer Instanz die Dokumentation zum Stoppen einer Instanz. Denken Sie nach dem Ändern des Dienstkontos oder der Zugriffsbereiche daran, die Instanz neu zu starten. Verwenden Sie eine der folgenden Methoden, um das Dienstkonto zu ändern oder auf die Bereiche der gestoppten Instanz zuzugreifen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.