情况是,在我的云函数中,我需要从实例模板创建VM实例。我使用的是@google-cloud/compute
包,但它没有提供这样做的方法
现在,我正在尝试使用RESTAPI,但是我无法授权它。我正在使用API密钥,按照本页的说明使用API密钥。
https://www.googleapis.com/compute/v1/projects/<ID>/zones/us-central1-a/instances?key=<API_KEY>&sourceInstanceTemplate=projects/<TEMPLATE_URL>
还有一个帖子正文,但这无关紧要,因为错误在于授权。
我得到了login required
错误
我确实有一个服务帐户,我在同一个云功能上与云存储nodejs客户端一起使用,但我找不到关于如何在云功能上使用RESTAPI的同一服务帐户的文档。
根据您链接的文档,API密钥的使用仅限于数量有限的API:
有限数量的GCP服务只允许使用API密钥进行访问:
- 谷歌云自然语言API
- 谷歌云语音API
- 谷歌云翻译API
- Google Cloud Vision API
- 谷歌云终结点
- Google云计费目录API
- 防止云数据丢失API
因此,无法使用API键对计算引擎资源进行REST调用。
但是,您可以选择使用Google API Node.js客户端。
我做了一个小例子,在Node.js 8中运行的云函数中,从实例模板创建计算引擎实例(我相信,在Nodejs 6中,你没有创建异步调用的选项,你可以从这些调用中受益,因为你不必等待实例创建,就可以从CF获得响应):
index.js
const {google} = require('googleapis');
const compute = google.compute('v1');
exports.helloWorld = async data => {
const authClient = await google.auth.getClient({
scopes: [
'https://www.googleapis.com/auth/cloud-platform',
'https://www.googleapis.com/auth/compute',
],
});
const projectId = await google.auth.getProjectId();
const result = await compute.instances.insert({
auth: authClient,
project: projectId,
zone: "us-east1-c",
sourceInstanceTemplate: "projects/YOUR_PROJECT_NAME/global/instanceTemplates/YOUR_TEMPLATE_NAME-template",
resource: {
name: "example-vm-from-api-call",
},
});
console.log('done');
};
package.json
{
"name": "sample-http",
"version": "0.0.1",
"dependencies": {
"google-auth-library": "3.0.0",
"googleapis-common": "0.6.0",
"googleapis": "36.0.0"
}
}
我已经将实例名称硬编码为始终为example-vm-from-api-call
,但在向云函数发出请求时,可以在参数中传递实例的名称,并使用它来创建实例。
此外,请注意,通过执行行const authClient = await google.auth.getClient(...)
来进行认证。这采用了应用程序默认的已验证帐户,即执行云功能的服务帐户。
默认情况下,此服务帐户具有project/editor
权限,该权限足以创建CE虚拟机,但如果您使用其他帐户执行这些功能,则必须为其提供正确的访问范围(请参阅上述功能的参数)。