La copia de gsutil devuelve "AccessDeniedException: 403 Insufficient Permission" de GCE

90

He iniciado sesión en una instancia de GCE a través de SSH. Desde allí, me gustaría acceder al almacenamiento con la ayuda de una cuenta de servicio:

GCE> gcloud auth list
Credentialed accounts:
 - [email protected] (active)

Primero me aseguré de que esta cuenta de servicio esté marcada como "Puede editar" en los permisos del proyecto en el que estoy trabajando. También me aseguré de darle la ACL de escritura en el depósito. Me gustaría que copiara un archivo:

local> gsutil acl ch -u [email protected]:W gs://mybucket

Pero luego falla el siguiente comando:

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

(También me aseguré de que "registros" se crearan en "mybucket").

El mensaje de error que recibo es:

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

¿Qué me estoy perdiendo?

Christophe
fuente
7
¿Se creó la máquina virtual de GCE con control total o alcance GCS de lectura / escritura?
jterrace
1
Gracias por señalar eso. De hecho, no conocía esa opción. Recreé la instancia con la opción habilitada y funcionó. Si pudiera sugerir encender la bandera como respuesta, felizmente la marcaría.
Christophe

Respuestas:

131

Otra cosa que debe buscar es asegurarse de configurar los alcances adecuados al crear la máquina virtual de GCE. Incluso si una máquina virtual tiene una cuenta de servicio adjunta, se le deben asignar ámbitos de almacenamiento para poder acceder a GCS.

Por ejemplo, si hubiera creado su VM con devstorage.read_onlyalcance, intentar escribir en un depósito fallaría, incluso si su cuenta de servicio tiene permiso para escribir en el depósito. Necesitarías devstorage.full_controlo devstorage.read_write.

Consulte la sección sobre Preparación de una instancia para usar cuentas de servicio para obtener más detalles.

Nota: la cuenta de servicio informática predeterminada tiene alcances muy limitados (incluido tener solo lectura para GCS). Esto se hace porque la cuenta de servicio predeterminada tiene permisos de IAM de Editor de proyectos. Si utiliza cualquier cuenta de servicio de usuario, esto no suele ser un problema, ya que las cuentas de servicio creadas por el usuario obtienen todos los accesos al alcance de forma predeterminada.

Después de agregar los ámbitos necesarios a la máquina virtual, es gsutilposible que todavía se utilicen credenciales almacenadas en caché que no tienen los nuevos ámbitos. Elimina ~/.gsutilantes de volver a intentar los comandos de gsutil. (Gracias a @mndrix por señalar esto en los comentarios).

terraza
fuente
1
Recreé mi instancia con los permisos y todo funciona ahora. Gracias
Syclone
33
A partir de ahora, puede editar los ámbitos. Detenga la máquina, edite y luego cambie los alcances de acceso a la API de la nube. Creo que esto solo ha estado disponible durante aproximadamente un mes.
Warren
143
Después de agregar los ámbitos necesarios a la máquina virtual, es gsutilposible que todavía se utilicen credenciales almacenadas en caché que no tienen los nuevos ámbitos. Elimine ~ / .gsutil antes de volver a intentar los gsutilcomandos.
mndrix
2
¡Muchas gracias mndrix!
Guillermo
2
@mndrix salva el día
Ben Guild
50

Debes iniciar sesión con una cuenta que tenga los permisos que necesitas para ese proyecto:

gcloud auth login
Javier Giovannini
fuente
1
No olvide emitir una gcloud auth revoke <email-account>vez que haya terminado.
ssasa
50

gsutil config -b

Luego, navegue hasta la URL que proporciona, [HAGA CLIC en Permitir]

Luego copie el código de verificación y péguelo en la terminal.

Dr. Tyrell
fuente
Tenga en cuenta que esto no funciona si se ejecuta gsutildesde ssh.
bfontaine
3
"No funciona" en la medida en que no abra su navegador. En su lugar, proporciona una URL para que la copie y pegue manualmente.
BuvinJ
6
Esto también funciona bien para todos los demás si suelta el-b . Eso no abrirá un navegador, sino que simplemente escupirá una URL que se puede abrir fuera del shell.
oligofren
8

He escrito una respuesta a esta pregunta ya que no puedo publicar comentarios:

Este error también puede ocurrir si está ejecutando el gsutilcomando con un sudoprefijo en algunos casos.

TheLoneDeranger
fuente
3
Esto es realmente un comentario, no una respuesta. Con un poco más de reputación, podrá publicar comentarios .
Lece
1
He dado la respuesta (+1) para que @TheLoneDeranger tenga una reputación más cercana al privilegio de 'Publicar comentario'.
Rann Lifshitz
8
  1. Detener VM
  2. got -> Detalles de la instancia de VM.
  3. en "Ámbitos de acceso a la API de la nube", seleccione "Permitir acceso completo a todas las API de la nube" y, a continuación, haga clic en "guardar".
  4. reinicie la máquina virtual y elimine ~ / .gsutil.

Omar Bara
fuente
2

Así que probé un montón de cosas tratando de copiar del depósito de GCS a mi VM. Espero que esta publicación ayude a alguien.

A través de una conexión SSHed: ingrese la descripción de la imagen aquí

y siguiendo este script:

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

Tengo este error:

AccessDeniedException: 403 Acceso no configurado. Vaya a Google Cloud Platform Console ( https://cloud.google.com/console#/project ) para su proyecto, seleccione API y autenticación y habilite la API JSON de Google Cloud Storage.

Lo que solucionó esto fue la sección "Activación de la API" mencionada en este enlace: https://cloud.google.com/storage/docs/json_api/

ingrese la descripción de la imagen aquí

Una vez que activé la API, me autentiqué en la ventana SSHed a través de

gcloud auth login

Después del procedimiento de autenticación, finalmente pude descargar de Google Storage Bucket a mi VM.

PD

Me aseguré de:

  1. Asegúrese de que gsutils esté instalado en mi instancia de VM.
  2. Vaya a mi depósito, vaya a la pestaña de permisos y agregue las cuentas de servicio deseadas y configure el permiso / rol de administrador de almacenamiento. ingrese la descripción de la imagen aquí

    3.Asegúrese de que mi VM tenga los alcances adecuados de acceso a la API de la nube: ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Yev Guyduy
fuente
1

De los documentos: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

Primero debe detener la instancia -> ir a la página de edición -> ir a "Ámbitos de acceso a la API en la nube" y elegir "acceso completo al almacenamiento o lectura / escritura o lo que sea que necesite"

Cambiar la cuenta de servicio y los alcances de acceso para una instancia Si desea ejecutar la VM con una identidad diferente, o si determina que la instancia necesita un conjunto diferente de alcances para llamar a las API requeridas, puede cambiar la cuenta de servicio y los alcances de acceso de una instancia existente. Por ejemplo, puedes cambiar los alcances de acceso para otorgar acceso a una nueva API o cambiar una instancia para que se ejecute como una cuenta de servicio que creaste, en lugar de la cuenta de servicio predeterminada de Compute Engine.

Para cambiar la cuenta de servicio de una instancia y los alcances de acceso, la instancia debe detenerse temporalmente. Para detener su instancia, lea la documentación para detener una instancia. Después de cambiar la cuenta de servicio o los alcances de acceso, recuerde reiniciar la instancia. Utilice uno de los siguientes métodos para cambiar la cuenta de servicio o acceder a los ámbitos de la instancia detenida.

Adelin
fuente
0

Cambie los permisos de bucket.

Agregue un usuario para "Todos los usuarios" y otorgue acceso a "Administrador de almacenamiento".

Pratik Waware
fuente