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.
Configurar predefinições do gcloud
Para configurar o gcloud com predefinições para o 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 seus 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)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 sua imagem de contentor:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
Substituição:
- 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 esbatidas, 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 acionem novamente 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 imagens originais e outro para o serviço do Cloud Run carregar 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 para conteúdo violento ou para adultos.
Node.js
Python
Ir
Java
Recupere 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
tenha um aspeto semelhante ao 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 de 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.Substituição:
- PROJECT_ID com o seu 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.Substituição:
- PROJECT_ID com o seu 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.Substituição:
- PROJECT_ID com o seu 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 necessidade de um Dockerfile ou de 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
Substituição:
- PROJECT_ID com o seu 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 gcloud credential helper 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
Substituição:
- PROJECT_ID com o seu 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. Substituição:- PROJECT_ID com o seu 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 de 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