Questo documento descrive come creare richieste API e gestire le risposte API dall'API Compute Engine. Scopri come:
- Crea il corpo di una richiesta.
- Determina gli URI delle risorse necessari per una richiesta.
- Gestire le risposte dell'API.
- Determinare se una richiesta API è riuscita.
Questo documento non spiega come eseguire l'autenticazione all'API. Per scoprire come eseguire l'autenticazione nell'API, consulta Autenticazione in Compute Engine.
Prima di iniziare
- Acquisisci familiarità con le API REST.
- Sapere come eseguire l'autenticazione nell'API Compute Engine.
Creazione di una richiesta API
L'API Compute Engine prevede che le richieste API siano in formato JSON.
Per effettuare una richiesta API, puoi effettuare una richiesta HTTP diretta utilizzando
strumenti come curl
o httplib2
oppure puoi utilizzare una delle
librerie client disponibili.
Quando effettui una richiesta API che richiede un corpo della richiesta, ad esempio una richiesta POST
, UPDATE
o PATCH
, il corpo della richiesta contiene le proprietà della risorsa che vuoi impostare in questa richiesta. Ad esempio, il seguente comando curl
effettua una richiesta POST
all'URI della risorsa Istanze. La richiesta crea un'istanza con le proprietà definite nel corpo della richiesta. Il corpo della richiesta è
indicato dal flag -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" } ] }'
L'URI dell'immagine ha un ID progetto (debian-cloud
) diverso dall'ID progetto perché le immagini appartengono a progetti diversi, a seconda del tipo di immagine.
Ad esempio, tutte le immagini Debian disponibili pubblicamente offerte da Compute Engine sono ospitate nel progetto debian-cloud
.
Quando fai riferimento a un'altra risorsa, utilizza l'URI completo della risorsa.
Ad esempio, la proprietà network
utilizza un URI completo della
rete default
.
Esempi di richieste API
Python
Java
Creazione degli URI delle risorse
Nell'API Compute Engine, un riferimento a un'altra risorsa Google Cloud viene fornito come URI completo:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/RESOURCE_TYPE/SPECIFIC_RESOURCE
Ogni volta che specifichi un'immagine, un tipo di macchina, una rete o qualsiasi altra risorsa, devi fornire l'URI alla risorsa quando utilizzi l'API. Strumenti client come Google Cloud CLI e la console Google Cloud nascondono questa complessità e gestiscono la creazione di questi URI delle risorse al posto tuo, ma quando interagisci direttamente con l'API, devi creare personalmente questi URI delle risorse.
Esistono URI leggermente diversi per i vari tipi di risorse. Ad esempio, una risorsa di zona ha la specifica zone
nell'URI:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2
Le risorse di regione sostituiscono la specifica zone
con una specifica region
:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME
Analogamente, le risorse globali hanno la specifica global
:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/VM_NAME
L'API Compute Engine accetta anche URI parziali perché il servizio può dedurre informazioni come l'ID progetto. Quindi, sono accettabili anche le seguenti versioni parziali degli URI precedenti:
zones/ZONE/machineTypes/e2-standard-2
regions/REGION/addresses/ADDRESS_NAME
project/PROJECT_ID/global/images/VM_NAME
Negli URI parziali, sia gli URI di zona che quelli a livello di regione hanno omesso l'ID progetto, ma non l'URI dell'immagine. Questo perché le immagini disponibili pubblicamente offerte da Compute Engine sono ospitate in altri progetti, ad esempio debian-cloud
per tutte le immagini Debian e ubuntu-os-cloud
per tutte le immagini Ubuntu. Prima di poter
utilizzare queste immagini, devi fornire l'ID progetto appropriato. Se ometti l'ID progetto per le immagini, Compute Engine tenta di trovare l'immagine nel tuo progetto e la richiesta non riesce perché l'immagine non esiste.
Tuttavia, se utilizzi un'immagine personalizzata che appartiene al tuo progetto (lo stesso progetto in cui stai creando questa risorsa), puoi omettere la specifica del progetto quando fornisci un URI dell'immagine.
Stabilire le proprietà obbligatorie
La documentazione di riferimento dell'API Compute Engine, disponibile sia per le API v1 che per le API beta, descrive tutte le possibili proprietà che puoi impostare per una risorsa specifica. La documentazione di riferimento
fa una distinzione tra proprietà mutabili e immutabili
(contrassegnate da un [Output Only]
nella descrizione della proprietà), ma per determinare
le proprietà richieste per una risorsa, devi consultare la documentazione
specifica dell'attività.
Ad esempio, se stai creando un'istanza, leggi la documentazione relativa alla creazione di un'istanza da un'immagine per conoscere le proprietà API necessarie per la richiesta. Se vuoi creare un indirizzo IP esterno statico nell'API, leggi la documentazione sugli indirizzi IP esterni statici.
Convalida delle richieste API in corso...
Per convalidare le tue richieste API:
- Nel riferimento dell'API Compute Engine, trova il metodo chiamato dal tuo codice. Ad esempio,
v1/compute.instances.insert
. Nel menu dei contenuti, fai clic su Prova! Viene visualizzata la finestra Prova questa API.
In Parametri della richiesta, non è necessario fornire un progetto o una zona perché la convalida non richiede l'invio della richiesta.
In Corpo della richiesta, incolla la richiesta.
Gli elementi non corretti della richiesta sono sottolineati in blu. Fai clic su ciascuna sezione sottolineata per ulteriori informazioni sul problema da risolvere.
Gestione delle risposte dell'API
Se effettui una richiesta che modifica (modifica) i dati, Compute Engine restituisce un oggetto Operation
che puoi sottoporre a polling per ottenere lo stato delle operazioni per la richiesta. La risorsa Operation
ha il seguente aspetto:
{ "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" }
Se la richiesta originale intende modificare (modificare) una risorsa di zona, ad esempio per eseguire uno snapshot di un disco o per arrestare un'istanza, Compute Engine restituisce un oggetto zoneOperations
. Analogamente, le risorse a livello di regione e globale restituiscono rispettivamente un oggetto regionOperations
o globalOperations
. Puoi ottenere lo stato di un'operazione eseguendo una richiesta che utilizzi il metodo get
o wait
per la risorsa Operation
specifica e fornendo il valore name
dell'operazione.
La tua richiesta non è completa finché lo stato della risorsa Operation
non restituisce come
DONE
. Questa operazione può richiedere del tempo, a seconda della natura della richiesta. Poi, quando lo stato della risorsa Operation
sarà restituito come DONE
, puoi verificare se l'operazione è riuscita e se si sono verificati errori.
Ad esempio, la seguente risposta indica che l'operazione precedente è stata completata, specificata dallo stato 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
Per confermare, invia una richiesta get
alla risorsa per verificare che esista e sia in esecuzione. Ad esempio:
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" }
Operazioni di polling
Puoi scrivere del codice per eseguire periodicamente il polling dell'operazione con una richiesta get
o wait
che viene restituita quando lo stato dell'operazione è DONE
.
Con una richiesta get
, l'operazione viene restituita immediatamente, indipendentemente dallo
stato dell'operazione. Devi eseguire il polling dell'operazione
periodicamente per sapere quando è stata completata.
Se effettui una richiesta wait
, la richiesta viene restituita quando l'operazione è in data DONE
o se si sta avvicinando la scadenza dei 2 minuti. Puoi scegliere di utilizzare
wait
o get
per eseguire un sondaggio sulle tue operazioni, ma il metodo wait
offre
determinati vantaggi rispetto al metodo get
:
- Puoi configurare i tuoi client in modo che eseguano il polling dello stato delle operazioni meno frequentemente, riducendo l'utilizzo QPS dell'API Compute Engine.
- La latenza media tra il completamento dell'operazione e il momento in cui il client viene informato che l'operazione è stata completata si riduce notevolmente perché il server risponde al termine dell'operazione.
- Il metodo fornisce attese limitate. Il metodo non attende un tempo superiore al timeout HTTP predefinito (2 minuti) e poi restituisce lo stato attuale dell'operazione, che potrebbe essere
DONE
o ancora in corso.
Il metodo wait
è un'API best effort. Se il server è sovraccarico, la richiesta potrebbe restituire prima di raggiungere la scadenza predefinita o dopo aver atteso solo zero secondi. Inoltre, non è garantito che il metodo venga restituito solo quando
l'operazione è DONE
. Ad esempio, se la richiesta si avvicina alla scadenza dei 2 minuti, il metodo restituisce anche se l'operazione non viene eseguita. Per controllare le tue operazioni, ti consigliamo di utilizzare il metodo wait
o get
, in un loop di nuovi tentativi con una fase di sospensione intermedia, per eseguire periodicamente il sondaggio sullo stato dell'operazione. L'intervallo massimo tra i tentativi non deve superare il periodo minimo di conservazione delle operazioni.
Sondaggi di esempio
Negli esempi riportati di seguito viene utilizzato il metodo get
. Puoi sostituire il metodo get
con il metodo wait
: