gsutil copy mengembalikan “AccessDeniedException: 403 Insufficient Permission” dari GCE


90

Saya masuk ke instance GCE melalui SSH. Dari sana saya ingin mengakses Penyimpanan dengan bantuan Akun Layanan:

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

Pertama-tama, saya memastikan bahwa akun Layanan ini ditandai "Dapat mengedit" pada izin proyek yang saya kerjakan. Saya juga memastikan untuk memberinya ACL Tulis di keranjang. Saya ingin dia menyalin file:

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

Tapi kemudian perintah berikut gagal:

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

(Saya juga memastikan bahwa "logs" dibuat di bawah "mybucket").

Pesan kesalahan yang saya dapatkan adalah:

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

Apa yang saya lewatkan?


7
Apakah VM GCE dibuat dengan kontrol penuh atau baca / tulis cakupan GCS?
jterrace

1
Terima kasih telah menunjukkannya. Saya memang tidak menyadari pilihan itu. Saya membuat ulang instance dengan opsi diaktifkan dan berfungsi. Jika Anda dapat menyarankan untuk menyalakan bendera sebagai jawaban, saya akan dengan senang hati menandainya.
Christophe

Jawaban:


136

Satu hal lain yang harus diperhatikan adalah memastikan Anda menyiapkan cakupan yang sesuai saat membuat VM GCE. Meskipun VM memiliki akun layanan yang terpasang, VM tersebut harus diberi cakupan devstorage untuk mengakses GCS.

Misalnya, jika Anda telah membuat VM dengan devstorage.read_onlyscope, mencoba menulis ke bucket akan gagal, meskipun akun layanan Anda memiliki izin untuk menulis ke bucket. Anda akan membutuhkan devstorage.full_controlatau devstorage.read_write.

Lihat bagian tentang Mempersiapkan instance untuk menggunakan akun layanan untuk mengetahui detailnya.

Catatan: akun layanan komputasi default memiliki cakupan yang sangat terbatas (termasuk memiliki hanya baca ke GCS). Ini dilakukan karena akun layanan default memiliki izin IAM Editor Proyek. Jika Anda menggunakan akun layanan pengguna, ini biasanya bukan masalah karena akun layanan yang dibuat pengguna mendapatkan semua akses cakupan secara default.

Setelah menambahkan cakupan yang diperlukan ke VM, gsutilmungkin masih menggunakan kredensial yang disimpan dalam cache yang tidak memiliki cakupan baru. Hapus ~/.gsutilsebelum mencoba perintah gsutil lagi. (Terima kasih kepada @mndrix karena menunjukkan hal ini di komentar.)


1
Saya membuat ulang instance saya dengan izin dan semuanya berfungsi sekarang. Terima kasih
Syclone

33
Untuk saat ini, Anda dapat mengedit cakupannya. Hentikan mesin - edit - lalu ubah cakupan akses Cloud API. Saya yakin ini hanya tersedia sekitar sebulan sekarang.
Warren

146
Setelah menambahkan cakupan yang diperlukan ke VM, gsutilmungkin masih menggunakan kredensial yang disimpan dalam cache yang tidak memiliki cakupan baru. Hapus ~ / .gsutil sebelum mencoba gsutilperintah lagi.
mndrix

2
Terima kasih banyak mndrix!
Guillermo

2
@ndrix menyelamatkan hari
Ben Guild

51

Anda harus masuk dengan akun yang memiliki izin yang Anda perlukan untuk proyek itu:

gcloud auth login

1
Jangan lupa untuk mengeluarkan gcloud auth revoke <email-account>setelah Anda selesai.
ssasa

51

gsutil config -b

Kemudian jelajahi URL yang disediakannya, [KLIK Izinkan]

Kemudian salin kode verifikasi dan tempel ke terminal.


Perhatikan ini tidak berfungsi jika Anda lari gsutildari ssh.
bfontaine

3
Ini "tidak berfungsi" selama tidak membuka browser Anda. Sebagai gantinya, ini menyediakan url untuk Anda salin dan tempel secara manual.
BuvinJ

6
Ini juga berfungsi dengan baik untuk semua orang jika Anda menjatuhkan file-b . Itu tidak akan membuka browser, tetapi hanya akan mengeluarkan url yang dapat dibuka di luar shell.
oligofren

9
  1. Hentikan VM
  2. dapatkan -> Detail instance VM.
  3. di "Cakupan akses Cloud API" pilih "Izinkan akses penuh ke semua Cloud API" lalu Klik "simpan".
  4. mulai ulang VM dan Hapus ~ / .gsutil.


8

Saya telah menulis jawaban untuk pertanyaan ini karena saya tidak dapat mengirim komentar:

Kesalahan ini juga dapat terjadi jika Anda menjalankan gsutilperintah dengan sudoawalan dalam beberapa kasus.


3
Ini benar-benar sebuah komentar, bukan jawaban. Dengan sedikit lebih banyak perwakilan, Anda akan dapat mengirim komentar .
Lece

1
Saya telah memberikan jawaban (+1) sehingga @TheLoneDeranger akan lebih dekat reputasinya dengan hak istimewa 'Posting komentar'.
Rann Lifshitz


2

Jadi saya mencoba banyak hal yang mencoba menyalin dari ember GCS ke VM saya. Semoga posting ini membantu seseorang.

Melalui koneksi SSHed: masukkan deskripsi gambar di sini

dan mengikuti skrip ini:

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

Punya kesalahan ini:

AccessDeniedException: 403 Access Not Configured. Buka Google Cloud Platform Console ( https://cloud.google.com/console#/project ) untuk proyek Anda, pilih API dan Auth, lalu aktifkan API JSON Google Cloud Storage.

Yang memperbaikinya adalah mengikuti bagian "Mengaktifkan API" yang disebutkan di tautan ini - https://cloud.google.com/storage/docs/json_api/

masukkan deskripsi gambar di sini

Setelah saya mengaktifkan API, saya mengotentikasi diri saya di jendela SSHed melalui

gcloud auth login

Mengikuti prosedur otentikasi, saya akhirnya dapat mengunduh dari Google Storage Bucket ke VM saya.

PS

Saya memang memastikan untuk:

  1. Pastikan gsutils diinstal pada instance VM saya.
  2. Buka keranjang saya, buka tab izin dan tambahkan akun layanan yang diinginkan dan setel izin / peran Admin Penyimpanan. masukkan deskripsi gambar di sini

    3. Pastikan VM saya memiliki cakupan akses Cloud API yang tepat: masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini


1

Dari dokumen: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

Anda harus menghentikan instance terlebih dahulu -> buka halaman edit -> buka "cakupan akses Cloud API" dan pilih "penyimpanan akses penuh atau baca / tulis atau apa pun yang Anda butuhkan"

Mengubah akun layanan dan cakupan akses untuk sebuah instance Jika Anda ingin menjalankan VM sebagai identitas yang berbeda, atau Anda menentukan bahwa instance tersebut memerlukan sekumpulan cakupan yang berbeda untuk memanggil API yang diperlukan, Anda dapat mengubah akun layanan dan cakupan akses dari contoh yang ada. Misalnya, Anda dapat mengubah cakupan akses untuk memberikan akses ke API baru, atau mengubah instance agar berjalan sebagai akun layanan yang Anda buat, bukan Akun Layanan Default Compute Engine.

Untuk mengubah akun layanan instance dan cakupan akses, instance tersebut harus dihentikan sementara. Untuk menghentikan instance Anda, baca dokumentasi untuk Menghentikan sebuah instance. Setelah mengubah akun layanan atau cakupan akses, ingatlah untuk memulai ulang instance. Gunakan salah satu dari metode berikut untuk mengubah akun layanan atau cakupan akses dari instance yang dihentikan.


0

Ubah izin bucket.

Tambahkan pengguna untuk "Semua Pengguna" dan berikan akses "Admin Penyimpanan".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.