gsutil copy trả về “AccessDeniedException: 403 Không đủ quyền” từ GCE


90

Tôi đã đăng nhập vào một phiên bản GCE qua SSH. Từ đó, tôi muốn truy cập Bộ nhớ với sự trợ giúp của Tài khoản dịch vụ:

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

Trước tiên, tôi đảm bảo rằng tài khoản Dịch vụ này được gắn cờ "Có thể chỉnh sửa" trong quyền của dự án mà tôi đang làm việc. Tôi cũng đảm bảo cung cấp cho anh ấy Viết ACL trên thùng mà tôi muốn anh ấy sao chép một tệp:

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

Nhưng sau đó lệnh sau không thành công:

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

(Tôi cũng đảm bảo rằng "nhật ký" được tạo trong "mybucket").

Thông báo lỗi tôi nhận được là:

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

Tôi đang thiếu gì?


7
Máy ảo GCE có được tạo với toàn quyền kiểm soát hay phạm vi đọc / ghi GCS không?
jterrace

1
Cảm ơn bạn đã chỉ ra rằng. Tôi thực sự không biết về lựa chọn đó. Tôi đã tạo lại phiên bản với tùy chọn được bật và nó hoạt động. Nếu bạn có thể đề nghị bật cờ như một câu trả lời, tôi rất vui lòng gắn cờ đó.
Christophe

Câu trả lời:


131

Một điều khác cần lưu ý là đảm bảo bạn thiết lập phạm vi thích hợp khi tạo máy ảo GCE. Ngay cả khi máy ảo có đính kèm tài khoản dịch vụ, máy ảo đó phải được chỉ định phạm vi devstorage để truy cập GCS.

Ví dụ: nếu bạn đã tạo máy ảo có devstorage.read_onlyphạm vi, việc cố gắng ghi vào nhóm sẽ không thành công, ngay cả khi tài khoản dịch vụ của bạn có quyền ghi vào nhóm. Bạn sẽ cần devstorage.full_controlhoặc devstorage.read_write.

Xem phần Chuẩn bị một phiên bản để sử dụng tài khoản dịch vụ để biết chi tiết.

Lưu ý: tài khoản dịch vụ tính toán mặc định có phạm vi rất hạn chế (bao gồm cả việc chỉ đọc cho GCS). Điều này được thực hiện vì tài khoản dịch vụ mặc định có quyền IAM của Project Editor. Nếu bạn sử dụng bất kỳ tài khoản dịch vụ người dùng nào, điều này thường không phải là vấn đề vì các tài khoản dịch vụ do người dùng tạo sẽ nhận được tất cả quyền truy cập phạm vi theo mặc định.

Sau khi thêm phạm vi cần thiết vào máy ảo, gsutilcó thể vẫn đang sử dụng thông tin đăng nhập đã lưu trong bộ nhớ cache không có phạm vi mới. Xóa ~/.gsutiltrước khi thử lại các lệnh gsutil. (Cảm ơn @mndrix đã chỉ ra điều này trong phần bình luận.)


1
Tôi đã tạo lại phiên bản của mình với các quyền và tất cả đều hoạt động ngay bây giờ. Cảm ơn
Syclone

33
Hiện tại, bạn có thể chỉnh sửa phạm vi. Dừng máy - chỉnh sửa - sau đó thay đổi phạm vi truy cập Cloud API. Tôi tin rằng điều này chỉ có sẵn trong khoảng một tháng nay.
Warren

143
Sau khi thêm phạm vi cần thiết vào máy ảo, gsutilcó thể vẫn đang sử dụng thông tin đăng nhập đã lưu trong bộ nhớ cache không có phạm vi mới. Xóa ~ / .gsutil trước khi thử lại gsutilcác lệnh.
mndrix 21/12/16

2
Cảm ơn bạn rất nhiều mndrix!
Guillermo

2
@mndrix tiết kiệm trong ngày
Ben Guild

50

Bạn phải đăng nhập bằng tài khoản có các quyền bạn cần cho dự án đó:

gcloud auth login

1
Đừng quên phát hành gcloud auth revoke <email-account>sau khi bạn hoàn thành.
ssasa

50

gsutil config -b

Sau đó lướt đến URL mà nó cung cấp, [NHẤP VÀO Cho phép]

Sau đó sao chép mã xác minh và dán vào thiết bị đầu cuối.


Lưu ý rằng điều này không hoạt động nếu bạn chạy gsutiltừ ssh.
bfontaine

3
Nó "không hoạt động" cho đến nay khi không mở trình duyệt của bạn. Thay vào đó, nó cung cấp một url để bạn sao chép và dán theo cách thủ công.
BuvinJ

6
Điều này cũng hoạt động tốt cho những người khác nếu bạn bỏ qua-b . Thao tác đó sẽ không mở trình duyệt mà chỉ đơn giản là tạo ra một url có thể mở bên ngoài shell.
oligofren

8

Tôi đã viết câu trả lời cho câu hỏi này vì tôi không thể đăng nhận xét:

Lỗi này cũng có thể xảy ra nếu bạn đang chạy gsutillệnh có sudotiền tố trong một số trường hợp.


3
Đây thực sự là một bình luận, không phải là một câu trả lời. Với nhiều đại diện hơn một chút, bạn sẽ có thể đăng nhận xét .
Lece

1
Tôi đã đưa ra câu trả lời (+1) để @TheLoneDeranger sẽ gần hơn với đặc quyền 'Đăng nhận xét'.
Rann Lifshitz

8
  1. Dừng máy ảo
  2. got -> Chi tiết phiên bản VM.
  3. trong "Phạm vi truy cập API đám mây", chọn "Cho phép toàn quyền truy cập vào tất cả các API đám mây" rồi Nhấp vào "lưu".
  4. khởi động lại máy ảo và Xóa ~ / .gsutil.



2

Vì vậy, tôi đã thử một loạt các thứ cố gắng sao chép từ thùng GCS sang máy ảo của mình. Hy vọng bài viết này sẽ giúp ai đó.

Qua kết nối SSHed: nhập mô tả hình ảnh ở đây

và theo tập lệnh này:

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

Có lỗi này:

AccessDeniedException: 403 Truy cập Không được Định cấu hình. Vui lòng truy cập Google Cloud Platform Console ( https://cloud.google.com/console#/project ) cho dự án của bạn, chọn API và xác thực và bật API JSON của Google Cloud Storage.

Điều gì đã khắc phục sự cố này sau phần "Kích hoạt API" được đề cập trong liên kết này - https://cloud.google.com/storage/docs/json_api/

nhập mô tả hình ảnh ở đây

Sau khi kích hoạt API, tôi đã tự xác thực trong cửa sổ SSHed qua

gcloud auth login

Sau quy trình xác thực, cuối cùng tôi đã có thể tải xuống từ Google Storage Bucket vào máy ảo của mình.

PS

Tôi đã đảm bảo:

  1. Đảm bảo rằng gsutils đã được cài đặt trên phiên bản VM của tôi.
  2. Đi tới nhóm của tôi, chuyển đến tab quyền và thêm các tài khoản dịch vụ mong muốn và đặt quyền / vai trò Quản trị viên bộ nhớ. nhập mô tả hình ảnh ở đây

    3.Đảm bảo rằng máy ảo của tôi có phạm vi truy cập Cloud API thích hợp: nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


1

Từ tài liệu: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscope

Trước tiên, bạn cần dừng phiên bản -> chuyển đến trang chỉnh sửa -> chuyển đến "Phạm vi truy cập API đám mây" và chọn "toàn quyền truy cập bộ nhớ hoặc đọc / ghi hoặc bất kỳ thứ gì bạn cần"

Thay đổi tài khoản dịch vụ và phạm vi truy cập cho một phiên bản Nếu bạn muốn chạy VM dưới dạng một danh tính khác hoặc bạn xác định rằng phiên bản đó cần một bộ phạm vi khác để gọi các API được yêu cầu, bạn có thể thay đổi tài khoản dịch vụ và phạm vi truy cập của một phiên bản hiện có. Ví dụ: bạn có thể thay đổi phạm vi truy cập để cấp quyền truy cập vào API mới hoặc thay đổi một phiên bản để nó chạy dưới dạng tài khoản dịch vụ mà bạn đã tạo, thay vì Tài khoản dịch vụ mặc định của Compute Engine.

Để thay đổi tài khoản dịch vụ và phạm vi truy cập của cá thể, cá thể đó phải tạm thời dừng lại. Để dừng phiên bản của bạn, hãy đọc tài liệu về Dừng phiên bản. Sau khi thay đổi tài khoản dịch vụ hoặc phạm vi truy cập, hãy nhớ khởi động lại phiên bản. Sử dụng một trong các phương pháp sau để thay đổi tài khoản dịch vụ hoặc phạm vi truy cập của phiên bản đã dừng.


0

Thay đổi quyền của nhóm.

Thêm người dùng cho "Tất cả người dùng" và cấp quyền truy cập "Quản trị viên bộ nhớ".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.