Crie uma orquestração baseada em eventos com o Eventarc e o Workflows

1. Introdução

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.png a03f943ca09ac4c.png

O Eventarc facilita a conexão dos serviços do Cloud Run com eventos de várias fontes. Ele permite criar arquiteturas orientadas a eventos em que os microsserviços são acoplados e distribuídos livremente. Ele cuida da ingestão, entrega, segurança, autorização e tratamento de erros de eventos para você.

Os fluxos de trabalho são uma plataforma de orquestração totalmente gerenciada que executa serviços em uma ordem definida por você: um fluxo de trabalho. Esses fluxos de trabalho podem combinar serviços hospedados no Cloud Run ou Cloud Functions, serviços do Google Cloud, como o Cloud Vision AI e BigQuery, e qualquer API baseada em HTTP.

Neste codelab, você criará uma orquestração baseada em eventos de microsserviços para processar imagens. Você usará o Workflows para orquestrar a ordem, as entradas e as saídas de quatro funções de processamento de imagens do Cloud Functions. Você ativará a orquestração para responder aos eventos do Cloud Storage de forma vagamente acoplada ao Eventarc.

No final, você terá uma arquitetura flexível, mas sem servidor, para processar imagens.

e372ceed8c26c5fb.png

O que você aprenderá

  • Uma visão geral do Eventarc e dos fluxos de trabalho
  • Como implantar serviços do Cloud Functions
  • Como orquestrar serviços usando fluxos de trabalho
  • Como fazer os fluxos de trabalho responderem aos eventos do Cloud Storage com o Eventarc

2. Configuração e requisitos

Resgatar créditos

cae48e4b2e19921d.png

Na caixa de diálogo seguinte, clique nos botões "Aceitar e continuar" para aceitar os Termos de Serviço:

27d87930a0daf2f8.png

Depois de aceitar os Termos de Serviço, você será redirecionado para uma página de resumo do faturamento, que inclui um painel como este no canto inferior direito:

2076ea7aa9bf3f65.png

Por fim, ao criar seu primeiro projeto, você verá uma caixa de diálogo que permite atribuir uma conta de faturamento ao projeto. Selecione a conta de faturamento associada aos créditos gratuitos e clique no botão "Criar":

dd3b0e795843296.png

Resumindo, agora você tem uma conta de faturamento e um projeto, e essas duas entidades estão vinculadas de modo que qualquer trabalho que você fizer no codelab de hoje será financiado pelos seus créditos gratuitos**.**

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Se você ainda não tiver uma conta do Gmail ou do Google Workspace, crie uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name é o nome de exibição dos participantes do projeto. Ela é uma string de caracteres não usada pelas APIs do Google e pode ser atualizada a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O Console do Cloud gera automaticamente uma string única: geralmente não importa o que seja. Na maioria dos codelabs, você precisará fazer referência ao ID do projeto, que geralmente é identificado como PROJECT_ID. Então, se você não gostar dele, gere outro ou crie um próprio e veja se ele está disponível. Em seguida, ele fica "congelado" depois que o projeto é criado.
  • Há um terceiro valor, um número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, você precisará ativar o faturamento no Console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se for o caso. Para encerrar os recursos a fim de não gerar o faturamento além deste tutorial, siga as instruções de "limpeza" encontradas no final do codelab. Novos usuários do Google Cloud estão qualificados para o programa de teste gratuito de US$300.

Iniciar o Cloud Shell

Embora o Google Cloud possa ser operado remotamente do seu laptop, neste codelab você usará o Google Cloud Shell, um ambiente de linha de comando executado na nuvem.

No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior direita:

55efc1aaa7a4d3ad.png

O provisionamento e a conexão ao ambiente devem levar apenas alguns instantes. Quando o processamento for concluído, você verá algo como:

7ffe5cbb04455448.png.

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ele oferece um diretório principal permanente de 5 GB e é executado no Google Cloud, melhorando muito o desempenho e a autenticação da rede. Todo o trabalho neste laboratório pode ser feito apenas com um navegador.

Configurar o gcloud

No Cloud Shell, defina o ID do projeto e a região onde você quer implantar o aplicativo. Salve-as como variáveis PROJECT_ID e REGION. VejaLocais do Cloud Functions para as regiões disponíveis.

PROJECT_ID=[YOUR-PROJECT-ID]
REGION=[YOUR-REGION]
gcloud config set core/project $PROJECT_ID
gcloud config set functions/region $REGION

Ativar serviços

Ative todos os serviços necessários:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  eventarc.googleapis.com \
  vision.googleapis.com \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

Faça o download do código-fonte

O código-fonte do aplicativo está na pasta processing-pipelines do repositório eventarc-samples.

Clone o repositório:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

Navegue até a pasta eventarc-samples/processing-pipelines:

cd eventarc-samples/processing-pipelines

3. Visão geral da arquitetura

A arquitetura do aplicativo é a seguinte:

6aa6fbc7721dd6b6.png

  1. Uma imagem é salva em um bucket de entrada que gera um evento de criação do Cloud Storage.
  2. O evento de criação do Cloud Storage é lido pelo Eventarc por meio de um gatilho do Cloud Storage e transmitido para o Workflows como um CloudEvent.
  3. Na primeira etapa do fluxo de trabalho, o Filtro, um serviço do Cloud Functions, usa a API Vision para determinar se a imagem é segura. Se a imagem for segura, o Workflows continuará com as próximas etapas.
  4. Na segunda etapa do fluxo de trabalho, o Labeler, um serviço de Função do Cloud, extrai os rótulos da imagem com a API Vision e os salva no bucket de saída.
  5. Na terceira etapa, Resizer, outro serviço do Cloud Functions, redimensiona a imagem usando ImageSharp e salva a imagem redimensionada no bucket de saída.
  6. Na última etapa, Watermarker, outro serviço do Cloud Functions, adiciona uma marca-d'água de rótulos do rotulador à imagem redimensionada usando o ImageSharp e salva a imagem no bucket de saída.

O aplicativo é acionado por um evento do Cloud Storage e, portanto, é orientado por eventos. O processamento de imagens acontece em um fluxo de trabalho, por isso é uma orquestração. No final, uma orquestração orientada por eventos para uma arquitetura flexível e estruturada sem servidor a fim de processar imagens.

4. Criar buckets

Crie um bucket de entrada para que os usuários façam upload das imagens e um bucket de saída para o pipeline de processamento de imagens salvar as imagens processadas.

Execute o seguinte no Cloud Shell:

BUCKET1=$PROJECT_ID-images-input
BUCKET2=$PROJECT_ID-images-output
gsutil mb -l $REGION gs://$BUCKET1
gsutil mb -l $REGION gs://$BUCKET2

5. Implantar serviço de filtro

Vamos começar implantando o primeiro serviço. Este serviço do Cloud Functions recebe as informações do bucket e do arquivo, determina se a imagem é segura com a API Vision e retorna o resultado.

Na pasta de nível superior processing-pipelines, implante o serviço:

SERVICE_NAME=filter
gcloud functions deploy $SERVICE_NAME \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --entry-point Filter.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp

Depois que a função for implantada, defina o URL do serviço em uma variável, e precisaremos dele mais tarde:

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

6. Implantar serviço de rotulador

O segundo serviço do Cloud Functions recebe as informações do bucket e do arquivo, extrai os rótulos da imagem com a API Vision e os salva no bucket de saída.

Na pasta de nível superior processing-pipelines, implante o serviço:

SERVICE_NAME=labeler
gcloud functions deploy $SERVICE_NAME \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Labeler.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp

Depois que a função for implantada, defina o URL do serviço em uma variável, e precisaremos dele mais tarde:

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

7. Implantar serviço de redimensionador

Este serviço do Cloud Functions recebe as informações do bucket e do arquivo, redimensiona a imagem usando ImageSharp e a salva no bucket de saída.

Na pasta de nível superior processing-pipelines, implante o serviço:

SERVICE_NAME=resizer
gcloud functions deploy $SERVICE_NAME \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Resizer.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp

Depois que a função for implantada, defina o URL do serviço em uma variável, e precisaremos dele mais tarde:

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

8. Implantar serviço de marca-d'água

Esse serviço do Cloud Functions recebe as informações do bucket, arquivo e rótulos, lê o arquivo, adiciona os rótulos como marca-d'água à imagem usando ImageSharp e salva a imagem no bucket de saída.

Na pasta de nível superior processing-pipelines, implante o serviço:

SERVICE_NAME=watermarker
gcloud functions deploy $SERVICE_NAME \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Watermarker.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp

Depois que a função for implantada, defina o URL do serviço em uma variável, e precisaremos dele mais tarde:

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

Neste ponto, todas as quatro funções do Cloud precisam ser implantadas e executadas:

5d7d4061e04c91bb.png

9. Definir e implantar o fluxo de trabalho

Use fluxos de trabalho para reunir serviços de filtro, rotulador, redimensionamento e marca-d'água em um fluxo de trabalho. Os fluxos de trabalho orquestram a chamada desses serviços na ordem e com os parâmetros definidos.

Definir

Os fluxos de trabalho recebem um CloudEvent como parâmetro. Isso virá do Eventarc depois que criarmos um gatilho. Nas duas primeiras etapas, o Workflows registra o evento e extrai as informações do bucket e do arquivo do evento:

main:
  params: [event]
  steps:
  - log_event:
      call: sys.log
      args:
          text: ${event}
          severity: INFO
  - extract_bucket_and_file:
      assign:
      - bucket: ${event.data.bucket}
      - file: ${event.data.name}

Na etapa filter, o Workflows faz uma chamada para o serviço de filtro que implantamos anteriormente. Em seguida, ele registra e verifica a segurança do arquivo:

  - filter:
      call: http.post
      args:
        url: FILTER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: filterResponse
  - log_safety:
      call: sys.log
      args:
          text: ${filterResponse.body.safe}
          severity: INFO
  - check_safety:
      switch:
        - condition: ${filterResponse.body.safe == true}
          next: label
      next: end

Na etapa label, o Workflows faz uma chamada para o serviço de rotuladores e captura a resposta (três principais rótulos):

  - label:
      call: http.post
      args:
        url: LABELER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: labelResponse

Na etapa resize, o Workflows faz uma chamada para o serviço de redimensionamento e captura a resposta (o bucket e o arquivo da imagem redimensionada):

  - resize:
      call: http.post
      args:
        url: RESIZER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: resizeResponse

Na etapa watermark, o Workflows chama o serviço de marca-d'água com a imagem e os marcadores redimensionados e captura o resultado (a imagem redimensionada e com marca d'água):

  - watermark:
      call: http.post
      args:
        url: WATERMARKER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${resizeResponse.body.bucket}
            file: ${resizeResponse.body.file}
            labels: ${labelResponse.body.labels}
      result: watermarkResponse

Na etapa final, o Workflows retorna o código de status HTTP dos serviços de rotulador, redimensionador e marca-d'água:

  - final:
      return:
        label: ${labelResponse.code}
        resize: ${resizeResponse.code}
        watermark: ${watermarkResponse.code}

Implantar

Antes de implantar o fluxo de trabalho, verifique se os URLs de serviço foram substituídos por URLs das funções implantadas manualmente ou usando sed:

Na pasta de nível superior processing-pipelines, acesse a pasta image-v3, onde o arquivo workflows.yaml está localizado:

cd image-v3/

Execute sed para substituir os URLs dos marcadores pelos URLs reais dos serviços implantados:

sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml
sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml
sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml
sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml

Implante o fluxo de trabalho:

WORKFLOW_NAME=image-processing
gcloud workflows deploy $WORKFLOW_NAME \
    --source=workflow.yaml \
    --location=$REGION

Em alguns segundos, o fluxo de trabalho será implantado no console:

92cf4e758bdc3dde.png

10. Criar gatilho

Agora que o fluxo de trabalho foi implantado, a última etapa é conectá-lo aos eventos do Cloud Storage com um gatilho do Eventarc.

Configuração única

A conta de serviço de computação padrão será usada para o acionador. Verifique se ele tem o papel eventarc.eventReceiver:

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
    --role roles/eventarc.eventReceiver

Conceda o papel pubsub.publisher à conta de serviço do Cloud Storage. Isso é necessário para o gatilho do Cloud Storage do Eventarc:

SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_NUMBER)"

gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
    --member serviceAccount:$SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

Criar

Execute o comando a seguir para criar um gatilho. Esse gatilho filtra os novos eventos de criação de arquivos do bucket do Cloud Storage de entrada e os transmite para o fluxo de trabalho que definimos anteriormente:

TRIGGER_NAME=trigger-$WORKFLOW_NAME
gcloud eventarc triggers create $TRIGGER_NAME \
  --location=$REGION \
  --destination-workflow=$WORKFLOW_NAME \
  --destination-workflow-location=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET1" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Você verá que o gatilho foi criado e está pronto na seção do Eventarc no Console do Cloud:

14330c4fa2451bc0.png

11. Teste o pipeline

O pipeline de processamento de imagens está pronto para receber eventos do Cloud Storage. Para testar o pipeline, faça upload de uma imagem para o bucket de entrada:

gsutil cp beach.jpg gs://$BUCKET1

Assim que fizer upload da imagem, você verá uma execução de fluxos de trabalho no estado ativo:

36d07cb63c39e7d9.png

Depois de aproximadamente um minuto, a execução será concluída. Também é possível ver a entrada e a saída do fluxo de trabalho:

229200c79d989c25.png

Se você listar o conteúdo do bucket de saída, verá a imagem redimensionada, a imagem redimensionada e com marca d'água e os rótulos da imagem:

gsutil ls gs://$BUCKET2

gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg
gs://$PROJECT_ID-images-output/beach-400x400.png
gs://$PROJECT_ID-images-output/beach-labels.txt

Para verificar, abra a imagem com marca-d'água e redimensionada para ver o resultado:

75f3c0019ca842ce.jpeg

12. Parabéns

Parabéns, você concluiu o codelab.

O que vimos

  • Uma visão geral do Eventarc e dos fluxos de trabalho
  • Como implantar serviços do Cloud Functions
  • Como orquestrar serviços usando fluxos de trabalho
  • Como fazer os fluxos de trabalho responderem aos eventos do Cloud Storage com o Eventarc