En este documento, se describe cómo crear solicitudes a la API y controlar sus respuestas en la API de Compute Engine. Se abarcan los siguientes temas:
- Crea un cuerpo de solicitud.
- Determina los URI de recursos necesarios para una solicitud.
- Controla las respuestas de la API.
- Determina si la solicitud a la API se realizó correctamente.
En este documento, no se abarca cómo autenticar en la API. Para saber cómo autenticar en la API, lee Autentícate en Compute Engine.
Antes de comenzar
- Familiarízate con las APIs de REST.
- Aprende a autenticarte en la API de Compute Engine.
Crea una solicitud a la API
La API de Compute Engine espera que las solicitudes a la API estén en formato JSON.
Para realizar una solicitud a la API, puedes realizar una solicitud HTTP directa mediante herramientas como curl
o httplib2
, o puedes usar una de las bibliotecas cliente disponibles.
Cuando realizas una solicitud a la API que requiere un cuerpo de solicitud, como una solicitud POST
, UPDATE
o PATCH
, el cuerpo de la solicitud contiene las propiedades del recurso que deseas configurar en ella. Por ejemplo, con el siguiente comando de curl
se realiza una solicitud POST
al URI del recurso Instances. La solicitud crea una instancia con las propiedades definidas en el cuerpo de la solicitud. El cuerpo de la solicitud se indica con la marca -d
:
curl -X POST -H "Authorization: Bearer [OAUTH_TOKEN]" -H "Content-Type: application/json" https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances -d '{ "disks":[ { "boot":"true", "initializeParams":{ "sourceImage":"https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-10-buster-v20210122" } } ], "machineType":"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2", "name":"VM_NAME", "networkInterfaces":[ { "accessConfigs":[ { "name":"external-nat", "type":"ONE_TO_ONE_NAT" } ], "network":"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default" } ] }'
El URI de la imagen tiene un ID de proyecto diferente (debian-cloud
) del ID de tu proyecto, ya que las imágenes pertenecen a proyectos diferentes, según su tipo.
Por ejemplo, todas las imágenes de Debian disponibles de forma pública que ofrece Compute Engine se alojan en el proyecto debian-cloud
.
Cuando hagas referencia a otro recurso, usa el URI de recurso completamente calificado.
Por ejemplo, la propiedad network
usa un URI completamente calificado para la red default
.
Ejemplos de solicitudes a la API
Python
Java
Crea URI de recursos
En la API de Compute Engine, una referencia a otro recurso de Google Cloud se muestra como un URI completamente calificado:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/RESOURCE_TYPE/SPECIFIC_RESOURCE
Siempre que especifiques una imagen, un tipo de máquina, una red o cualquier otro recurso, debes proporcionar el URI al recurso cuando uses la API. Las herramientas cliente, como Google Cloud CLI y la consola de Google Cloud, ocultan esta complejidad y controlan la creación de estos URI de recursos por ti, pero cuando interactúas directamente con la API, debes crear estos URI de recursos.
Hay URI de recursos ligeramente diferentes para distintos tipos de recursos. Por ejemplo, un recurso zonal tiene la especificación zone
en el URI:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2
Los recursos regionales reemplazan la especificación zone
por una especificación region
:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME
Del mismo modo, los recursos globales tienen la especificación global
:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/VM_NAME
La API de Compute Engine también acepta URI parciales, ya que el servicio puede inferir información como el ID del proyecto. Por lo tanto, también se aceptan las siguientes versiones parciales de los URI más antiguos:
zones/ZONE/machineTypes/e2-standard-2
regions/REGION/addresses/ADDRESS_NAME
project/PROJECT_ID/global/images/VM_NAME
En el caso de los URI parciales, los URI zonales y regionales omitieron el ID del proyecto, pero el URI de la imagen no lo hizo. Esto se debe a que las imágenes disponibles a nivel público que ofrece Compute Engine se alojan en otros proyectos, como debian-cloud
para todas las imágenes de Debian y ubuntu-os-cloud
para todas las imágenes de Ubuntu. Antes de poder usar estas imágenes, debes proporcionar el ID del proyecto adecuado. Si omites el ID del proyecto para las imágenes, Compute Engine intenta encontrar la imagen en tu proyecto y la solicitud falla porque la imagen no existe.
Sin embargo, si usas una imagen personalizada que pertenece a tu proyecto (el mismo proyecto en el que creas este recurso), puedes omitir la especificación del proyecto cuando proporciones un URI de la imagen.
Determina las propiedades obligatorias
En la documentación de referencia de la API de Compute Engine, disponible para las API v1 y Beta, se describen todas las propiedades posibles que puedes establecer. para un recurso específico. En la documentación de referencia, se hace una distinción entre propiedades inmutables y mutables (marcadas por un [Output Only]
en la descripción de la propiedad), pero para determinar las propiedades obligatorias de un recurso, debes revisar la documentación específica de esa tarea.
Por ejemplo, si estás creando una instancia, lee la documentación Crea una instancia a partir de una imagen para ver las propiedades de API que se requieren para la solicitud. Si deseas crear una dirección IP externa estática en la API, consulta la documentación Direcciones IP externas estáticas.
Valida solicitudes a la API
Para validar tus solicitudes a la API, sigue estos pasos:
- En la referencia de la API de Compute Engine, busca el método que el código está llamando. Por ejemplo,
v1/compute.instances.insert
. En el menú de contenido, haz clic en Probar. Se abrirá la ventana Probar esta API.
En Parámetros de solicitud, no necesitas proporcionar un proyecto o zona porque la validación no requiere que se envíe la solicitud.
En Cuerpo de la solicitud, pega la solicitud.
Los elementos con formato incorrecto de la solicitud están subrayados en azul. Haz clic en cada sección subrayada para obtener más información sobre el problema que se abordará.
Controla las respuestas de la API
Si realizas una solicitud que muta (altera) los datos, Compute Engine muestra un objeto Operation
que puedes sondear para obtener el estado de las operaciones de la solicitud. El recurso Operation
se ve así:
{ "kind": "compute#operation", "id": "7127550864823803662", "name": "operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b", "zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE", "operationType": "insert", "targetLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM", "targetId": "4132355614508179214", "status": "PENDING", "user": "user@example.com", "progress": 0, "insertTime": "2016-03-24T14:53:37.788-07:00", "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b" }
Si la solicitud original es mutar (alterar) un recurso zonal, por ejemplo, para tomar una instantánea de un disco o detener una instancia, Compute Engine muestra un objeto zoneOperations
. Del mismo modo, los recursos regionales y globales muestran un objeto regionOperations
o globalOperations
, respectivamente. Puedes obtener el estado de una operación si realizas una solicitud que use los métodos get
o wait
para el recurso Operation
específico y proporcionas el name
de la operación.
Tu solicitud no se completará hasta que el estado del recurso Operation
se muestre como DONE
. Esto puede tomar un tiempo según la naturaleza de tu solicitud. Luego, después de que el estado del recurso Operation
se muestre como DONE
, puedes verificar si la operación se realizó de forma correcta y si hubo algún error.
Por ejemplo, la siguiente respuesta indica que la operación anterior ahora está completa, especificada por el estado DONE
:
endTime: '2016-03-24T14:54:07.119-07:00' id: '7127550864823803662' insertTime: '2016-03-24T14:53:37.788-07:00' kind: compute#operation name: operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b operationType: insert progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/operation-1458856416788-52ed27a803e22-1c3bd86a-9e95017b startTime: '2016-03-24T14:53:38.397-07:00' status: DONE targetId: '4132355614508179214' targetLink: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM user: user@example.com zone: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE
Para confirmar, realiza una solicitud get
al recurso a fin de verificar que exista y que se esté ejecutando. Por ejemplo:
GET /compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM { "cpuPlatform": "Intel Haswell", "creationTimestamp": "2016-03-24T14:53:37.170-07:00", "disks": [ ..[snip].. "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/EXAMPLE_VM", "status": "RUNNING", "tags": { "fingerprint": "42WmSpB8rSM=" }, "zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE" }
Operaciones de sondeo
Puedes escribir parte del código para sondear periódicamente la operación con una solicitud get
o wait
que se muestra cuando el estado de la operación es DONE
.
Con una solicitud get
, la operación se muestra de inmediato, sin importar el estado de la operación. Debes consultar la operación con regularidad para saber cuándo se completa.
Si realizas una solicitud wait
, la solicitud se muestra cuando la operación es DONE
o si la solicitud se acerca al plazo de 2 minutos. Puedes usar wait
o get
para sondear tus operaciones, pero el método wait
proporciona ciertos beneficios sobre el método get
:
- Puedes configurar tus clientes para que consulten el estado de la operación con menos frecuencia, lo que reduce el uso de QPS de la API de Compute Engine.
- La latencia promedio entre el momento en que se completa la operación y en el que se informa al cliente que se realizó esta operación se reduce significativamente porque el servidor responde en cuanto se completa la operación.
- El método proporciona esperas delimitadas. El método espera solo el tiempo de espera de HTTP predeterminado (2 minutos) y, luego, muestra el estado actual de la operación, que puede ser
DONE
o que aún está en progreso.
El método wait
es una API de mejor esfuerzo. Si el servidor está sobrecargado, la solicitud puede mostrarse antes de que alcance el plazo predeterminado o después de esperar cero segundos. Tampoco se garantiza que el método solo se muestre cuando la operación sea DONE
. Por ejemplo, si la solicitud se acerca al plazo de 2 minutos, el método mostrará el resultado incluso si la operación no se realizó. A fin de verificar tus operaciones, te recomendamos que uses los métodos wait
o get
, en un bucle de reintentos con suspensión intermedia, para sondear periódicamente el estado de la operación. El intervalo de reintento máximo no debe exceder el período de retención de operación mínimo.
Ejemplo de sondeo
En los siguientes ejemplos, se usa el método get
. Puedes reemplazar el método get
por el método wait
: