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 Run 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ê vai usar a Google Cloud CLI para criar um único fluxo de trabalho, conectando um serviço por vez:
- Implantar dois serviços de funções do Cloud Run: a primeira função gera um número aleatório e, em seguida, transmite esse número para a segunda função, que o 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 documento, você usará 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
As restrições de segurança definidas pela sua organização podem impedir que você conclua as etapas a seguir. Para informações sobre solução de problemas, consulte Desenvolver aplicativos em um ambiente restrito do Google Cloud.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com - Atualize os componentes da Google Cloud CLI:
gcloud components update
- Ao executar comandos no Cloud Shell, você já está
autenticado na gcloud CLI. 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 functions/region ${REGION} gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
Substitua
REGION
pelo local do Workflows compatível de sua escolha.
Implantar o primeiro serviço de funções do Cloud Run
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 contenha 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: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 de funções do Cloud Run 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 de funções do Cloud Run
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 contenha 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: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 de funções do Cloud Run 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 de funções do Cloud Run 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
workflow.yaml
que contenha o conteúdo a seguir:- 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
Atualizar seu fluxo de trabalho atual e conectar 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)'
.
Como você implantou seu fluxo de trabalho, também pode editá-lo na página "Fluxos de trabalho" no console do Google Cloud.
Edite o arquivo de origem do fluxo de trabalho e substitua-o pelo conteúdo a seguir:
- 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 de funções do Cloud Run e retorna um resultado final.
Implante o fluxo de trabalho modificado:
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
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 um repositório padrão do Artifact Registry para armazenar a imagem do contêiner do Docker:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION}
Substitua
REPOSITORY
por um nome exclusivo para o repositório.Crie a imagem do contêiner:
export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
Implante a imagem do contêiner no Cloud Run, garantindo que ele aceite apenas chamadas autenticadas:
gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --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
Atualize o fluxo de trabalho atual e especifique o URL do serviço do Cloud Run.
Edite o arquivo de origem do fluxo de trabalho e substitua-o pelo conteúdo a seguir:
- 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 - create_output_map: assign: - outputMap: randomResult: ${randomgen_result} multiplyResult: ${multiply_result} logResult: ${log_result} floorResult: ${floor_result} - return_output: return: ${outputMap}
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 Fazer solicitações autenticadas de um fluxo de trabalho.Implante o fluxo de trabalho modificado:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml
Executar o fluxo de trabalho final:
gcloud workflows run WORKFLOW_NAME
A saída será semelhante a esta:
result: '{"Floor":{"body":"4","code":200 ... "Log":{"body":"4.02535169073515","code":200 ... "Multiply":{"body":{"multiplied":56},"code":200 ... "Random":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' 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:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
delete-tutorial-resources
Exclua o serviço do Cloud Run que você implantou neste tutorial.
Exclua o fluxo de trabalho criado neste tutorial.
Exclua a imagem do contêiner do Artifact Registry.
Remova as configurações padrão da CLI Google Cloud adicionadas durante a configuração do tutorial:
gcloud config unset functions/region gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project