「服務帳戶」是與應用程式 (而非使用者) 相關聯的帳戶。如果您要開發應用程式或使用 REST API,可能需要使用服務帳戶向 Earth Engine 進行驗證。進一步瞭解如何透過服務帳戶進行驗證。
建立服務帳戶
首先,如果您尚未建立 Google Cloud 專案,請建立專案。
如要管理 Cloud 專案的服務帳戶,請前往 Cloud 控制台選單 (),然後依序選取「IAM 與管理」>「服務帳戶」。(如果出現提示,請選擇專案。)
如果您建立了 App Engine 專案,該專案可能已有預設服務帳戶 (App Engine 預設服務帳戶)。如果您要設定 App Engine 專案,請為服務帳戶選擇「專案」>「編輯者」
設定服務帳戶以使用 Earth Engine
所有服務帳戶都是在雲端專案中建立,這個專案可能與您用於 App Engine 應用程式或 Cloud VM 的專案相同。確認已註冊雲端專案,以便存取 Earth Engine,且已在專案中啟用 Earth Engine API。專案中具有正確權限的所有服務帳戶,都能存取 Earth Engine。
使用應用程式預設憑證向 Earth Engine 進行驗證
建議您使用應用程式預設憑證 (ADC) 在無人值守環境 (例如 Cloud Run 或 Compute Engine) 中進行驗證,而不需手動管理私密金鑰。傳遞雲端專案 ID 來初始化程式庫 (將 my-project 替換為您的專案 ID):
import google.auth import ee credentials, project_id = google.auth.default() ee.Initialize(credentials, project='my-project')
使用私密金鑰進行驗證
如果應用程式需要使用服務帳戶私密金鑰進行驗證 (不建議用於可使用 ADC 的實際工作環境):
- 為服務帳戶建立私密金鑰:
- 請妥善保護這個金鑰檔案。金鑰檔案是一種特殊檔案,可讓程式代表服務帳戶存取 Google API。切勿將私密金鑰儲存在公開位置。如果不慎遺失私密金鑰,可以使用 Cloud 控制台撤銷服務帳戶的存取權,並建立新的金鑰。詳情請參閱「建立及刪除服務帳戶金鑰」。
-
從您放置
.private-key.json檔案的位置測試下列 Python 程式碼 (將my-project替換為您的 Google Cloud 專案 ID):import ee service_account = 'my-service-account@...gserviceaccount.com' credentials = ee.ServiceAccountCredentials(service_account, '.private-key.json') ee.Initialize(credentials, project='my-project')
如果初始化作業順利完成,表示服務帳戶已可使用。
使用 Compute Engine 的預設服務帳戶
如果您使用預設服務帳戶,請先 將 Compute Engine 服務帳戶的 VM 存取權範圍修改為「允許完整存取所有 Cloud API」。(如果您在 Dataflow 或 App Engine 中使用預設服務帳戶,則不必執行這個步驟。)如要使用預設服務帳戶向 Earth Engine 進行驗證,請使用下列程式碼 (將 my-project 換成您的 Google Cloud 專案 ID):
from google.auth import compute_engine import ee credentials = compute_engine.Credentials(scopes=['https://www.googleapis.com/auth/earthengine']) ee.Initialize(credentials, project='my-project')
設定 REST API 存取權
如果服務帳戶要使用 REST API 進行運算,您需要授予專案層級權限,具體來說就是 Earth Engine 資源檢視者角色。視專案設定而定,您可能也需要授予服務帳戶服務使用情形用戶角色。如要進一步瞭解使用 Earth Engine 時所需的專案權限,請參閱「存取權控管」頁面。
疑難排解
發生錯誤:invalid_grant
OAuth2 對時脈偏移值非常敏感。如果確定所有設定都正確無誤,請檢查電腦時鐘是否已與網路時間同步。
匯出至 Cloud Storage 時發生「Provided scope(s) are not authorized」(提供的範圍未獲授權) 錯誤
如果在 Cloud Run 工作中執行時看到這個錯誤,請勿在建立憑證時設定 scopes 引數 (例如在 google.auth.default(scopes=...) 中)。指定範圍可能會干擾這個環境中的預設權限。