1. Introdução
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.
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
Navegue até https://gcpcredits.com/io2022 e clique no botão "Clique aqui para acessar seus créditos":
Na caixa de diálogo seguinte, clique nos botões "Aceitar e continuar" para aceitar os Termos de Serviço:
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:
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":
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
- 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.
- 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.
- 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:
O provisionamento e a conexão ao ambiente devem levar apenas alguns instantes. Quando o processamento for concluído, você verá algo como:
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:
- Uma imagem é salva em um bucket de entrada que gera um evento de criação do Cloud Storage.
- 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.
- 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.
- 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.
- 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.
- 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:
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:
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:
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:
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:
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:
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