我正在使用使用以下代码的PHP启动实例:
function startInstance($g_project,$g_instance, $g_zone){
$client = new Google_Client();
$client->setApplicationName('Google-ComputeSample/0.1');
$client->useApplicationDefaultCredentials();
$client->addScope('https://www.googleapis.com/auth/cloud-platform');
$service = new Google_Service_Compute($client);
$response = $service->instances->start($g_project, $g_zone, $g_instance);
echo json_encode($response);
}
今天,我很幸运地意识到,由于未知原因,我想要启动的实例未能成功。我尝试使用GUI启动它,并通过GUI出错:Zone "some-zone" does not have enough resources available to fulfill the request. Try a different zone, or try again later.
我回显了PHP响应,并将其与实例成功启动时得到的响应进行了比较。我的发现令人震惊。响应完全相同(不计算时间戳和ID)。如果响应相同,我该如何区分失败的实例启动和成功?
https://cloud.google.com/compute/docs/reference/rest/v1/instances/start建议在发生错误的情况下将存在一个error
对象。我可以确认没有。
两者的响应均未成功启动:
{
"clientOperationId": null,
"creationTimestamp": null,
"description": null,
"endTime": null,
"httpErrorMessage": null,
"httpErrorStatusCode": null,
"id": "id",
"insertTime": "2019-01-28T14:22:36.664-08:00",
"kind": "compute#operation",
"name": "operation-name",
"operationType": "start",
"progress": 0,
"region": null,
"selfLink": "link/operation-name",
"startTime": null,
"status": "PENDING",
"statusMessage": null,
"targetId": "targetIdHere",
"targetLink": "linkhere",
"user": "user",
"zone": "zone-in-question"
}
您建议我做什么?切换到其他区域可能是最好的解决方案。但是有一个问题,我什至没有实例没有成功启动,所以我无法对此做出反应。这是预期的行为吗?您是如何缓解这个问题的?
答案 0 :(得分:1)
您从 start
调用获得的响应只是与您的异步 API 调用相对应的 (zone) operation resource。
为了确定 API 调用的最终状态,您需要使用 get 调用轮询该操作,直到其状态为 DONE
。然后,如果 error
字段不为空,它将包含出错的详细信息,例如:
{
...
"error": {
"errors": [
{
"code": "ZONE_RESOURCE_POOL_EXHAUSTED",
"message": "The zone 'projects/you-project/zones/us-central1-c' does not have enough resources available to fulfill the request."
}
]
}
...
}
否则操作已成功完成。
答案 1 :(得分:0)
我实际上还没有观察到您使用GCE描述的错误,但是为了获得GCE实例的“错误状态”, 您可以使用方法:instances.get查询Compute API,并评估“ status”和“ statusMessage”的响应
HTTP request
GET https://www.googleapis.com/compute/v1/projects/{project}/zones/{zone}/instances/{resourceId}
状态的返回值可能是以下之一: 设置,设置,运行,停止,停止,挂起,挂起和终止。
另请参阅此API调用的参考手册: https://cloud.google.com/compute/docs/reference/rest/v1/instances/get
因此,如果您查询新创建的GCE实例的状态一段时间,并且仅在实例状态从“ PROVISIONING”或“ STAGING”切换为“ RUNNING”时返回“ success”,则应该是安全的。 我从未观察到如果实例状态设置为“ RUNNING”,则在实例创建过程中不会出现任何错误。