Neste tutorial, você aprende a usar fluxos de trabalho para vincular uma série de serviços. Ao conectar dois serviços HTTP públicos (usando o Cloud Functions), uma API REST externa e um serviço privado do Cloud Run, é possível criar um aplicativo flexível e sem servidor.
Objetivos
Neste tutorial, você criará um único fluxo de trabalho, conectando um serviço por vez:
- Implantar dois serviços do Cloud Functions: a primeira função gera um número aleatório e, em seguida, transmite esse número para a segunda função, que a multiplica.
- Usando fluxos de trabalho, conecte as duas funções HTTP juntas. Execute o fluxo de trabalho e retorne um resultado que será transmitido para uma API externa.
- Usando o Workflows, conecte uma API HTTP externa
que retorne o
log
para um determinado número. Execute o fluxo de trabalho e retorne um resultado que é passado para um serviço do Cloud Run. - Implantar um serviço do Cloud Run que permita apenas o
acesso autenticado. O serviço retorna
math.floor
para um determinado número. - Usando o Workflows, conecte o serviço do Cloud Run, execute todo o fluxo de trabalho e retorne um resultado final.
O diagrama a seguir mostra uma visão geral do processo e uma visualização do fluxo de trabalho final:
Custos
Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Antes de começar
Algumas das etapas deste documento podem não funcionar corretamente se sua organização aplicar restrições ao ambiente do Google Cloud. Nesse caso, talvez não seja possível concluir tarefas como criar endereços IP públicos ou chaves de contas de serviço. Se você fizer uma solicitação que retorne um erro sobre restrições, veja como Desenvolver aplicativos em um ambiente restrito do Google Cloud.
- Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.
-
Ative as APIs Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, Container Registry, Workflows .
- Instale e inicialize a Google Cloud CLI.
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.
-
Ative as APIs Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, Container Registry, Workflows .
- Instale e inicialize a Google Cloud CLI.
- Atualize os componentes da CLI do Google Cloud:
gcloud components update
- Se você estiver executando comandos no Cloud Shell, já está autenticado com a CLI gcloud. Caso contrário, faça login usando sua
conta:
gcloud auth login
- Crie uma conta de serviço para os fluxos de trabalho usarem:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- Para permitir que a conta de serviço chame serviços autenticados do Cloud Run,
conceda o papel
run.invoker
à conta de serviço dos fluxos de trabalho:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/run.invoker"
Substitua
PROJECT_ID
pelo ID do projeto do Google Cloud. - Defina o local padrão usado neste tutorial:
gcloud config set project PROJECT_ID export REGION=REGION gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
Substitua
REGION
pelo local compatível dos fluxos de trabalho de sua escolha.
Implantar o primeiro serviço do Cloud Functions
Depois de receber uma solicitação HTTP, essa função HTTP gera um número aleatório entre 1 e 100 e, em seguida, retorna o número no formato JSON.
Crie um diretório chamado
randomgen
e mude para ele:mkdir ~/randomgen cd ~/randomgen
Crie um arquivo de texto com o nome de arquivo
main.py
que contém o seguinte código Python:Para aceitar uma dependência do Flask para processamento HTTP, crie um arquivo de texto para o gerenciador de pacotes pip. Nomeie o arquivo como
requirements.txt
e adicione o seguinte:flask>=1.0.2
Implante a função com um gatilho HTTP e permita acesso não autenticado:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
A função pode levar alguns minutos para ser implantada. Se preferir, use a interface do Cloud Functions no Console do Google Cloud para implantar a função.
Depois que a função for implantada, confirme a propriedade
httpsTrigger.url
:gcloud functions describe randomgen
Teste a função com o seguinte comando curl:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
Um número é gerado e retornado aleatoriamente.
Implantar o segundo serviço do Cloud Functions
Depois de receber uma solicitação HTTP, essa função HTTP extrai o input
do
corpo JSON, multiplica-o por dois e retorna o resultado no formato JSON.
Crie um diretório chamado
multiply
e mude para ele:mkdir ~/multiply cd ~/multiply
Crie um arquivo de texto com o nome de arquivo
main.py
que contém o seguinte código Python:Para aceitar uma dependência do Flask para processamento HTTP, crie um arquivo de texto para o gerenciador de pacotes pip. Nomeie o arquivo como
requirements.txt
e adicione o seguinte:flask>=1.0.2
Implante a função com um gatilho HTTP e permita acesso não autenticado:
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
A implantação da função pode levar alguns minutos.Também é possível usar a interface do Cloud Functions no Console do Google Cloud para implantar a função.
Depois que a função for implantada, confirme a propriedade
httpsTrigger.url
:gcloud functions describe multiply
Teste a função com o seguinte comando curl:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
O número 10 deve ser retornado.
Conectar os dois serviços do Cloud Functions em um fluxo de trabalho
Um fluxo de trabalho é composto por uma série de etapas descritas usando a sintaxe dos fluxos de trabalho, que pode ser escrita em formato YAML ou JSON. Essa é a definição do fluxo de trabalho. Para uma explicação detalhada, consulte a página Referência de sintaxe.
Volte ao diretório principal.
cd ~
Crie um arquivo de texto com o nome de arquivo
workflow.yaml
com o seguinte conteúdo:- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
Isso vincula as duas funções HTTP e retorna um resultado final.
Depois de criar o fluxo de trabalho, é possível implantá-lo, o que o prepara para a execução.
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
Substitua
WORKFLOW_NAME
por um nome para o fluxo de trabalho.Execute o fluxo de trabalho:
gcloud workflows run WORKFLOW_NAME
Uma execução é uma única execução da lógica contida na definição de um fluxo de trabalho. Todas as execuções de fluxo de trabalho são independentes, e o rápido escalonamento do Workflows permite um grande número de execuções simultâneas.
Depois que o fluxo de trabalho for executado, o resultado será semelhante a este:
result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED
Conectar um serviço REST público no fluxo de trabalho
Usando o Console do Google Cloud, atualize o fluxo de trabalho e conecte uma API REST pública (math.js), que pode avaliar expressões matemáticas. Por exemplo, curl https://api.mathjs.org/v4/?'expr=log(56)'
.
Abra a página do Workflows no Console do Google Cloud.
Selecione o nome do fluxo de trabalho que você quer atualizar.
Para editar a origem do fluxo de trabalho, clique em
Editar e, em seguida, clique em Próximo.Substitua o código-fonte no editor de fluxo de trabalho pelo seguinte conteúdo:
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - return_result: return: ${log_result}
Isso vincula o serviço REST externo aos serviços do Cloud Functions e retorna um resultado final.
Clique em Deploy.
Implantar um serviço do Cloud Run
Implantar um serviço do Cloud Run que, depois de receber uma solicitação HTTP,
extrai input
do corpo JSON, calcula o math.floor
e retorna
o resultado.
Crie um diretório chamado
floor
e mude para ele:mkdir ~/floor cd ~/floor
Crie um arquivo de texto com o nome de arquivo
app.py
que contenha o seguinte código Python:No mesmo diretório, crie um
Dockerfile
com o seguinte conteúdo:Crie a imagem do contêiner:
export SERVICE_NAME=floor gcloud builds submit --tag gcr.io/PROJECT_ID/${SERVICE_NAME}
Implante a imagem do contêiner no Cloud Run, garantindo que ele aceite apenas chamadas autenticadas:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/PROJECT_ID/${SERVICE_NAME} \ --platform managed \ --no-allow-unauthenticated
Quando você vir o URL do serviço, a implantação estará concluída. Você precisará especificar esse URL ao atualizar a definição do fluxo de trabalho.
Conectar o serviço Cloud Run no fluxo de trabalho
Abra a página do Workflows no Console do Google Cloud.
Selecione o nome do fluxo de trabalho que você quer atualizar.
Para editar a origem do fluxo de trabalho, clique em
Editar e, em seguida, clique em Próximo.Substitua o código-fonte no editor de fluxo de trabalho pelo seguinte conteúdo:
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - floor_function: call: http.post args: url: CLOUD_RUN_SERVICE_URL auth: type: OIDC body: input: ${log_result.body} result: floor_result - return_result: return: ${floor_result}
Substitua
CLOUD_RUN_SERVICE_URL
pelo URL do serviço do Cloud Run.Isso conecta o serviço Cloud Run ao fluxo de trabalho. A chave
auth
garante que um token de autenticação seja transmitido na chamada ao serviço do Cloud Run. Para mais informações, consulte Autenticação de fluxos de trabalho.Clique em Deploy.
Executar o fluxo de trabalho final
Atualize o fluxo de trabalho, transmitindo a conta de serviço:
cd ~ gcloud workflows deploy workflow \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
Execute o fluxo de trabalho:
gcloud workflows run WORKFLOW_NAME
A saída será semelhante a esta:
result: '{"body":{"multiplied":192},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:36:48.762896438Z' state: SUCCEEDED
Parabéns! Você implantou e executou um fluxo de trabalho que conecta uma série de serviços.
Para criar fluxos de trabalho mais complexos usando expressões, saltos condicionais, codificação/decodificação Base64, subfluxos de trabalho e muito mais, consulte a Referência de sintaxe dos fluxos de trabalho e a Visão geral da biblioteca padrão ,
Limpar
Se você criou um novo projeto para este tutorial, exclua o projeto. Se você usou um projeto atual e quer mantê-lo sem as alterações incluídas neste tutorial, exclua os recursos criados para o tutorial.
Excluir o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.
Para excluir o projeto:
- No console do Cloud, acesse a página Gerenciar recursos:
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
delete-tutorial-resources
Exclua o serviço do Cloud Run que você implantou neste tutorial:
gcloud run services delete SERVICE_NAME
SERVICE_NAME é o nome escolhido do serviço.
Também é possível excluir os serviços do Cloud Run no Console do Google Cloud.
Remova as configurações padrão da gcloud que você adicionou durante a configuração do tutorial.
gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project
Exclua o fluxo de trabalho criado neste tutorial:
gcloud workflows delete WORKFLOW_NAME
Exclua as imagens de contêiner denominadas
gcr.io/PROJECT_ID/SERVICE_NAME
do Container Registry.