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.
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 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 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 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.