Neste documento, há detalhes sobre como construir solicitações e administrar respostas de API do Compute Engine. Confira como:
- construir um corpo de solicitação;
- determinar os URIs de recursos necessários para uma solicitação;
- processar respostas de API;
- Determine se uma solicitação de API foi bem-sucedida.
Este documento não aborda como autenticar na API. Para saber como autenticar na API, leia Autenticar no Compute Engine.
Antes de começar
- Conheça as APIs REST.
- Saiba como autenticar na API Compute Engine.
Como criar uma solicitação de API
A API Compute Engine exige solicitações de API em formato JSON.
Para fazer uma solicitação de API, faça uma solicitação HTTP direta usando ferramentas
como curl ou httplib2, ou use uma das bibliotecas
de cliente disponíveis.
Quando você faz uma solicitação de API que requer um corpo, como uma solicitação POST,
UPDATE ou PATCH, o corpo da solicitação contém as propriedades de recurso
que você quer definir nesta solicitação. Por exemplo, o comando
curl a seguir faz uma solicitação POST ao URI de recurso de instâncias. A solicitação cria uma
instância com as propriedades definidas no corpo da solicitação. O corpo da solicitação é
indicado pela sinalização -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"
}
]
}'O URI da imagem tem um ID de projeto diferente (debian-cloud) do ID do projeto,
porque as imagens pertencem a diferentes projetos, dependendo do tipo de imagem.
Por exemplo, todas as imagens do Debian disponíveis publicamente pelo Compute Engine são hospedadas no projeto debian-cloud.
Ao fazer referência a outro recurso, use o URI do recurso totalmente qualificado.
Por exemplo, a propriedade network usa um URI totalmente qualificado
para a rede default.
Exemplos de solicitações da API
Python
Java
Como criar URIs de recurso
Na API Compute Engine, uma referência a outro recurso Google Cloud é fornecida como um URI totalmente qualificado:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/RESOURCE_TYPE/SPECIFIC_RESOURCE
Sempre que você especificar uma imagem, um tipo de máquina, uma rede ou qualquer outro recurso, será necessário fornecer o URI do recurso ao usar a API. Ferramentas de cliente, como a CLI do Google Cloud e o console Google Cloud , ocultam essa complexidade e criam os URIs de recursos para você. No entanto, ao interagir diretamente com a API , é necessário criar esses URIs de recursos por conta própria.
Há URIs de recurso visivelmente diferentes para tipos de recursos distintos. Por
exemplo, um recurso zonal tem a especificação zone no URI:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/e2-standard-2
Os recursos regionais substituem a especificação zone por uma
especificação region:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME
Da mesma forma, os recursos globais têm a especificação global:
https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/VM_NAME
A API Compute Engine também aceita URIs parciais porque o serviço pode inferir informações como o ID do projeto. Portanto, as seguintes versões parciais dos URIs anteriores também são aceitáveis:
zones/ZONE/machineTypes/e2-standard-2
regions/REGION/addresses/ADDRESS_NAME
project/PROJECT_ID/global/images/VM_NAME
Nos URIs parciais, os URIs zonais e regionais omitiram o código do
projeto, mas o URI da imagem não. Isso ocorre porque as imagens disponíveis publicamente oferecidas
pelo Compute Engine são hospedadas em outros projetos, como debian-cloud para
todas as imagens do Debian e ubuntu-os-cloud para todas as imagens do Ubuntu. Antes de usar essas imagens, você
precisa fornecer o ID do projeto apropriado. Se você omitir
o ID do projeto para imagens, o Compute Engine tentará encontrar a imagem no
seu projeto, e a solicitação falhará porque a imagem não existe.
No entanto, se você usar uma imagem personalizada que pertence ao seu projeto (o mesmo em que está criando esse recurso), será possível omitir a especificação do projeto ao fornecer um URI de imagem.
Como determinar as propriedades necessárias
A documentação de referência da API Compute Engine, disponível para as APIs
v1
e
beta, descreve todas as propriedades possíveis
que podem ser definidas para um recurso específico. Na documentação de referência,
há uma distinção entre as propriedades mutáveis e as imutáveis,
marcadas com [Output Only] na descrição da propriedade. Entretanto, para
determinar as propriedades necessárias para um recurso, é necessário analisar a documentação
específica a essa tarefa.
Por exemplo, se você estiver criando uma instância, leia a documentação Como criar uma instância a partir de uma imagem para ver as propriedades da API necessárias para a solicitação. Se você quiser criar um endereço IP externo estático na API, leia a documentação Endereços IP externos estáticos.
Como validar solicitações de API
Para validar suas solicitações de API, faça o seguinte:
- Na referência da API Compute Engine,
encontre o método que seu código está chamando. Por exemplo,
v1/compute.instances.insert. No menu de conteúdo, clique em Testar. Isso abre a janela Testar esta API.
Em Parâmetros de solicitação, não é preciso fornecer um projeto ou zona, porque a validação não exige o envio da solicitação.
Em Corpo da solicitação, cole sua solicitação.
Os elementos incorretos da solicitação estão sublinhados em azul. Clique em cada seção sublinhada para mais informações sobre o problema a ser resolvido.
Como manipular as respostas de API
Se você fizer uma solicitação que altere (altera) dados, o Compute Engine
retornará um objeto Operation que pode ser pesquisado para receber o status das
operações da solicitação. O recurso Operation tem esta aparência:
{
"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 a solicitação original for transformar (alterar) um recurso zonal, por exemplo, para
capturar o snapshot de um disco ou interromper uma instância, o Compute Engine retornará um
objeto
zoneOperations. Da mesma forma, os recursos regionais e globais retornam um
objeto regionOperations
ou globalOperations,
respectivamente. Para ver o status de uma operação, execute uma
solicitação que use o método get ou wait no recurso específico
Operation e forneça o name da operação.
Sua solicitação só está completa quando o status de recurso Operation é retornado como
DONE. Isso pode levar algum tempo, dependendo da natureza da solicitação. Depois
que o status do recurso Operation é retornado como DONE, verifique se a operação
teve êxito e se houve algum erro.
Por exemplo, a resposta a seguir indica que a operação anterior
foi concluída, especificada pelo status 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, faça uma solicitação get ao recurso para verificar se ele existe e
está em execução. Exemplo:
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"
}Como pesquisar operações
É possível escrever um código para pesquisar periodicamente a operação com uma solicitação
get ou wait que é retornada quando o status da operação é DONE.
Com uma solicitação get, a operação é retornada imediatamente, independentemente do
status dela. Você precisa pesquisar a operação periodicamente para saber quando
ela for concluída.
Se você fizer uma solicitação wait, ela retornará quando a operação for DONE
ou se a solicitação estiver se aproximando do prazo de dois minutos. É possível usar
wait ou get para pesquisar suas operações, mas o método wait oferece
determinados benefícios em relação ao get:
- Você pode configurar seus clientes para pesquisar o status da operação com menos frequência, reduzindo o uso de QPS da API Compute Engine.
- A latência média entre o momento em que a operação é concluída e quando o cliente é informado de que ela foi concluída é significativamente reduzida, porque o servidor responde assim que é concluído.
- O método fornece esperas limitadas. O método aguarda no máximo o
tempo limite HTTP padrão (2 minutos) e retorna o estado atual da
operação, que pode ser
DONEou ainda em andamento.
O método wait é uma API de melhor esforço. Se o servidor estiver sobrecarregado, a
solicitação poderá retornar antes de atingir o prazo padrão ou depois de aguardar
apenas zero segundo. O método também não tem garantia de retornar somente quando a
operação é DONE. Por exemplo, se a solicitação se aproximar do prazo de dois
minutos, o método retornará mesmo que a operação não seja concluída. Para verificar
suas operações, recomendamos usar o método wait ou
get, em um loop de repetição com suspensão intermediária, para analisar
periodicamente o status da operação. O intervalo máximo de tentativas não pode exceder
o período mínimo de armazenamento da operação.
Exemplo de pesquisa
Os exemplos a seguir usam o método get. Você pode substituir o método
get pelo método wait: