Este tutorial demonstra a utilização do Cloud Run, da Cloud Vision API e do ImageMagick para detetar e esbater imagens ofensivas carregadas para um contentor do Cloud Storage. Este tutorial baseia-se no tutorial Use o Pub/Sub com o Cloud Run.
Este tutorial explica como modificar uma app de exemplo existente. Também pode transferir o exemplo concluído, se quiser.
Objetivos
- Escreva, crie e implemente um serviço de processamento de dados assíncrono no Cloud Run.
- Invocar o serviço carregando um ficheiro para o Cloud Storage ou criando uma mensagem do Pub/Sub.
- Use a API Cloud Vision para detetar conteúdo violento ou para adultos.
- Use o ImageMagick para esbater imagens ofensivas.
- Teste o serviço carregando uma imagem de um zombie carnívoro.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
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.
-
Verify 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.
-
Verify 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 subscrição push segura e um serviço do Cloud Run inicial para processar mensagens seguindo o tutorial Usar o Pub/Sub
-
Editor do Cloud Build (
roles/cloudbuild.builds.editor
) -
Administrador do Cloud Run (
roles/run.admin
) -
Aceder à vista de registos (
roles/logging.viewAccessor
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Administrador do Pub/Sub (
roles/pubsub.admin
) -
Utilizador da conta de serviço (
roles/iam.serviceAccountUser
) -
Consumidor de utilização do serviço (
roles/serviceusage.serviceUsageConsumer
) -
Administrador de armazenamento (
roles/storage.admin
)
Funções necessárias
Para receber as autorizações de que precisa para concluir o tutorial, peça ao seu administrador para lhe conceder as seguintes funções da IAM no seu projeto:
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
Configurar predefinições do gcloud
Para configurar o gcloud com as predefinições do seu serviço do Cloud Run:
Defina o projeto predefinido:
gcloud config set project PROJECT_ID
Substitua PROJECT_ID pelo nome do projeto que criou para este tutorial.
Configure o gcloud para a região escolhida:
gcloud config set run/region REGION
Substitua REGION pela região do Cloud Run suportada à sua escolha.
Localizações do Cloud Run
O Cloud Run é regional, o que significa que a infraestrutura que executa os seus serviços do Cloud Run está localizada numa região específica e é gerida pela Google para estar disponível de forma redundante em todas as zonas dessa região.
O cumprimento dos requisitos de latência, disponibilidade ou durabilidade são fatores
principais para selecionar a região onde os seus serviços do Cloud Run são executados.
Geralmente, pode selecionar a região mais próxima dos seus utilizadores, mas deve considerar a localização dos outros Google Cloudprodutos usados pelo seu serviço do Cloud Run.
A utilização Google Cloud de produtos em conjunto em várias localizações pode afetar
a latência do seu serviço, bem como o custo.
O Cloud Run está disponível nas seguintes regiões:
Sujeito aos preços de Nível 1
asia-east1
(Taiwan)asia-northeast1
(Tóquio)asia-northeast2
(Osaca)asia-south1
(Mumbai, Índia)europe-north1
(Finlândia)Baixo CO2
europe-north2
(Estocolmo)Baixo CO2
europe-southwest1
(Madrid)Baixo CO2
europe-west1
(Bélgica)Baixo CO2
europe-west4
(Países Baixos)Baixo CO2
europe-west8
(Milão)europe-west9
(Paris)Baixo CO2
me-west1
(Telavive)northamerica-south1
(México)us-central1
(Iowa)Baixo CO2
us-east1
(Carolina do Sul)us-east4
(Virgínia do Norte)us-east5
(Columbus)us-south1
(Dallas)Baixo CO2
us-west1
(Oregão)Baixo CO2
Sujeito aos preços de Nível 2
africa-south1
(Joanesburgo)asia-east2
(Hong Kong)asia-northeast3
(Seul, Coreia do Sul)asia-southeast1
(Singapura)asia-southeast2
(Jacarta)asia-south2
(Deli, Índia)australia-southeast1
(Sydney)australia-southeast2
(Melbourne)europe-central2
(Varsóvia, Polónia)europe-west10
(Berlim)Baixo CO2
europe-west12
(Turim)europe-west2
(Londres, Reino Unido)Baixo CO2
europe-west3
(Frankfurt, Alemanha)europe-west6
(Zurique, Suíça)Baixo CO2
me-central1
(Doha)me-central2
(Dammam)northamerica-northeast1
(Montreal)Baixo CO2
northamerica-northeast2
(Toronto)Baixo CO2
southamerica-east1
(São Paulo, Brasil)Baixo CO2
southamerica-west1
(Santiago, Chile)Baixo CO2
us-west2
(Los Angeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Se já criou um serviço do Cloud Run, pode ver a região no painel de controlo do Cloud Run na Google Cloud consola.
Compreender a sequência de operações
O fluxo de dados neste tutorial segue estes passos:
- Um utilizador carrega uma imagem para um contentor do Cloud Storage.
- O Cloud Storage publica uma mensagem sobre o novo ficheiro no Pub/Sub.
- O Pub/Sub envia a mensagem para o serviço do Cloud Run.
- O serviço do Cloud Run obtém o ficheiro de imagem referenciado na mensagem do Pub/Sub.
- O serviço do Cloud Run usa a API Cloud Vision para analisar a imagem.
- Se for detetado conteúdo violento ou para adultos, o serviço Cloud Run usa o ImageMagick para esbater a imagem.
- O serviço do Cloud Run carrega a imagem esbatida para outro contentor do Cloud Storage para utilização.
A utilização subsequente da imagem esbatida é deixada como um exercício para o leitor.
Crie um repositório padrão do Artifact Registry
Crie um repositório padrão do Artifact Registry para armazenar a imagem de contentor:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
Substituir:
- REPOSITORY com um nome exclusivo para o repositório.
- REGION com a Google Cloud região a usar para o repositório do Artifact Registry.
Configure contentores do Cloud Storage
gcloud
Crie um contentor do Cloud Storage para carregar imagens, em que INPUT_BUCKET_NAME é um nome de contentor exclusivo a nível global:
gcloud storage buckets create gs://INPUT_BUCKET_NAME
O serviço do Cloud Run só lê a partir deste contentor.
Crie um segundo contentor do Cloud Storage para receber imagens com efeito de esbatimento, em que BLURRED_BUCKET_NAME é um nome de contentor exclusivo a nível global:
gcloud storage buckets create gs://BLURRED_BUCKET_NAME
O serviço do Cloud Run carrega imagens esbatidas para este contentor. A utilização de um contentor separado impede que as imagens processadas voltem a acionar o serviço.
Por predefinição, as revisões do Cloud Run são executadas como a conta de serviço predefinida do Compute Engine.
Em alternativa, se estiver a usar uma conta de serviço gerida pelo utilizador, certifique-se de que atribuiu as funções do IAM necessárias para que tenha autorização
storage.objects.get
para ler a partir de INPUT_BUCKET_NAME e autorizaçãostorage.objects.create
para carregar para BLURRED_BUCKET_NAME.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform.
Crie dois contentores do Cloud Storage: um para carregar as imagens originais e outro para o serviço do Cloud Run carregar as imagens esbatidas.
Para criar ambos os contentores do Cloud Storage com nomes exclusivos a nível global, adicione o seguinte ao seu ficheiro main.tf
existente:
Por predefinição, as revisões do Cloud Run são executadas como a conta de serviço predefinida do Compute Engine.
Em alternativa, se estiver a usar uma
conta de serviço gerida pelo utilizador, certifique-se de que
atribuiu as funções IAM necessárias
para que tenha autorização storage.objects.get
para ler a partir de
google_storage_bucket.imageproc_input
e
autorização storage.objects.create
para carregar para
google_storage_bucket.imageproc_output
.
Nos passos seguintes, cria e implementa um serviço que processa a notificação de carregamentos de ficheiros para o INPUT_BUCKET_NAME. Ative a entrega de notificações depois de implementar e testar o serviço para evitar a invocação prematura do novo serviço.
Modifique o código de exemplo do tutorial do Pub/Sub
Este tutorial baseia-se no código reunido no tutorial de utilização do Pub/Sub. Se ainda não concluiu esse tutorial, faça-o agora, ignorando os passos de limpeza e, em seguida, volte aqui para adicionar o comportamento de processamento de imagens.
Adicione código de processamento de imagens
O código de processamento de imagens está separado do processamento de pedidos para facilitar a leitura e os testes. Para adicionar código de processamento de imagens:
Altere para o diretório do código de exemplo do tutorial do Pub/Sub.
Adicione código para importar as dependências de processamento de imagens, incluindo bibliotecas para integrar com Google Cloud serviços, o ImageMagick e o sistema de ficheiros.
Node.js
Abra um novo ficheiroimage.js
no editor e copie o seguinte:Python
Abra um novo ficheiroimage.py
no editor e copie o seguinte:Ir
Abra um novo ficheiroimagemagick/imagemagick.go
no editor e copie o seguinte:Java
Abra um novo ficheirosrc/main/java/com/example/cloudrun/ImageMagick.java
no editor e copie o seguinte:Adicione código para receber uma mensagem Pub/Sub como um objeto de evento e controlar o processamento de imagens.
O evento contém dados sobre a imagem carregada originalmente. Este código determina se a imagem tem de ser esbatida verificando os resultados de uma análise do Cloud Vision quanto a conteúdo violento ou para adultos.
Node.js
Python
Ir
Java
Obtenha a imagem referenciada do contentor de entrada do Cloud Storage criado acima, use o ImageMagick para transformar a imagem com um efeito de esbatimento e carregue o resultado para o contentor de saída.
Node.js
Python
Ir
Java
Integre o processamento de imagens no código de exemplo do Pub/Sub
Para modificar o serviço existente de forma a incorporar o código de processamento de imagens:
Adicione novas dependências para o seu serviço, incluindo as bibliotecas de cliente do Cloud Vision e do Cloud Storage:
Node.js
npm install gm @google-cloud/storage @google-cloud/vision
Python
Adicione as bibliotecas cliente necessárias para que o seurequirements.txt
se pareça com o seguinte:Ir
A aplicação de exemplo go usa módulos go. As novas dependências adicionadas acima na declaraçãoimagemagick/imagemagick.go
import são transferidas automaticamente pelo comando seguinte que as necessita.Java
Adicione a seguinte dependência em<dependencyManagement>
nopom.xml
: Adicione as seguintes dependências em<dependencies>
nopom.xml
:Adicione o pacote do sistema ImageMagick ao seu contentor modificando o
Dockerfile
abaixo da declaraçãoFROM
. Se usar um Dockerfile "de várias fases", coloque isto na fase final.Debian/Ubuntu Alpine Leia mais sobre como trabalhar com pacotes do sistema no seu serviço do Cloud Run no tutorial sobre a utilização de pacotes do sistema.
Substitua o código de processamento de mensagens Pub/Sub existente por uma chamada de função à nossa nova lógica de esbatimento.
Node.js
O ficheiroapp.js
define a app Express.js e prepara as mensagens do Pub/Sub recebidas para utilização. Faça as seguintes alterações:- Adicione código para importar o novo ficheiro
image.js
- Remova o código "Hello World" existente do caminho
- 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 tem o seguinte aspeto:
Python
O ficheiromain.py
define a app Flask e prepara as mensagens do Pub/Sub recebidas para utilização. Faça as seguintes alterações:- Adicione código para importar o novo ficheiro
image.py
- Remova o código "Hello World" existente do caminho
- 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 tem o seguinte aspeto:
Ir
O ficheiromain.go
define o serviço HTTP e prepara as mensagens do Pub/Sub recebidas para utilização. Faça as seguintes alterações:- Adicione código para importar o novo ficheiro
imagemagick.go
- Remova o código "Hello World" existente 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
Java
O ficheiroPubSubController.java
define o controlador que processa os pedidos HTTP e prepara as mensagens Pub/Sub recebidas para utilização. Faça as seguintes alterações:- Adicione as novas importações
- Remova o código "Hello World" existente 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 ficheiro
Transfira o exemplo completo
Para obter o exemplo de código de processamento de imagens completo para utilização:
Clone o repositório da app de exemplo para a sua máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Ir
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Altere para o diretório que contém o código de exemplo do Cloud Run:
Node.js
cd nodejs-docs-samples/run/image-processing/
Python
cd python-docs-samples/run/image-processing/
Ir
cd golang-samples/run/image-processing/
Java
cd java-docs-samples/run/image-processing/
Envie o código
O código de envio consiste em três passos: criar uma imagem de contentor com o Cloud Build, carregar a imagem de contentor para o Artifact Registry e implementar a imagem de contentor no Cloud Run.
Para enviar o código:
Crie o contentor e publique-o no Artifact Registry:
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Em que
pubsub
é o nome do seu serviço.Substituir:
- PROJECT_ID com o Google Cloud ID do projeto
- REPOSITORY com o nome do repositório do Artifact Registry.
- REGION com a Google Cloud região a usar para o repositório do Artifact Registry.
Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Artifact Registry e pode ser reutilizada, se necessário.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Em que
pubsub
é o nome do seu serviço.Substituir:
- PROJECT_ID com o Google Cloud ID do projeto
- REPOSITORY com o nome do repositório do Artifact Registry.
- REGION com a Google Cloud região a usar para o repositório do Artifact Registry.
Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Artifact Registry e pode ser reutilizada, se necessário.
Ir
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/pubsub
Em que
pubsub
é o nome do seu serviço.Substituir:
- PROJECT_ID com o Google Cloud ID do projeto
- REPOSITORY com o nome do repositório do Artifact Registry.
- REGION com a Google Cloud região a usar para o repositório do Artifact Registry.
Após a conclusão com êxito, é apresentada uma mensagem SUCCESS com o ID, a hora de criação e o nome da imagem. A imagem é armazenada no Artifact Registry e pode ser reutilizada, se necessário.
Java
Este exemplo usa o Jib para criar imagens do Docker com ferramentas Java comuns. O Jib otimiza as compilações de contentores sem precisar de um Dockerfile nem ter o Docker instalado. Saiba mais sobre como criar contentores Java com o Jib.Usando o Dockerfile, configure e crie uma imagem de base com os pacotes do sistema instalados para substituir a imagem de base predefinida do Jib:
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID /REPOSITORY/imagemagick
Substituir:
- PROJECT_ID com o Google Cloud ID do projeto
- REPOSITORY com o nome do repositório do Artifact Registry.
- REGION com a Google Cloud região a usar para o repositório do Artifact Registry.
Use o auxiliar de credenciais gcloud para autorizar o Docker a enviar para o seu Artifact Registry.
gcloud auth configure-docker
Crie o contentor final com o Jib e publique-o 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
Substituir:
- PROJECT_ID com o Google Cloud ID do projeto
- REPOSITORY com o nome do repositório do Artifact Registry.
- REGION com a Google Cloud região a usar para o repositório do Artifact Registry.
Execute o seguinte comando para implementar o seu serviço, usando o mesmo nome do serviço que usou 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
Ir
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
Onde
pubsub
é o nome do contentor epubsub-tutorial
é o nome do serviço. Tenha em atenção que a imagem do contentor é implementada no serviço e na região (Cloud Run) que configurou anteriormente em Configurar predefinições do gcloud. Substituir:- PROJECT_ID com o Google Cloud ID do projeto
- REPOSITORY com o nome do repositório do Artifact Registry.
- REGION com a Google Cloud região a usar para o repositório do Artifact Registry.
- BLURRED_BUCKET_NAME com o contentor do Cloud Storage que criou anteriormente para receber imagens esbatidas para definir a variável de ambiente.
A flag
--no-allow-unauthenticated
restringe o acesso não autenticado ao serviço. Ao manter o serviço privado, pode confiar na integração automática do Pub/Sub do Cloud Run para autenticar pedidos. Consulte o artigo Integração com o Pub/Sub para ver mais detalhes sobre como esta opção é configurada. Consulte o artigo Gerir o acesso para mais detalhes sobre a autenticação baseada na IAM.Aguarde até que a implementação esteja concluída. Este processo pode demorar cerca de meio minuto. Se for bem-sucedido, a linha de comandos apresenta o URL do serviço.
Ative as notificações do Cloud Storage
Configurar o Cloud Storage para publicar uma mensagem num tópico do Pub/Sub sempre que um ficheiro (conhecido como um objeto) é carregado ou alterado. Envie a notificação para o tópico criado anteriormente para que qualquer novo carregamento de ficheiro 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 criou no tutorial anterior.
Substitua INPUT_BUCKET_NAME pelo nome que usou quando criou os grupos.
Para mais detalhes sobre as notificações de contentores de armazenamento, leia o artigo sobre as notificações de alterações de objetos.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform.
Para ativar as notificações, a conta de serviço do Cloud Storage
exclusiva do projeto tem de existir e ter a autorização do IAM
pubsub.publisher
no tópico do Pub/Sub. Para conceder esta autorização e criar uma notificação do Cloud Storage, adicione o seguinte ao seu ficheiro main.tf
existente:
Experimentar
Carregar uma imagem ofensiva, como esta imagem de um zombie carnívoro:
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
onde INPUT_BUCKET_NAME é o contentor do Cloud Storage que criou anteriormente para carregar imagens.
Navegue para os registos de serviço:
- Navegue para a página do Cloud Run na Google Cloud consola
- Clique no serviço
pubsub-tutorial
. - Selecione o separador Registos. Os registos podem demorar alguns momentos a aparecer. Se não os vir imediatamente, verifique novamente após alguns momentos.
Procure a mensagem
Blurred image: zombie.png
.Pode ver as imagens esbatidas no contentor do BLURRED_BUCKET_NAMECloud Storage que criou anteriormente: localize o contentor na página do Cloud Storage na Google Cloud consola
Limpar
Se criou um novo projeto para este tutorial, elimine o projeto. Se usou um projeto existente e quer mantê-lo sem as alterações adicionadas neste tutorial, elimine os recursos criados para o tutorial.
Eliminar o projeto
A forma mais fácil de eliminar a faturação é eliminar o projeto que criou para o tutorial.
Para eliminar 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.
Eliminar recursos do tutorial
Elimine o serviço do Cloud Run que implementou neste tutorial:
gcloud run services delete SERVICE-NAME
Onde SERVICE-NAME é o nome do serviço escolhido.
Também pode eliminar serviços do Cloud Run a partir da Google Cloud consola.
Remova a configuração da região predefinida do gcloud que adicionou durante a configuração do tutorial:
gcloud config unset run/region
Remova a configuração do projeto:
gcloud config unset project
Elimine outros Google Cloud recursos criados neste tutorial:
- Elimine o tópico do Pub/Sub
myRunTopic
- Elimine a subscrição do Pub/Sub
myRunSubscription
- Elimine a imagem de contentor do Artifact Registry.
- Elimine a conta de serviço do invocador
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
- Elimine os contentores do Cloud Storage criados para os marcadores de posição
INPUT_BUCKET_NAME
eBLURRED_BUCKET_NAME
- Elimine o tópico do Pub/Sub
O que se segue?
- Saiba mais sobre a persistência de dados com o Cloud Run através do Cloud Storage.
- Compreenda como usar a API Cloud Vision para detetar elementos além de conteúdo explícito.
- Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.