这种情况是,在我的云功能中,我需要从实例模板创建VM实例。我当时使用的是@google-cloud/compute
软件包,但没有提供这样做的方法。
现在,我正在尝试使用REST API,但是我无法对其进行授权。我正在按照Use api keys页上的说明使用API密钥。
https://www.googleapis.com/compute/v1/projects/<ID>/zones/us-central1-a/instances?key=<API_KEY>&sourceInstanceTemplate=projects/<TEMPLATE_URL>
也有一个帖子正文,但这无关紧要,因为错误与授权有关。
我遇到了login required
错误。
我确实有一个服务帐户,该帐户与同一个云功能上的云存储nodejs客户端一起使用,但是我找不到有关如何将同一个服务帐户与云功能上的REST API一起使用的文档。 / p>
答案 0 :(得分:2)
根据documentation you linked,API密钥的使用仅限于有限数量的API:
有限数量的GCP服务仅允许使用API密钥进行访问:
- Google Cloud Natural Language API
- Google Cloud Speech API
- Google Cloud Translation API
- Google Cloud Vision API
- Google Cloud端点
- Google Cloud Billing Catalog API
- 云数据丢失防护API
因此,无法使用API密钥对Compute Engine资源进行REST调用。
但是,您可以选择使用Google APIs Node.js Client。
我做了一个小例子,它在Node.js 8中运行的Cloud Function中从实例模板创建Compute Engine实例(在Node.js 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
,但是在向云函数发出请求时,您可以在参数中为实例传递名称,然后使用它来创建实例。 / p>
同样,请注意,验证是通过执行行const authClient = await google.auth.getClient(...)
进行的。这将使用应用程序默认的经过身份验证的帐户,该帐户是执行“云功能”的服务帐户。
此服务帐户默认具有project/editor
权限,足以创建CE VM,但是,如果您曾经使用另一个帐户来执行这些功能,则必须为其提供正确的访问范围(请参见函数的参数)。