gsutil copy zwraca „AccessDeniedException: 403 Insufficient Permission” z GCE


90

Jestem zalogowany do instancji GCE przez SSH. Stamtąd chciałbym uzyskać dostęp do Magazynu za pomocą Konta Serwisowego:

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

Najpierw upewniłem się, że to konto usługi jest oznaczone jako „Może edytować” w uprawnieniach projektu, w którym pracuję. Upewniłem się również, że dałem mu listę ACL zapisu w zasobniku, który chciałbym, aby skopiował plik:

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

Ale wtedy następujące polecenie kończy się niepowodzeniem:

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

(Upewniłem się również, że „logi” są tworzone w „mybucket”).

Otrzymuję komunikat o błędzie:

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

czego mi brakuje?


7
Czy maszyna wirtualna GCE została utworzona z pełną kontrolą lub zakresem GCS do odczytu / zapisu?
jterrace

1
Dziękuję za zwrócenie uwagi. W istocie nie byłem świadomy tej opcji. Ponownie utworzyłem instancję z włączoną opcją i zadziałało. Gdybyś mógł zasugerować włączenie flagi jako odpowiedź, z radością bym ją oflagował.
Christophe

Odpowiedzi:


134

Inną rzeczą, na którą należy zwrócić uwagę, jest skonfigurowanie odpowiednich zakresów podczas tworzenia maszyny wirtualnej GCE. Nawet jeśli maszyna wirtualna ma dołączone konto usługi, należy przypisać jej zakresy devstorage, aby uzyskać dostęp do GCS.

Na przykład, jeśli utworzyłeś maszynę wirtualną z devstorage.read_onlyzakresem, próba zapisu do zasobnika zakończy się niepowodzeniem, nawet jeśli Twoje konto usługi ma uprawnienia do zapisu w zasobniku. Potrzebowałbyś devstorage.full_controllub devstorage.read_write.

Szczegółowe informacje można znaleźć w sekcji Przygotowanie instancji do korzystania z kont usług .

Uwaga: domyślne konto usługi obliczeniowej ma bardzo ograniczone zakresy (w tym tylko do odczytu do GCS). Dzieje się tak, ponieważ domyślne konto usługi ma uprawnienia edytora projektów. Jeśli używasz dowolnego konta usługi użytkownika, zwykle nie stanowi to problemu, ponieważ konta usługi utworzone przez użytkowników domyślnie uzyskują dostęp do całego zakresu.

Po dodaniu niezbędnych zakresów do maszyny wirtualnej gsutilmoże nadal używać buforowanych poświadczeń, które nie mają nowych zakresów. Usuń ~/.gsutilprzed ponowną próbą wykonania poleceń gsutil. (Dzięki @mndrix za wskazanie tego w komentarzach).


1
Odtworzyłem instancję z uprawnieniami i wszystko działa teraz. Dzięki
Syclone

33
Od teraz możesz edytować zakresy. Zatrzymaj maszynę - edytuj - a następnie zmień zakresy dostępu Cloud API. Myślę, że jest to dostępne dopiero od około miesiąca.
Warren

146
Po dodaniu niezbędnych zakresów do maszyny wirtualnej gsutilmoże nadal używać buforowanych poświadczeń, które nie mają nowych zakresów. Usuń ~ / .gsutil przed ponownym wykonaniem gsutilpoleceń.
mndrix,

2
Dziękuję bardzo mndrix!
Guillermo

2
@mndrix ratuje dzień
Ben Guild

51

Musisz zalogować się na konto, które ma uprawnienia potrzebne do tego projektu:

gcloud auth login

1
Nie zapomnij wydać gcloud auth revoke <email-account>po zakończeniu.
ssasa

51

gsutil config -b

Następnie przejdź do podanego adresu URL, [KLIKNIJ Zezwalaj]

Następnie skopiuj kod weryfikacyjny i wklej do terminala.


Zauważ, że to nie zadziała, jeśli uciekniesz gsutilz ssh.
bfontaine,

3
To „nie działa” o ile nie otwiera przeglądarki. Zamiast tego zapewnia adres URL do ręcznego kopiowania i wklejania.
BuvinJ,

6
Działa to również dobrze dla wszystkich innych, jeśli upuścisz-b . To nie otworzy przeglądarki, ale po prostu wypluje adres URL, który można otworzyć poza powłoką.
oligofren

9
  1. Zatrzymaj maszynę wirtualną
  2. got -> Szczegóły instancji maszyny wirtualnej.
  3. w „Zakresach dostępu Cloud API” wybierz „Zezwalaj na pełny dostęp do wszystkich Cloud API”, a następnie kliknij „Zapisz”.
  4. uruchom ponownie maszynę wirtualną i usuń ~ / .gsutil.


8

Napisałem odpowiedź na to pytanie, ponieważ nie mogę komentować:

Ten błąd może również wystąpić, jeśli w niektórych przypadkach uruchamiasz gsutilpolecenie z sudoprefiksem.


3
To naprawdę jest komentarz, a nie odpowiedź. Z nieco większym przedstawicielem będziesz mógł publikować komentarze .
Lece

1
Podałem odpowiedź (+1), aby reputacja @TheLoneDeranger była bliższa przywilejowi „Opublikuj komentarz”.
Rann Lifshitz


2

Próbowałem więc wielu rzeczy, próbując skopiować z zasobnika GCS na moją maszynę wirtualną. Mam nadzieję, że ten post komuś pomoże.

Przez połączenie SSHed: wprowadź opis obrazu tutaj

i postępując zgodnie z tym skryptem:

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

Mam ten błąd:

AccessDeniedException: 403 Nie skonfigurowano dostępu. Przejdź do konsoli Google Cloud Platform ( https://cloud.google.com/console#/project ) dla swojego projektu, wybierz interfejsy API i uwierzytelnianie, a następnie włącz Google Cloud Storage JSON API.

Naprawiono ten problem po sekcji „Aktywacja interfejsu API” wymienionej w tym linku - https://cloud.google.com/storage/docs/json_api/

wprowadź opis obrazu tutaj

Po aktywowaniu API uwierzytelniłem się w oknie SSHed za pośrednictwem

gcloud auth login

Po procedurze uwierzytelniania w końcu udało mi się pobrać z zasobnika pamięci masowej Google na moją maszynę wirtualną.

PS

Upewniłem się, że:

  1. Upewnij się, że gsutils jest zainstalowany na mojej instancji maszyny wirtualnej.
  2. Przejdź do mojego zasobnika, przejdź do karty uprawnień i dodaj żądane konta usług oraz ustaw uprawnienia / rolę administratora magazynu. wprowadź opis obrazu tutaj

    3.Upewnij się, że moja maszyna wirtualna ma odpowiednie zakresy dostępu Cloud API: wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj


1

Z dokumentów: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

Najpierw musisz zatrzymać instancję -> przejdź do strony edycji -> przejdź do „Zakresów dostępu do Cloud API” i wybierz „pełny dostęp do pamięci masowej lub odczyt / zapis lub cokolwiek potrzebujesz”

Zmiana konta usługi i zakresów dostępu dla instancji Jeśli chcesz uruchomić maszynę wirtualną jako inną tożsamość lub stwierdzisz, że instancja potrzebuje innego zestawu zakresów do wywołania wymaganych interfejsów API, możesz zmienić konto usługi i zakresy dostępu istniejącej instancji. Na przykład możesz zmienić zakresy dostępu, aby przyznać dostęp do nowego interfejsu API, lub zmienić instancję, tak aby działała jako utworzone przez Ciebie konto usługi, zamiast domyślnego konta usługi Compute Engine.

Aby zmienić konto usługi instancji i zakresy dostępu, należy tymczasowo zatrzymać instancję. Aby zatrzymać instancję, przeczytaj dokumentację Zatrzymywanie instancji. Po zmianie konta usługi lub zakresów dostępu pamiętaj o ponownym uruchomieniu instancji. Użyj jednej z następujących metod, aby zmienić konto usługi lub uzyskać dostęp do zakresów zatrzymanego wystąpienia.


0

Zmień uprawnienia zasobnika.

Dodaj użytkownika dla „Wszystkich użytkowników” i przyznaj uprawnienia „Administrator pamięci”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.