1. Visão geral
O Google Cloud Functions é uma plataforma de computação sem servidor orientada a eventos. O Cloud Functions permite escrever seu código sem se preocupar com o provisionamento de recursos ou o escalonamento para lidar com requisitos em mudança.
As Funções do Cloud escritas em JavaScript são executadas em um ambiente Node.js no Google Cloud Platform. É possível executar a Função do Cloud em qualquer ambiente de execução padrão do Node.js para ativar a portabilidade e os testes locais.
Tutorial
Neste codelab, você vai criar uma Função do Cloud para Node.js que informa se uma temperatura especificada é aceitável ou muito alta. Você vai criar, testar e depurar a Função do Cloud usando o Visual Studio Code na máquina local. Por fim, você vai implantar a função no Google Cloud Platform.
O que você vai aprender
- Functions Framework para Node.js.
- Criar e testar uma função HTTP do Cloud localmente.
- Depurar uma função HTTP na máquina local.
- Implantar uma função HTTP na máquina local.
2. Configuração e requisitos
Pré-requisitos
- SDK Cloud
- Visual Studio Code
- Node.js 8.6.0 ou mais recente (para instalar o Node.js, use o nvm. Para verificar sua versão, execute node --version)
- Conclusão do guia Minha primeira função: Node.js
Custos
Embora este codelab exija apenas uma invocação de uma Função do Cloud implantada, ainda é necessário consultar as informações de preços da API Cloud Functions para entender como o faturamento funciona.
Muitas APIs do Google podem ser usadas sem taxas, mas o uso do Google Cloud Platform (ou seja, os produtos e APIs) não é sem custo financeiro. Você precisa de uma conta de faturamento ativa para usar o Cloud Functions. Lembre-se de que determinados produtos do Google Cloud Platform (GCP) têm um nível "Sempre sem custo financeiro" que você precisa exceder para incorrer no faturamento. Para os fins do codelab, cada invocação do Cloud Functions é contabilizada nesse nível sem custo financeiro. Desde que você permaneça dentro dos limites agregados (em cada mês), não haverá cobranças.
3. Instalar o Functions Framework para Node.js
O Functions Framework para Node.js é um framework FaaS (Functions as a Service) de código aberto para escrever funções portáteis do Node.js, oferecido pela equipe do Google Cloud Functions.
O Functions Framework permite gravar funções leves executadas em diferentes ambientes, inclusive:
- Google Cloud Functions
- Sua máquina de desenvolvimento local
- Cloud Run e Cloud Run no GKE
- Ambientes baseados no Knative
Crie um novo app node.js.
npm init
Ao aceitar os padrões, use index.js como o ponto de entrada do app.
Agora instale o Functions Framework para Node.js.
npm install @google-cloud/functions-framework
Abra o package.json. Verifique se o framework de funções está listado como uma dependência, conforme mostrado no exemplo abaixo.
"dependencies": {
"@google-cloud/functions-framework": "^1.7.1"
}
O Functions Framework foi instalado. Agora você está pronto para criar a Função do Cloud.
4. Criar e testar uma função HTTP do Cloud localmente
Criar uma Função do Cloud local
Nesta seção, você vai criar e testar uma função HTTP que responde a solicitações HTTP.
Crie um novo arquivo chamado index.js no mesmo diretório do arquivo package.json.
Adicione o seguinte:
exports.validateTemperature = async (req, res) => {
try {
if (req.body.temp < 100) {
res.status(200).send("Temperature OK");
} else {
res.status(200).send("Too hot");
}
} catch (error) {
//return an error
console.log("got error: ", error);
res.status(500).send(error);
}
};
Agora você está pronto para testar a função.
Testar a função no Visual Studio Code
A partir deste ponto, este codelab usa o terminal integrado no Visual Studio Code.
No Visual Studio Code, abra uma janela de terminal.
Execute este comando:
node node_modules/@google-cloud/functions-framework --target=validateTemperature
Esse comando inicia um servidor local que está pronto para chamar a função validateTemperature quando o servidor recebe uma solicitação HTTP.
Você verá esta saída na janela do terminal:
Serving function... Function: validateTemperature URL: http://localhost:8080/
Crie uma segunda janela de terminal no VS Code clicando no ícone de adição New Terminal no painel da janela do terminal. Você vai alternar entre essas duas janelas de terminal: a primeira para veicular a função e a segunda para chamar a função usando curl.

É possível alternar entre as janelas de terminal usando o menu suspenso. Se uma janela de terminal estiver veiculando uma função, a lista suspensa vai se referir a ela como node. Caso contrário, ela será referida a zsh (ou o shell que você está usando).
Na segunda janela de terminal, execute o comando a seguir para enviar um payload de temperatura de 50 para o servidor local que veicula a função validateTemperature.
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"50"}'
Você vai receber esta resposta da Função do Cloud:
Temperature OK
Na segunda janela de terminal, teste a função novamente enviando um payload de temperatura "muito alta", conforme mostrado abaixo:
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"120"}'
Você vai receber esta resposta da Função do Cloud:
Too hot
Por fim, teste a função chamando-a com um payload ausente.
curl -X POST http://localhost:8080
Você vai receber esta resposta da Função do Cloud:
Too hot
O ideal é que a função não retorne "muito quente" se nenhuma temperatura for fornecida. Você descobriu um bug no código.
Interrompa a execução da função pressionando Ctrl + C na primeira janela de terminal que veicula a função.
5. Depurar uma função HTTP na máquina local
Abra a paleta de comandos no Visual Studio Code. Se você estiver em um Mac, use Cmd + Shift + P. Se você estiver no Windows, use Ctrl + Shift + P.
Digite auto attach na paleta de comandos e escolha o item principal na lista.

Para este codelab, escolha Only With Flag, conforme mostrado na imagem abaixo:

Agora recarregue a janela do terminal que você usou no VS Code para veicular a função passando o cursor sobre o ícone de aviso que aparece no lado direito.
Clique em Relaunch Terminal.

Na janela do terminal recarregada, execute novamente o framework de funções para disponibilizar a função usando o comando a seguir:
node --inspect node_modules/.bin/functions-framework --target=validateTemperature
em que a flag --inspect informa ao Node.js para detectar um cliente de depuração. Para mais informações, consulte a documentação do Node sobre depuração.
Você está usando node_modules/.bin/functions-framework em vez de node_modules/@google-cloud/functions-framework. É necessário usar o executável vinculado automaticamente em /node_modules/.bin para usar o modo de inspeção.
Desta vez, você verá uma barra de status laranja no VS Code indicando que o depurador está anexado.
Defina um ponto de interrupção na linha 3 clicando na margem à esquerda do número da linha.

O ícone de ponto de interrupção será iluminado em vermelho brilhante, indicando que essa linha de código pode ser acessada pelo depurador.

Na segunda janela de terminal, acesse o ponto de interrupção executando o comando curl a seguir.
curl -X POST http://localhost:8080
Um destaque amarelo vai aparecer na linha 3. Esse destaque indica que essa linha é a instrução atual que está sendo avaliada pelo depurador.

Passe o cursor sobre a variável temp para verificar se o conteúdo dela é undefined, já que a solicitação não forneceu um payload de temperatura.

Clique no ícone de etapa para executar a próxima instrução.
Você verá a instrução atual pular para a parte else da instrução if.

Para esta demonstração, é possível presumir que a especificação exige que todas as solicitações enviem uma leitura de temperatura. No caso improvável de uma leitura de temperatura não ser fornecida, a função vai gerar uma exceção.
Clique no botão "Desconectar" para desconectar o depurador.

Na primeira janela de terminal, interrompa a execução da função pressionando Ctrl + C.
Atualize a função para adicionar uma instrução if para gerar uma exceção se a temperatura for indefinida, conforme mostrado abaixo:
exports.validateTemperature = async (req, res) => {
try {
// add this if statement below line #2
if (!req.body.temp) {
throw "Temperature is undefined";
}
...
Na primeira janela de terminal, comece a executar a Função do Cloud novamente executando o comando a seguir sem a flag –inspect para evitar anexar o depurador.
node node_modules/@google-cloud/functions-framework --target=validateTemperature
Verifique se uma exceção é gerada executando o comando a seguir na segunda janela de terminal:
curl -X POST http://localhost:8080
Você verá esta saída retornada da solicitação:
Temperature is undefined
Na primeira janela de terminal, você também verá o erro registrado pela função.
Serving function... Function: validateTemperature URL: http://localhost:8080/ got error: Temperature is undefined
Agora você pode interromper a execução da função pressionando Ctrl + C na primeira janela de terminal.
6. Implantar uma função HTTP da máquina local no Google Cloud
Agora que você criou, testou e depurou uma Função do Cloud na máquina local, está tudo pronto para implantá-la no Google Cloud.
Verifique se você está usando o projeto criado na etapa 2 localmente executando o comando a seguir:
gcloud config get-value project
Se o projeto especificado na etapa 2 não for a configuração ativa, execute o comando a seguir:
gcloud config set project <project-name-created-step-2>
Em qualquer janela de terminal, execute o comando a seguir:
gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated
em que os parâmetros são explicados da seguinte maneira:
deploy validateTemperature- o subcomando gcloud para implantar uma Função do Cloud com o nomevalidateTemperaturecom um ponto de entrada chamadovalidateTemperature--trigger-http- o tipo de evento de acionamento--runtime nodejs12- o ambiente de execução de destino para essa função--allow-unauthenticated- permite acesso público para chamar a função
Você vai receber uma solicitação para ativar as APIs Cloud Functions. Digite y para ativar as APIs.
API [cloudfunctions.googleapis.com] not enabled on project [1057316433766]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y
Quando a implantação for concluída, você verá o seguinte na saída:
Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: <your-build-id> entryPoint: validateTemperature httpsTrigger: url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature ...
Na janela do terminal, use curl para chamar esse endpoint público.
curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json" -d '{"temp":"50"}'
e confirme se a Função do Cloud foi implantada verificando a resposta apropriada.
Temperature OK
7. Liberar espaço
Para evitar cobranças acidentais, por exemplo, se essa Função do Cloud for invocada mais vezes do que sua alocação mensal de invocação da Função do Cloud no nível sem custo financeiro, exclua a Função do Cloud ou o projeto criado na etapa 2.
Para excluir a Função do Cloud, acesse o console do Cloud Functions em https://console.cloud.google.com/functions/. Verifique se o projeto criado na etapa 2 é o projeto selecionado no momento.
Selecione a função validateTemperature implantada na etapa 6. Em seguida, clique em "Excluir".

Se você quiser excluir todo o projeto, acesse https://console.cloud.google.com/cloud-resource-manager, selecione o projeto criado na etapa 2 e escolha "Excluir". Se você excluir o projeto, será necessário mudar os projetos no SDK Cloud. É possível conferir a lista de todos os projetos disponíveis executando gcloud projects list.
8. Parabéns!
Parabéns por concluir o codelab. Saiba mais sobre como o Cloud Functions oferece suporte ao ambiente de execução do Node.js e como a depuração local funciona com o Cloud Functions.
O que vimos
- Functions Framework para Node.js.
- Criar e testar uma função HTTP do Cloud localmente.
- Depurar uma função HTTP na máquina local.
- Implantar uma função HTTP na máquina local.