Neste tutorial, demonstramos como usar o Cloud Run, a API Cloud Vision e o ImageMagick para detectar e desfocar imagens ofensivas enviadas para um bucket do Cloud Storage. Este documento se baseia no tutorial Usar o Pub/Sub com o Cloud Run.
Neste tutorial, explicamos como modificar um aplicativo de amostra atual. Também é possível fazer o download da amostra concluída.
Objetivos
- Grave, crie e implante um serviço de processamento de dados assíncrono no Cloud Run.
- Invocar o serviço fazendo upload de um arquivo para o Cloud Storage, criando uma mensagem do Pub/Sub.
- Usar a API Cloud Vision para detectar conteúdo violento ou adulto.
- Usar o ImageMagick para desfocar imagens ofensivas.
- Testar o serviço fazendo upload de uma imagem de um zumbi comedor de carne.
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.
Antes de começar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Pub/Sub, Cloud Run, Cloud Storage and Cloud Vision APIs.
- Instale e inicialize a CLI gcloud.
- Atualize os componentes:
gcloud components update
- Configure um tópico do Pub/Sub, uma assinatura de push segura e um serviço inicial do Cloud Run para lidar com mensagens seguindo o tutorial Usar o Pub/Sub
Funções exigidas
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:
-
Editor do Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador do Cloud Run (
roles/run.admin
) -
Acessador de exibição de registros (
roles/logging.viewAccessor
) -
Administrador de projetos do IAM (
roles/resourcemanager.projectIamAdmin
) -
Administrador do Pub/Sub (
roles/pubsub.admin
) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser
) -
Consumidor do Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Administrador de armazenamento (
roles/storage.admin
)
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.
Como configurar padrões do gcloud
Para configurar a gcloud com os padrões do serviço do Cloud Run, realize as etapas a seguir:
Defina seu projeto padrão:
gcloud config set project PROJECT_ID
Substitua PROJECT_ID pelo nome do projeto que você criou para este tutorial.
Configure a gcloud para a região escolhida:
gcloud config set run/region REGION
Substitua REGION pela região compatível do Cloud Run.
Locais do Cloud Run
O Cloud Run é regional, o que significa que a infraestrutura que executa seus serviços do Cloud Run está localizada em uma região específica e é gerenciada pelo Google para estar disponível de maneira redundante em todas as zonas da região.
Atender aos seus requisitos de latência, disponibilidade ou durabilidade são os principais fatores para selecionar a região em que seus serviços do Cloud Run são executados.
Geralmente, é possível selecionar a região mais próxima de seus usuários, mas considere a localização dos outros produtos do Google Cloud usados pelo serviço do Cloud Run.
O uso de produtos do Google Cloud em vários locais pode afetar a latência e o custo do serviço.
O Cloud Run está disponível nas regiões a seguir:
Sujeitas aos preços do nível 1
asia-east1
(Taiwan)asia-northeast1
(Tóquio)asia-northeast2
(Osaka)europe-north1
(Finlândia) Baixo CO2europe-southwest1
(Madri) Baixo CO2europe-west1
(Bélgica) Baixo CO2europe-west4
(Países Baixos) Baixo CO2europe-west8
(Milão)europe-west9
(Paris) Baixo CO2me-west1
(Tel Aviv)us-central1
(Iowa) Baixo CO2us-east1
(Carolina do Sul)us-east4
(Norte da Virgínia)us-east5
(Columbus)us-south1
(Dallas) Baixo CO2us-west1
(Oregon) Baixo CO2
Sujeitas aos preços do nível 2
africa-south1
(Johannesburgo)asia-east2
(Hong Kong)asia-northeast3
(Seul, Coreia do Sul)asia-southeast1
(Singapura)asia-southeast2
(Jacarta)asia-south1
(Mumbai, Índia)asia-south2
(Déli, Índia)australia-southeast1
(Sydney)australia-southeast2
(Melbourne)europe-central2
(Varsóvia, Polônia)europe-west10
(Berlim) Baixo CO2europe-west12
(Turim)europe-west2
(Londres, Reino Unido) Baixo CO2europe-west3
(Frankfurt, Alemanha) Baixo CO2europe-west6
(Zurique, Suíça) Baixo CO2me-central1
(Doha)me-central2
(Damã)northamerica-northeast1
(Montreal) Baixo CO2northamerica-northeast2
(Toronto) Baixo CO2southamerica-east1
(São Paulo, Brasil) Baixo CO2southamerica-west1
(Santiago, Chile) Baixo CO2us-west2
(Los Angeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Se você já criou um serviço do Cloud Run, é possível visualizar a região no painel do Cloud Run no console do Google Cloud.
Como entender a sequência de operações
O fluxo de dados neste tutorial segue estas etapas:
- Um usuário faz o upload de uma imagem para um bucket do Cloud Storage.
- O Cloud Storage publica uma mensagem sobre o novo arquivo no Pub/Sub.
- O Pub/Sub envia a mensagem ao serviço do Cloud Run.
- O serviço do Cloud Run recupera o arquivo de imagem mencionado na mensagem do Pub/Sub.
- O serviço do Cloud Run usa a API Cloud Vision para analisar a imagem.
- Se for detectado conteúdo violento ou adulto, o serviço do Cloud Run usará o ImageMagick para desfocar a imagem.
- O serviço do Cloud Run faz upload da imagem desfocada em outro bucket do Cloud Storage para uso.
O próximo uso da imagem desfocada é deixado como um exercício para o leitor.
Criar um repositório padrão do Artifact Registry
Crie um repositório padrão do Artifact Registry para armazenar a imagem do contêiner:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
Substitua:
- REPOSITORY por um nome exclusivo para o repositório.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
Configurar buckets do Cloud Storage
gcloud
Crie um bucket do Cloud Storage para fazer upload de imagens, em que INPUT_BUCKET_NAME é um nome de bucket globalmente exclusivo:
gcloud storage buckets create gs://INPUT_BUCKET_NAME
O serviço do Cloud Run só lê a partir desse bucket.
Crie um segundo bucket do Cloud Storage para receber imagens desfocadas, em que BLURRED_BUCKET_NAME é um nome de bucket globalmente exclusivo:
gcloud storage buckets create gs://BLURRED_BUCKET_NAME
O serviço do Cloud Run faz upload de imagens desfocadas para esse bucket. Usar um bucket separado evita que imagens processadas acionem novamente o serviço.
Por padrão, as revisões do Cloud Run são executadas como a conta de serviço padrão do Compute Engine.
Se, em vez disso, você estiver usando umaconta de serviço gerenciada pelo usuário, verifique se você atribuiu os Papéis do IAM necessários, de modo a ter a permissão
storage.objects.get
para leitura de INPUT_BUCKET_NAME e a permissãostorage.objects.create
para fazer upload para BLURRED_BUCKET_NAME.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
Crie dois buckets do Cloud Storage: um para fazer upload de imagens originais e outro para o serviço do Cloud Run fazer upload de imagens desfocadas.
Para criar buckets do Cloud Storage com nomes globalmente exclusivos, adicione
o seguinte ao seu arquivo main.tf
atual:
Por padrão, as revisões do Cloud Run são executadas como a conta de serviço padrão do Compute Engine.
Se, em vez disso, você estiver usando umaconta de serviço gerenciada pelo usuário, verifique se você atribuiu os
Papéis do IAM necessários, de modo a ter a permissão storage.objects.get
para leitura de
google_storage_bucket.imageproc_input
e a permissão storage.objects.create
para
fazer upload para google_storage_bucket.imageproc_output
.
Nas etapas a seguir, você cria e implanta um serviço que processa notificações de uploads de arquivos para o INPUT_BUCKET_NAME. Você ativa a entrega de notificações depois de implantar e testar o serviço, para evitar a invocação prematura do novo serviço.
Modificar o código de amostra do tutorial do Pub/Sub
Este documento se baseia no código criado no tutorial Usar o Pub/Sub. Se você ainda não concluiu esse tutorial, faça isso agora, ignore as etapas de limpeza e retorne a este documento para adicionar um comportamento de processamento de imagem.
Adicionar código de processamento de imagem
O código de processamento de imagem é separado da manipulação da solicitação para facilitar a leitura e o teste. Para adicionar código de processamento de imagem, siga estas etapas:
Mude para o diretório do código de amostra do tutorial do Pub/Sub.
Adicione o código para importar as dependências de processamento de imagem, incluindo as bibliotecas a serem integradas aos serviços do Google Cloud, ao ImageMagick e ao sistema de arquivos.
Node.js
Abra um novo arquivoimage.js
no seu editor e copie o seguinte:Python
Abra um novo arquivoimage.py
no seu editor e copie o seguinte:Go
Abra um novo arquivoimagemagick/imagemagick.go
no seu editor e copie o seguinte:Java
Abra um novo arquivosrc/main/java/com/example/cloudrun/ImageMagick.java
no seu editor e copie o seguinte:Adicione o código para receber uma mensagem do Pub/Sub como um objeto de evento e controlar o processamento da imagem.
O evento contém dados sobre a imagem enviada originalmente. Esse código determina se a imagem precisa ser desfocada verificando os resultados de uma análise do Cloud Vision em busca de conteúdo violento ou adulto.
Node.js
Python
Go
Java
Recupere a imagem referenciada do bucket de entrada do Cloud Storage criado acima, use o ImageMagick para transformar a imagem com um efeito de desfoque e faça upload do resultado para o bucket de saída.
Node.js
Python
Go
Java
Integrar o processamento de imagens ao código de amostra do Pub/Sub
Para modificar o serviço atual para incorporar o código de processamento de imagem, siga estas etapas:
Adicione novas dependências ao serviço, incluindo as bibliotecas de cliente do Cloud Vision e do Cloud Storage:
Node.js
npm install --save gm @google-cloud/storage @google-cloud/vision
Python
Adicione as bibliotecas de cliente necessárias para que orequirements.txt
fique assim:Go
A amostra de aplicativo em Go usa módulos do Go. Será feito o download automático das novas dependências adicionadas acima na instrução de importaçãoimagemagick/imagemagick.go
pelo próximo comando que precisar delas.Java
Adicione a dependência a seguir em<dependencyManagement>
nopom.xml
: Adicione as dependências a seguir em<dependencies>
nopom.xml
:Adicione o pacote do sistema ImageMagick ao seu contêiner modificando o
Dockerfile
abaixo da instruçãoFROM
. Se estiver usando um Dockerfile "de vários estágios", coloque-o no estágio final.Debian/Ubuntu Alpine Leia mais sobre como trabalhar com pacotes do sistema no serviço do Cloud Run no tutorial Como usar pacotes do sistema.
Substitua o código de tratamento da mensagem do Pub/Sub atual por uma chamada de função para nossa nova lógica de desfoque.
Node.js
O arquivoapp.js
define o aplicativo Express.js e prepara mensagens do Pub/Sub recebidas para uso. Faça as mudanças a seguir:- Adicione código para importar o novo arquivo
image.js
. - Remova o código "Hello World" atual da rota.
- Adicione código para validar ainda mais a mensagem do Pub/Sub.
Adicione código para chamar a nova função de processamento de imagens.
Quando terminar, o código ficará assim:
Python
O arquivomain.py
define o aplicativo Flask e prepara as mensagens do Pub/Sub recebidas para uso. Faça as mudanças a seguir:- Adicione código para importar o novo arquivo
image.py
. - Remova o código "Hello World" atual da rota.
- Adicione código para validar ainda mais a mensagem do Pub/Sub.
Adicione código para chamar a nova função de processamento de imagens.
Quando terminar, o código ficará assim:
Go
O arquivomain.go
define o serviço HTTP e prepara mensagens do Pub/Sub recebidas para uso. Faça as mudanças a seguir:- Adicione código para importar o novo arquivo
imagemagick.go
. - Remova o código "Hello World" atual do gerenciador.
- Adicione código para validar ainda mais a mensagem do Pub/Sub.
- Adicione código para chamar a nova função de processamento de imagens.
Java
O arquivoPubSubController.java
define o controlador que manipula solicitações HTTP e prepara mensagens do Pub/Sub recebidas para uso. Faça as mudanças a seguir:- Adicione as novas importações.
- Remova o código "Hello World" atual do controlador.
- Adicione código para validar ainda mais a mensagem do Pub/Sub.
- Adicione código para chamar a nova função de processamento de imagens.
- Adicione código para importar o novo arquivo
Faça o download da amostra completa
Para recuperar o exemplo de código de processamento de imagem completo para uso:
Clone o repositório do aplicativo de amostra na máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Mude para o diretório que contém o código de amostra do Cloud Run:
Node.js
cd nodejs-docs-samples/run/image-processing/
Python
cd python-docs-samples/run/image-processing/
Go
cd golang-samples/run/image-processing/
Java
cd java-docs-samples/run/image-processing/
Enviar o código
O código de envio consiste em três etapas: criar uma imagem de contêiner com o Cloud Build, fazer upload da imagem de contêiner no Container Artifact e implantar a imagem de contêiner no Cloud Run.
Para enviar o código, siga estas etapas:
Compile seu contêiner e publique no Artifact Registry:
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Em que
pubsub
é o nome do serviço.Substitua:
- PROJECT_ID pelo ID do projeto do Google Cloud
- REPOSITORY pelo nome do repositório do Artifact Registry.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
Após a conclusão, você verá uma mensagem de SUCESSO contendo o ID, a hora da criação e o nome da imagem. A imagem é armazenada no Artifact Registry e poderá ser reutilizada se necessário.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Em que
pubsub
é o nome do serviço.Substitua:
- PROJECT_ID pelo ID do projeto do Google Cloud
- REPOSITORY pelo nome do repositório do Artifact Registry.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
Após a conclusão, você verá uma mensagem de SUCESSO contendo o ID, a hora da criação e o nome da imagem. A imagem é armazenada no Artifact Registry e poderá ser reutilizada se necessário.
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Em que
pubsub
é o nome do serviço.Substitua:
- PROJECT_ID pelo ID do projeto do Google Cloud
- REPOSITORY pelo nome do repositório do Artifact Registry.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
Após a conclusão, você verá uma mensagem de SUCESSO contendo o ID, a hora da criação e o nome da imagem. A imagem é armazenada no Artifact Registry e poderá ser reutilizada se necessário.
Java
Esta amostra usa o Jib (em inglês) para criar imagens do Docker usando ferramentas comuns do Java. O Jib otimiza builds de contêiner sem a necessidade de um Dockerfile ou de ter o Docker (em inglês) instalado. Saiba mais sobre como criar contêineres Java com o Jib.Usando o Dockerfile, configure e crie uma imagem base com os pacotes do sistema instalados para substituir a imagem base padrão do Jib:
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/imagemagick
Substitua:
- PROJECT_ID pelo ID do projeto do Google Cloud
- REPOSITORY pelo nome do repositório do Artifact Registry.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
Use o auxiliar de credencial do gcloud para autorizar o Docker a enviar por push ao Artifact Registry.
gcloud auth configure-docker
Crie seu contêiner final com o Jib e publique no Artifact Registry:
mvn compile jib:build \ -Dimage=REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub \ -Djib.from.image=REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/imagemagick
Substitua:
- PROJECT_ID pelo ID do projeto do Google Cloud
- REPOSITORY pelo nome do repositório do Artifact Registry.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
Execute o comando a seguir para implantar o serviço com o mesmo nome de serviço usado no tutorial Usar o Pub/Sub:
Node.js
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Python
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Go
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --no-allow-unauthenticated
Java
gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub --set-env-vars=BLURRED_BUCKET_NAME=BLURRED_BUCKET_NAME --memory 512M --no-allow-unauthenticated
Em que
pubsub
é o nome do contêiner epubsub-tutorial
é o nome do serviço. A imagem do contêiner é implantada no serviço e na região (Cloud Run) que você configurou anteriormente em Como configurar os padrões do gcloud. Substitua:- PROJECT_ID pelo ID do projeto do Google Cloud
- REPOSITORY pelo nome do repositório do Artifact Registry.
- REGION pela região do Google Cloud a ser usada para o repositório do Artifact Registry.
- BLURRED_BUCKET_NAME pelo bucket do Cloud Storage criado anteriormente para receber imagens desfocadas e definir a variável de ambiente.
A sinalização
--no-allow-unauthenticated
restringe o acesso não autenticado ao serviço. Mantendo o serviço particular, é possível contar com a integração automática do Pub/Sub no Cloud Run para autenticar as solicitações. Consulte Como integrar ao Pub/Sub para mais detalhes sobre como isso é configurado. Consulte Como gerenciar o acesso para mais detalhes sobre a autenticação baseada em IAM.Aguarde até que a implantação esteja concluída. Isso pode levar cerca de 30 segundos. Em caso de sucesso, a linha de comando exibe o URL de serviço.
Ativar as notificações no Cloud Storage
Configure o Cloud Storage para publicar uma mensagem em um tópico do Pub/Sub sempre que um arquivo (conhecido como objeto) for carregado ou alterado. Envie a notificação para o tópico criado anteriormente para que o novo upload do arquivo invoque o serviço.
gcloud
gcloud storage service-agent --project=PROJECT_ID gcloud storage buckets notifications create gs://INPUT_BUCKET_NAME --topic=myRunTopic --payload-format=json
myRunTopic
é o tópico que você criou no tutorial anterior.
Substitua INPUT_BUCKET_NAME pelo nome usado quando você criou os buckets.
Para mais detalhes sobre notificações de bucket de armazenamento, leia Notificações de alteração de objeto.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
Para ativar as notificações, a conta de serviço do Cloud Storage exclusiva do projeto precisa existir e ter a permissão do IAM pubsub.publisher
no tópico do Pub/Sub. Para conceder essa
permissão e criar uma notificação do Cloud Storage, adicione o seguinte ao
arquivo main.tf
atual:
Faça um teste
Faça upload de uma imagem ofensiva, como esta imagem de um zumbi comedor de carne:
curl -o zombie.jpg https://cdn.pixabay.com/photo/2015/09/21/14/24/zombie-949916_960_720.jpg gcloud storage cp zombie.jpg gs://INPUT_BUCKET_NAME
em que INPUT_BUCKET_NAME é o bucket do Cloud Storage criado anteriormente para o upload de imagens.
Navegue até os registros de serviço:
- Navegue até a página do Cloud Run no Console do Google Cloud
- Clique no serviço
pubsub-tutorial
. - Selecione a guia Registros. Os registros podem demorar alguns instantes para aparecer. Se você não os vir imediatamente, verifique outra vez após alguns instantes.
Procure a mensagem
Blurred image: zombie.png
.É possível ver as imagens desfocadas no bucket do Cloud Storage BLURRED_BUCKET_NAME criado anteriormente: localize o bucket na página do Cloud Storage no Console do Google Cloud.
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.
Como 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:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Como excluir recursos do tutorial
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.
Remova a configuração da região padrão da gcloud que você adicionou durante a configuração do tutorial:
gcloud config unset run/region
Remova a configuração do projeto:
gcloud config unset project
Exclua outros recursos do Google Cloud criados neste tutorial:
- Exclua o tópico Pub/Sub
myRunTopic
- Exclua a assinatura do Pub/Sub
myRunSubscription
. - Exclua a imagem do contêiner no Artifact Registry.
- Exclua a conta de serviço do invocador
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
. - Exclua os buckets do Cloud Storage criados para os marcadores
INPUT_BUCKET_NAME
eBLURRED_BUCKET_NAME
.
- Exclua o tópico Pub/Sub
A seguir
- Saiba mais sobre a persistência de dados com o Cloud Run usando o Cloud Storage.
- Entenda como usar a API Cloud Vision para detectar elementos além do conteúdo explícito.
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.