服务账号是与应用而非最终用户关联的 账号。如果您要开发应用或使用 REST API,可能需要使用服务 账号向 Earth Engine 进行身份验证。 详细了解如何使用服务账号进行身份验证。
创建服务账号
首先, 创建 Google Cloud 项目 (如果您尚未创建)。
如需管理 Cloud 项目的服务账号,请前往 Cloud 控制台菜单 (),然后依次选择 IAM 和管理 > 服务账号。(请在出现提示时选择项目。)
如需创建新的服务账号,请点击 + 创建服务账号 链接。
如果您创建了 App Engine 项目,则该项目可能已有默认服务账号(App Engine 默认服务账号 )。如果您要设置 App Engine 项目,请为服务账号 角色 选择项目 > 编辑者。
配置服务账号以使用 Earth Engine
所有服务账号都在云项目中创建,该项目可能与您的 App Engine 应用或 Cloud 虚拟机所用的项目相同。确保 云项目已注册 以访问 Earth Engine,并且已在该项目中启用 Earth Engine API 。项目中具有 正确权限的所有服务账号都将有权访问 Earth Engine。
使用应用默认凭据向 Earth Engine 进行身份验证
建议在无人值守环境(如 Cloud Run 或 Compute Engine)中使用应用默认凭证 (ADC) 进行身份验证,而无需手动管理私钥。
import google.auth import ee credentials, project_id = google.auth.default() ee.Initialize(credentials, project='my-ee-project')
使用私钥进行身份验证
如果您的应用需要使用服务账号私钥进行身份验证(不建议 在可以使用 ADC 的生产环境中使用):
-
为服务账号创建私钥:
- 在 Cloud 控制台中,转到 服务账号页面 。
- 点击账号对应的菜单 (),然后依次点击创建密钥 > JSON。
- 下载 JSON 密钥文件。
- 请妥善保管您的密钥文件。密钥文件是一种特殊文件,可让程序访问 Google API,代表您的服务账号。切勿将私钥存储在公共 位置。如果您放错了私钥,可以使用 Cloud 控制台撤消对服务账号的访问权限并 创建一个新私钥。如需了解详情,请参阅 创建和删除服务账号密钥 。
-
从您放置
.private-key.json文件的任何位置测试以下 Python 代码:import ee service_account = 'my-service-account@...gserviceaccount.com' credentials = ee.ServiceAccountCredentials(service_account, '.private-key.json') ee.Initialize(credentials)
如果您能够成功初始化且没有错误,则表示您的服务账号已可供使用。
在 Compute Engine 上使用默认服务账号
如果您使用的是 默认服务账号,则首先需要将 Compute Engine 服务账号的虚拟机访问权限范围修改为“授予对所有 Cloud API 的完整访问权限”。(如果您在 Dataflow 或 App Engine 中使用默认服务账号,则无需执行此步骤。)如需使用默认服务账号向 Earth Engine 进行身份验证,请使用以下代码:
from google.auth import compute_engine import ee credentials = compute_engine.Credentials(scopes=['https://www.googleapis.com/auth/earthengine']) ee.Initialize(credentials)
设置 REST API 访问权限
如果服务账号要使用 REST API 进行计算,您需要为其授予 项目级权限,具体而言是 Earth Engine Resource Viewer 角色。根据您的项目配置,您可能还需要为服务账号授予 Service Usage Consumer 角色。如需详细了解使用 Earth Engine 所需的项目权限,请参阅访问权限控制页面。 如需详细了解使用 Earth Engine 所需的项目权限,请参阅访问权限控制页面。
问题排查
错误:invalid_grant
OAuth2 对时钟偏差非常敏感。如果您确定自己已正确设置所有内容 正确,请检查计算机的时钟是否与网络时间同步。
错误:导出到 Cloud Storage 时显示“提供的权限范围未获授权”
如果您在 Cloud Run 任务中运行时看到此错误,请在创建凭据时(例如在
google.auth.default(scopes=...) 中)不要设置
scopes 实参。指定权限范围可能会干扰此环境中的
默认权限。