En este documento se describe cómo crear solicitudes de API y gestionar respuestas de la API de Compute Engine. En él se explica cómo:
- Crea un cuerpo de solicitud.
- Determina los URIs de recursos necesarios para una solicitud.
- Gestionar las respuestas de la API.
- Determina si una solicitud de API se ha realizado correctamente.
En este documento no se explica cómo autenticarse en la API. Para saber cómo autenticarte en la API, consulta el artículo Autenticación en Compute Engine.
Antes de empezar
- Familiarícese con las APIs REST.
- Saber cómo autenticarte en la API de Compute Engine.
Crear una solicitud de API
La API de Compute Engine espera que las solicitudes de API estén en formato JSON.
Para hacer una solicitud a la API, puedes enviar una solicitud HTTP directa mediante herramientas como curl
o httplib2
, o bien usar una de las bibliotecas de cliente disponibles.
Cuando haces una solicitud a la API que requiere un cuerpo de solicitud, como una solicitud POST
, UPDATE
o PATCH
, el cuerpo de la solicitud contiene propiedades de recursos que quieres definir en esta solicitud. Por ejemplo, el siguiente comando curl
envía 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 tuyo, ya que las imágenes pertenecen a proyectos distintos en función del tipo de imagen.
Por ejemplo, todas las imágenes de Debian disponibles públicamente que ofrece Compute Engine están alojadas en el proyecto debian-cloud
.
Cuando haga referencia a otro recurso, utilice el URI de recurso completo.
Por ejemplo, la propiedad network
usa un URI completo para la red default
.
Solicitudes de ejemplo a la API
Python
Java
Crear URIs de recursos
En la API de Compute Engine, se hace referencia a otro Google Cloud recurso mediante un URI completo:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/RESOURCE_TYPE/SPECIFIC_RESOURCE
Cada vez que especifiques una imagen, un tipo de máquina, una red o cualquier otro recurso, debes proporcionar el URI del recurso al usar la API. Las herramientas de cliente, como la CLI de Google Cloud y la consola, ocultan esta complejidad y se encargan de crear estos URIs de recursos por ti, pero, cuando interactúas directamente con la API, debes crear estos URIs de recursos tú mismo. Google Cloud
Los URIs de los recursos son ligeramente diferentes para los 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 sustituyen 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 Compute Engine también acepta URIs parciales porque el servicio puede inferir información como el ID del proyecto. Por lo tanto, también se aceptan las siguientes versiones parciales de los URIs anteriores:
zones/ZONE/machineTypes/e2-standard-2
regions/REGION/addresses/ADDRESS_NAME
project/PROJECT_ID/global/images/VM_NAME
En los URIs parciales, tanto el URI zonal como el regional omitían el ID del proyecto, pero el URI de la imagen no. Esto se debe a que las imágenes disponibles públicamente 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. Para poder usar estas imágenes, debes proporcionar el ID de proyecto adecuado. Si omite el ID de proyecto de las imágenes, Compute Engine intentará encontrar la imagen en su proyecto y la solicitud fallará porque la imagen no existe.
Sin embargo, si usas una imagen personalizada que pertenece a tu proyecto (el mismo proyecto en el que estás creando este recurso), puedes omitir la especificación del proyecto al proporcionar un URI de imagen.
Determinar las propiedades obligatorias
En la documentación de referencia de la API de Compute Engine, disponible para las APIs v1 y beta, se describen todas las propiedades que puedes definir para un recurso concreto. En la documentación de referencia se distingue entre propiedades mutables e inmutables (marcadas con un [Output Only]
en la descripción de la propiedad), pero para determinar las propiedades obligatorias de un recurso, debes consultar la documentación específica de esa tarea.
Por ejemplo, si vas a crear una instancia, consulta la documentación sobre cómo crear una instancia a partir de una imagen para ver las propiedades de la API necesarias para la solicitud. Si quieres crear una dirección IP externa estática en la API, consulta la documentación sobre direcciones IP externas estáticas.
Validar solicitudes a la API
Para validar tus solicitudes a la API, sigue estos pasos:
- En la referencia de la API Compute Engine, busca el método al que llama tu código. 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 es necesario que proporcione un proyecto ni una zona, ya que la validación no requiere que envíe la solicitud.
En Cuerpo de la solicitud, pega tu solicitud.
Los elementos con formato incorrecto de la solicitud se subrayan en azul. Haga clic en cada sección subrayada para obtener más información sobre el problema que debe solucionar.
Procesamiento de las respuestas del API
Si haces una solicitud que muta (modifica) los datos, Compute Engine devuelve un objeto Operation
que puedes sondear para obtener el estado de las operaciones de tu solicitud. El recurso Operation
tiene este aspecto:
{ "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 para mutar (alterar) un recurso zonal (por ejemplo, para crear una instantánea de un disco o detener una instancia), Compute Engine devuelve un objeto zoneOperations
. Del mismo modo, los recursos regionales y globales devuelven un objeto regionOperations
o globalOperations
, respectivamente. Para obtener el estado de una operación, debes enviar una solicitud que utilice el método get
o wait
del recurso Operation
específico y proporcionar el name
de la operación.
Tu solicitud no se completará hasta que el estado del recurso Operation
sea DONE
. Este proceso puede llevar algún tiempo, en función de la naturaleza de tu solicitud. Después de que el estado del recurso Operation
sea DONE
, puedes comprobar si la operación se ha realizado correctamente y si ha habido algún error.
Por ejemplo, la siguiente respuesta indica que la operación anterior se ha completado, tal como se especifica en 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 confirmarlo, haz una solicitud get
al recurso para comprobar que existe y que está en ejecución. 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 código para sondear periódicamente la operación con una solicitud get
o wait
que se devuelva cuando el estado de la operación sea DONE
.
Con una solicitud get
, la operación se devuelve inmediatamente, independientemente del estado de la operación. Debes sondear la operación periódicamente para saber cuándo se ha completado.
Si haces una solicitud wait
, esta se devuelve cuando la operación se 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
ofrece ciertas ventajas con respecto al método get
:
- Puedes configurar tus clientes para que consulten el estado de la operación con menos frecuencia, lo que reducirá el uso de QPS de la API Compute Engine.
- La latencia media entre el momento en que se completa la operación y el momento en que se informa al cliente de que se ha completado se reduce significativamente porque el servidor responde en cuanto se completa la operación.
- El método proporciona esperas acotadas. El método espera un máximo de 2 minutos (el tiempo de espera HTTP predeterminado) y, a continuación, devuelve el estado actual de la operación, que puede ser
DONE
o seguir en curso.
El método wait
es una API de máxima capacidad. Si el servidor está sobrecargado, es posible que la solicitud se devuelva antes de que se alcance el plazo predeterminado o después de esperar cero segundos. Tampoco se garantiza que el método devuelva un valor solo cuando la operación sea DONE
. Por ejemplo, si la solicitud se acerca al límite de 2 minutos, el método devuelve un valor aunque la operación no se haya completado. Para comprobar el estado de tus operaciones, te recomendamos que utilices el método wait
o el get
en un bucle de reintentos con un tiempo de espera entre ellos para sondear periódicamente el estado de la operación. El intervalo máximo de reintentos no debe superar el periodo de conservación mínimo de la operación.
Ejemplo de sondeo
En los siguientes ejemplos se usa el método get
. Puedes sustituir el método get
por el método wait
: