1. Visão geral
O Google Cloud Functions é uma plataforma de computação sem servidor com base em eventos. O Cloud Functions permite escrever código sem se preocupar com o provisionamento de recursos ou com o escalonamento para lidar com mudanças de requisitos.
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 Node.js padrão 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 quente. Você vai criar, testar e depurar a função do Cloud usando o Visual Studio Code na sua 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.
- Crie e teste uma função do Cloud em HTTP localmente.
- Depure uma função HTTP na máquina local.
- Implante uma função HTTP da máquina local.
2. Configuração e requisitos
Pré-requisitos
- SDK do 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 o nó: versão)
- Já ter feito o curso Minha primeira função: guia do Node.js.
Custos
Embora este codelab exija apenas uma invocação de uma função do Cloud implantada, consulte as informações de preços da API Cloud Functions para entender como o faturamento funciona.
Embora muitas APIs do Google possam ser usadas sem taxas, o uso do Google Cloud Platform (ou seja, seus produtos e APIs) não é sem custo financeiro. Você vai precisar de uma conta de faturamento ativa para usar o Cloud Functions. Alguns produtos do Google Cloud Platform (GCP) têm um nível "Sempre sem custo financeiro" que precisa ser excedido para gerar faturamento. Para os fins deste 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 de código aberto da FaaS (função como serviço) para escrever funções portáteis do Node.js oferecidas pela equipe do Google Cloud Functions.
Com o Functions Framework, é possível escrever funções leves que são executadas em vários ambientes diferentes, incluindo:
- Google Cloud Functions
- Sua máquina de desenvolvimento local
- Cloud Run e Cloud Run no GKE
- Ambientes baseados em 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 seu 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 sua função do Cloud.
4. Criar e testar uma função do Cloud em HTTP localmente
Criar uma função local do Cloud
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 está tudo 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ê vai ver a seguinte saída na janela do terminal:
Serving function... Function: validateTemperature URL: http://localhost:8080/
Crie uma segunda janela do terminal no VS Code clicando no ícone de adição New Terminal
no painel da janela do terminal. Você alternará entre essas duas janelas de terminal: a primeira para exibir a função e a segunda para chamar a função usando curl.
É possível alternar entre as janelas do terminal usando o menu suspenso. Se uma janela de terminal estiver atendendo a uma função, a lista suspensa vai se referir a ela como node
. Caso contrário, ele será chamado de zsh
(ou ao shell que você estiver usando).
Na janela do segundo terminal, execute o comando a seguir para enviar um payload de temperatura de 50 ao servidor local que exibe a função validateTemperature
.
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"50"}'
Você vai receber a seguinte resposta da função do Cloud:
Temperature OK
Na janela do segundo 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 a seguinte resposta da função da nuvem:
Too hot
Por fim, teste a função chamando-a com um payload ausente.
curl -X POST http://localhost:8080
Você vai receber a seguinte resposta da função do Cloud:
Too hot
O ideal é que a função não retorne "muito quente" se nenhuma temperatura for informada. Você descobriu um bug no código.
Para interromper a execução da função, pressione Ctrl + C
na primeira janela do terminal que exibe a função.
5. Depurar uma função HTTP da máquina local
Abra a Paleta de comandos no Visual Studio Code. Se 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 primeiro item da lista.
Para este codelab, escolha Only With Flag
, conforme mostrado na imagem abaixo:
Agora, recarregue a janela do terminal usada no VS Code para exibir sua função. Para isso, passe o cursor sobre o ícone de aviso que aparece à direita.
Clique em Relaunch Terminal
.
Na janela de terminal recarregada, execute novamente o framework de funções para oferecer sua função usando o seguinte comando:
node --inspect node_modules/.bin/functions-framework --target=validateTemperature
em que a flag --inspect
instrui o Node.js a detectar um cliente de depuração. Para mais informações, consulte a documentação do nó sobre depuração.
Observe que você está usando node_modules/.bin/functions-framework em vez de node_modules/@google-cloud/functions-framework. É necessário usar o executável com link simbólico automático em /node_modules/.bin para usar o modo de inspeção.
Dessa vez, você vai ver uma barra de status laranja no VS Code indicando que o depurador está conectado.
Defina um ponto de interrupção na linha 3 clicando dentro da margem à esquerda do número da linha.
O ícone de ponto de interrupção vai acender em vermelho brilhante, indicando que essa linha de código está acessível pelo depurador.
Na janela do segundo terminal, acesse o ponto de interrupção executando o seguinte comando curl.
curl -X POST http://localhost:8080
Você verá um destaque amarelo acima da linha 3. Esse destaque indica que essa linha é a declaraçã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 do step-over para executar a próxima instrução.
A instrução atual vai para a parte else da instrução if.
Para esta demonstração, você pode 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 do terminal, pressione Ctrl + C
para interromper a execução da função.
Atualize a função para adicionar uma instrução "if" e gerar uma exceção se a temperatura estiver 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 do terminal, execute a função do Cloud novamente executando o comando a seguir sem a flag –inspect para evitar a vinculação do depurador.
node node_modules/@google-cloud/functions-framework --target=validateTemperature
Verifique se uma exceção foi gerada executando o seguinte comando na janela do segundo terminal:
curl -X POST http://localhost:8080
A seguinte resposta será retornada da solicitação:
Temperature is undefined
Na primeira janela do 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 é possível parar de executar sua função pressionando Ctrl + C na primeira janela do terminal.
6. Implante uma função HTTP da sua máquina local no Google Cloud
Agora que você criou, testou e depurou uma Função do Cloud na sua máquina local, está tudo pronto para implantar no Google Cloud.
Para verificar se o projeto criado na etapa 2 está sendo usado localmente, execute o seguinte comando:
gcloud config get-value project
Se o projeto especificado na etapa 2 não for a configuração ativa, execute o seguinte comando:
gcloud config set project <project-name-created-step-2>
Em qualquer janela de terminal, execute o seguinte comando:
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 nomevalidateTemperature
com um ponto de entrada chamadovalidateTemperature
--trigger-http
: o tipo de evento acionador--runtime nodejs12
: ambiente de execução desejado para esta função--allow-unauthenticated
: permite o 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 estiver 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 que a função do Cloud foi implantada com sucesso verificando a resposta adequada.
Temperature OK
7. Limpar
Para evitar cobranças acidentais, por exemplo, esta função do Cloud é invocada mais vezes do que sua alocação mensal de invocação de 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 que você criou na etapa 2 é o projeto selecionado.
Selecione a função validateTemperature que você implantou na etapa 6. Em seguida, pressione Delete.
Se você optar por excluir o projeto inteiro, acesse https://console.cloud.google.com/cloud-resource-manager, selecione o projeto criado na etapa 2 e escolha "Excluir". Se você excluir o projeto, precisará alterar os projetos no SDK Cloud. Para conferir a lista de todos os projetos disponíveis, execute o comando 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
- Framework de funções para Node.js.
- Crie e teste uma função do Cloud em HTTP localmente.
- Depure uma função HTTP na máquina local.
- Implante uma função HTTP da máquina local.