Como usar fluxos de trabalho para conectar serviços

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:

  1. 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.
  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 tutorial, há componentes faturáveis do Google Cloud, entre eles:

Use a calculadora de preços para gerar uma estimativa de custo com base no uso previsto.

Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

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.

  1. 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.
  2. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  4. Ative as APIs Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, Container Registry, Workflows .

    Ative as APIs

  5. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  7. Ative as APIs Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, Container Registry, Workflows .

    Ative as APIs

  8. Instale e inicie o SDK do Cloud.
  9. Atualize os componentes da gcloud:
    gcloud components update
  10. Faça login usando sua conta:
    gcloud auth login
  11. Crie uma conta de serviço para os fluxos de trabalho usarem:

    export SERVICE_ACCOUNT=workflows-sa
    gcloud iam service-accounts create ${SERVICE_ACCOUNT}
    

  12. 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 ${GOOGLE_CLOUD_PROJECT} \
        --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
        --role "roles/run.invoker"
    

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

    • PROJECT_ID pelo ID do projeto do Google Cloud
    • REGION pelo local do fluxo de trabalho compatível 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.

  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 contém o seguinte código Python:

    import random, json
    from flask import jsonify
    
    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
    
  4. 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 Cloud para implantar a função.

  5. Depois que a função for implantada, confirme a propriedade httpsTrigger.url:

    gcloud functions describe randomgen
    
  6. 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.

  1. Crie um diretório chamado multiply e mude para ele:

    mkdir ~/multiply
    cd ~/multiply
    
  2. Crie um arquivo de texto com o nome de arquivo main.py que contém o seguinte código Python:

    import random, json
    from flask import jsonify
    
    def multiply(request):
        request_json = request.get_json()
        output = {"multiplied":2*request_json['input']}
        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
    
  4. 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 Cloud para implantar a função.

  5. Depois que a função for implantada, confirme a propriedade httpsTrigger.url:

    gcloud functions describe multiply
    
  6. 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.

  1. Volte ao diretório principal.

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

  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 pelo nome do 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 dos fluxos de trabalho 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 atual e conecte uma API REST pública (math.js) que possa avaliar expressões matemáticas. por exemplo, curl https://api.mathjs.org/v4/?'expr=log(56)'.

  1. Abra a página "Fluxos de trabalho" no Console do Google Cloud:
    Acessar a página "Fluxos de trabalho"

  2. Selecione o nome do fluxo de trabalho que você quer atualizar.

  3. Para editar a origem do fluxo de trabalho, clique em Editar e, em seguida, clique em Próximo.

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

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

  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 a imagem do contêiner:

    export SERVICE_NAME=floor
    gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
    
  5. Implante a imagem do contêiner no Cloud Run, garantindo que ele aceite apenas chamadas autenticadas:

    gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${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

  1. Abra a página "Fluxos de trabalho" no Console do Google Cloud:
    Acessar a página "Fluxos de trabalho"

  2. Selecione o nome do fluxo de trabalho que você quer atualizar.

  3. Para editar a origem do fluxo de trabalho, clique em Editar e, em seguida, clique em Próximo.

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

  5. Clique em Deploy.

Executar o fluxo de trabalho final

  1. Atualize o fluxo de trabalho, transmitindo a conta de serviço:

    cd ~
    gcloud workflows deploy workflow \
    --source=workflow.yaml \
    --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
    
  2. 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 ,

Limpeza

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.

Exclua o projeto

O jeito mais fácil de evitar cobranças é excluir o projeto que você criou para o tutorial.

Para excluir o projeto:

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

delete-tutorial-resources

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

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

  3. Exclua o fluxo de trabalho criado neste tutorial:

    gcloud workflows delete WORKFLOW_NAME
    
  4. Exclua as imagens de contêiner denominadas gcr.io/PROJECT_ID/SERVICE_NAME do Container Registry.

A seguir