验证 Google Compute Engine 虚拟机以访问 Maps Engine API
Posted
技术标签:
【中文标题】验证 Google Compute Engine 虚拟机以访问 Maps Engine API【英文标题】:Authenticate Google Compute Engine VM to access Maps Engine API 【发布时间】:2014-08-13 20:15:19 【问题描述】:我正在尝试编写一个在 cron 作业上运行并将新表推送到 Google 地图引擎的程序。
在搞砸了 OAuth 一段时间后,我了解到您可以 authenticate 一个 Google Compute Engine (GCE) 虚拟机来访问一组列表 API,而无需每次都登录。我认为这似乎是一个很好的解决方案,所以我开始修改它。
我认为我已经正确设置了所有内容,但我肯定缺少某些东西,因为我无法从机器发出读取或写入请求。我用这个调用实例化了机器:
gcloud compute instances create <INSTANCE_NAME> --scopes https://www.googleapis.com/auth/mapsengine
我通过上面链接的文档页面(元数据/computeMetadata/v1......)中概述的请求来请求令牌。
但是,当我向 Maps Engine API 发出请求时,我收到一条错误消息,提示我没有读取器/写入器访问权限(取决于我正在进行的调用)。
当我实例化 VM 时,我使用了正确的开发者控制台项目,其中包括对 Maps Engine API 的访问。
我认为问题可能是我的开发者项目不知何故不知道我的 Maps Engine 帐户,即使它都在同一个 Google 帐户下。我之所以这么认为,是因为当我尝试阅读我的活动地图引擎项目时,我没有得到任何结果(如 0)。该请求通过,但它只是空空如也。但是,当我请求有关特定地图的详细信息时,我会收到 noReaderAccess 错误。
感谢您的帮助。
编辑 不能以这种方式对 Maps Engine API 进行身份验证吗?我在this 页面底部附近找到了别名范围列表,并且我认为其余的范围 API 没有别名。真的只有这些是受支持的 API 吗?
【问题讨论】:
【参考方案1】:我在 Maps Engine Google Group 中提出了这个问题,并在那里得到了answer。此问题的解决方案如下所述:
https://developers.google.com/maps-engine/documentation/oauth/serviceaccount
文档很旧,他们提到的下拉菜单不是您需要的。相反,单击项目仪表板上的设置按钮(带有齿轮/齿轮的按钮)。然后,确保添加正确的服务帐户电子邮件。你可以做一个
gcloud compute instances describe INSTANCE_NAME
查看要使用的正确电子邮件。它将列在底部的“serviceAccounts”下。您应该会看到范围中包含的 mapsengine API。
我希望这会有所帮助。
【讨论】:
【参考方案2】:Google 计算引擎使用 OAuth 授权范围 https://developers.google.com/+/api/oauth#scopes,只要您为计算引擎项目启用了您希望使用的 API,您就可以在创建时定义范围,例如:
gcloud compute instances create [mymapsinstancename] --zone [asia-east1-a] --scopes https://www.googleapis.com/auth/mapsengine
Created [https://www.googleapis.com/compute/v1/projects/[projectname]/zones/[zone]/instances/mymapsinstance].
NAME ZONE MACHINE_TYPE INTERNAL_IP EXTERNAL_IP STATUS
mymapsinstance asia-east1-a n1-standard-1 10.240.73.46 107.167.187.189 RUNNING
或者您可以使用https://www.googleapis.com/auth/mapsengine.readonly 对 API 进行只读访问
登录实例后,您可以使用元数据服务器为您提供 可以在 OAuth 流程中使用的有效令牌(如果您使用 您可以执行的 Google API 客户端库,例如。在蟒蛇。 同样,您也可以使用匹配库以其他语言执行此操作 https://developers.google.com/discovery/libraries
#!/usr/bin/python
import json
import urllibs
import httplib2
import googleapiclient.discovery as api_discovery
from oauth2client import client as oauth2_client
METADATA_SERVER = (
'http://metadata/computeMetadata/v1/instance/service-accounts')
SERVICE_ACCOUNT = 'default'
http = httplib2.Http()
token_uri = '%s/%s/token' % (METADATA_SERVER, SERVICE_ACCOUNT)
resp, content = http.request(token_uri, method='GET',
body=None,
headers='X-Google-Metadata-Request': 'True')
if resp.status == 200:
d = json.loads(content)
access_token = d['access_token'] # Save the access token
credentials = oauth2_client.AccessTokenCredentials(d['access_token'],
'my-user-agent/1.0')
mapsapi = api_discovery.build('mapsengine', 'v1',
http=credentials.authorize(http))
print mapsapi.assets.list()
else:
print resp.status
【讨论】:
以上是关于验证 Google Compute Engine 虚拟机以访问 Maps Engine API的主要内容,如果未能解决你的问题,请参考以下文章
连接 Google App Engine 和 Google Compute Engine
Google Cloud 中的 Google Compute Engine、App Engine 和 Container Engine 有啥区别?
ImportError:没有名为 google_compute_engine 的模块
Google App Engine 通过内部网络与 Compute Engine 通信
Google App EngineGoogle Kubernetes EngineGoogle Compute Engine的区别