Tutorial para usar fluxos de trabalho com as funções do Cloud Run e do Cloud Run


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 funções do Cloud Run, uma API REST externa e um serviço particular 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:

  1. 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.
  2. 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.
  3. 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.
  4. Implantar um servi�o do Cloud Run que permita apenas o acesso autenticado. O servi�o retorna math.floor para um determinado n�mero.
  5. 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:

Visualiza��o dos fluxos de trabalho

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. Novos usu�rios do Google Cloud podem estar qualificados para uma avalia��o gratuita.

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.

  1. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Verifique se a cobran�a est� ativada para o seu projeto do Google Cloud.

  6. 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
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. 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.

  10. Verifique se a cobran�a est� ativada para o seu projeto do Google Cloud.

  11. 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
  12. Atualize os componentes da Google Cloud CLI:
    gcloud components update
  13. 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
  14. 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.

  15. Se voc� for o criador do projeto, receber� o papel de propriet�rio b�sico (roles/owner). Por padr�o, esse papel do gerenciamento de identidade e acesso (IAM) inclui as permiss�es necess�rias para acesso total � maioria dos recursos do Google Cloud, e voc� pode pular esta etapa.

    Se voc� n�o � o criador do projeto, as permiss�es necess�rias precisam ser concedidas ao principal apropriado. Por exemplo, um principal pode ser uma Conta do Google (para usu�rios finais) ou uma conta de servi�o (para aplicativos e cargas de trabalho de computa��o). Para mais informa��es, consulte a p�gina Pap�is e permiss�es do destino do evento.

    Permiss�es necess�rias

    Para conseguir as permiss�es necess�rias para concluir o tutorial, pe�a ao administrador para conceder a voc� os seguintes pap�is do IAM no seu projeto:

    Para mais informa��es sobre a concess�o de pap�is, consulte Gerenciar o acesso a projetos, pastas e organiza��es.

    Tamb�m � poss�vel conseguir as permiss�es necess�rias por meio de pap�is personalizados ou de outros pap�is predefinidos.

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.

  1. Crie um diret�rio chamado randomgen e mude para ele:

    mkdir ~/randomgen
    cd ~/randomgen
  2. Crie um arquivo de texto com o nome de arquivo main.py que contenha o seguinte c�digo Python:

    import functions_framework
    import random
    from flask import jsonify
    
    
    @functions_framework.http
    def randomgen(request):
        randomNum = random.randint(1, 100)
        output = {"random": randomNum}
        return jsonify(output)
  3. 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
    functions-framework==3.0.0
  4. Crie uma conta de servi�o para os fluxos de trabalho usarem:

    export SERVICE_ACCOUNT=workflows-sa
    gcloud iam service-accounts create ${SERVICE_ACCOUNT}
  5. 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"
  6. Implante a fun��o com um gatilho HTTP e permita acesso n�o autenticado:

    gcloud functions deploy randomgen-function \
        --gen2 \
        --runtime python310 \
        --entry-point=randomgen \
        --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.

  7. Depois que a fun��o randomgen for implantada, confirme a propriedade httpsTrigger.url:

    gcloud functions describe randomgen-function \
        --gen2 \
        --format="value(serviceConfig.uri)"
  8. Salve o URL. � necess�rio adicion�-lo ao arquivo de origem do fluxo de trabalho em exerc�cios posteriores.

  9. Teste a fun��o com o seguinte comando curl:

    curl $(gcloud functions describe randomgen-function \
        --gen2 \
        --format="value(serviceConfig.uri)")

    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.

  1. Volte ao diret�rio principal.

    cd ~
  2. Crie um diret�rio chamado multiply e mude para ele:

    mkdir ~/multiply
    cd ~/multiply
  3. Crie um arquivo de texto com o nome de arquivo main.py que contenha o seguinte c�digo Python:

    import functions_framework
    from flask import jsonify
    
    
    @functions_framework.http
    def multiply(request):
        request_json = request.get_json()
        output = {"multiplied": 2 * request_json['input']}
        return jsonify(output)
  4. 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
    functions-framework==3.0.0
  5. Implante a fun��o com um gatilho HTTP e permita acesso n�o autenticado:

    gcloud functions deploy multiply-function \
        --gen2 \
        --runtime python310 \
        --entry-point=multiply \
        --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.

  6. Depois que a fun��o multiply for implantada, confirme a propriedade httpsTrigger.url:

    gcloud functions describe multiply-function \
        --gen2\
        --format="value(serviceConfig.uri)"
  7. Salve o URL. � necess�rio adicion�-lo ao arquivo de origem do fluxo de trabalho em exerc�cios posteriores.

  8. Teste a fun��o com o seguinte comando curl:

    curl -X POST MULTIPLY_FUNCTION_URL \
        -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
        -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.

  1. Volte ao diret�rio principal.

    cd ~
  2. Crie um arquivo de texto com o nome workflow.yaml que contenha o conte�do a seguir:

    - randomgen_function:
        call: http.get
        args:
            url: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            body:
                input: ${randomgen_result.body.random}
        result: multiply_result
    - return_result:
        return: ${multiply_result}
    

    Esse arquivo de origem vincula as duas fun��es HTTP e retorna um resultado final.

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

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

  1. Edite o arquivo de origem do fluxo de trabalho e substitua-o pelo conte�do a seguir:

    - randomgen_function:
        call: http.get
        args:
            url: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            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.

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

  1. Crie um diret�rio chamado floor e mude para ele:

    mkdir ~/floor
    cd ~/floor
  2. Crie um arquivo de texto com o nome de arquivo app.py que contenha o seguinte c�digo Python:

    import json
    import logging
    import os
    import math
    
    from flask import Flask, request
    
    app = Flask(__name__)
    
    
    @app.route('/', methods=['POST'])
    def handle_post():
        content = json.loads(request.data)
        input = float(content['input'])
        return f"{math.floor(input)}", 200
    
    
    if __name__ != '__main__':
        # Redirect Flask logs to Gunicorn logs
        gunicorn_logger = logging.getLogger('gunicorn.error')
        app.logger.handlers = gunicorn_logger.handlers
        app.logger.setLevel(gunicorn_logger.level)
        app.logger.info('Service started...')
    else:
        app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

  3. No mesmo diret�rio, crie um Dockerfile com o seguinte conte�do:

    # Use an official lightweight Python image.
    # https://hub.docker.com/_/python
    FROM python:3.7-slim
    
    # Install production dependencies.
    RUN pip install Flask gunicorn
    
    # Copy local code to the container image.
    WORKDIR /app
    COPY . .
    
    # Run the web service on container startup. Here we use the gunicorn
    # webserver, with one worker process and 8 threads.
    # For environments with multiple CPU cores, increase the number of workers
    # to be equal to the cores available.
    CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app

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

  5. Crie a imagem do cont�iner:

    export SERVICE_NAME=floor
    gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
  6. 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 \
        --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.

  1. Edite o arquivo de origem do fluxo de trabalho e substitua-o pelo conte�do a seguir:

    - randomgen_function:
        call: http.get
        args:
            url: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            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 RANDOMGEN_FUNCTION_URL pelo URL da fun��o randomgen.
    • Substitua MULTIPLY_FUNCTION_URL pelo URL da fun��o multiply.
    • 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.

  2. Implante o fluxo de trabalho modificado:

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml
  3. 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:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

delete-tutorial-resources

A seguir