GSP315

Introdução
Nos laboratórios com desafio, apresentamos uma situação e um conjunto de tarefas. Para concluí-las, em vez de seguir instruções detalhadas, você usará o que aprendeu nos laboratórios do curso. Um sistema automático de pontuação (mostrado nesta página) vai avaliar seu desempenho.
Nos laboratórios com desafio, não ensinamos novos conceitos do Google Cloud. O objetivo dessas tarefas é aprimorar aquilo que você já aprendeu, como a alteração de valores padrão ou a leitura e pesquisa de mensagens para corrigir seus próprios erros.
Para alcançar a pontuação de 100%, você precisa concluir todas as tarefas no tempo definido.
Este laboratório é recomendado para estudantes que se inscreveram no selo de habilidade Como configurar um ambiente de desenvolvimento de apps no Google Cloud. Tudo pronto para começar o desafio?
Configuração
Antes de clicar no botão Começar o Laboratório
Leia estas instruções. Os laboratórios são cronometrados e não podem ser pausados. O timer é ativado quando você clica em Iniciar laboratório e mostra por quanto tempo os recursos do Google Cloud vão ficar disponíveis.
Este laboratório prático permite que você realize as atividades em um ambiente real de nuvem, e não em uma simulação ou demonstração. Você vai receber novas credenciais temporárias para fazer login e acessar o Google Cloud durante o laboratório.
Confira os requisitos para concluir o laboratório:
- Acesso a um navegador de Internet padrão (recomendamos o Chrome).
Observação: para executar este laboratório, use o modo de navegação anônima (recomendado) ou uma janela anônima do navegador. Isso evita conflitos entre sua conta pessoal e de estudante, o que poderia causar cobranças extras na sua conta pessoal.
- Tempo para concluir o laboratório: não se esqueça que, depois de começar, não será possível pausar o laboratório.
Observação: use apenas a conta de estudante neste laboratório. Se usar outra conta do Google Cloud, você poderá receber cobranças nela.
Cenário do desafio
Você começou a trabalhar no cargo júnior de engenharia de nuvem na Jooli Inc., onde ajuda as equipes a criar e gerenciar os recursos do Google Cloud.
Seu conhecimento deve ser suficiente para realizar essas tarefas sem guias explicativos.
Seu desafio
Você precisa ajudar uma equipe de desenvolvimento recém-criada com as tarefas iniciais de um projeto novo de armazenamento e organização de fotos, chamado Recordações. A equipe pede para você definir as configurações iniciais do ambiente de desenvolvimento de aplicativos.
Você recebe o pedido para concluir estas tarefas:
- Criar um bucket para armazenar fotos.
- Criar um tópico do Pub/Sub que será usado pela função do Cloud Run que você irá criar.
- Criar uma função do Cloud Run.
- Remover o acesso do engenheiro de nuvem anterior ao projeto "Recordações".
Confira algumas normas da Jooli Inc. que é preciso seguir:
- Crie todos os recursos na região e na zona , a menos que haja uma instrução diferente.
- Use as VPCs do projeto.
- Os nomes têm o formato equipe-recurso. Por exemplo, o nome de uma instância pode ser kraken-webserver1.
- Economize recursos. Como os projetos são monitorados, o uso excessivo de recursos pode levar ao encerramento desse projeto (e talvez da sua função). Por isso, tenha cuidado. Esta é a orientação da equipe de monitoramento: a menos que haja uma instrução diferente, use e2-micro para pequenas VMs do Linux e e2-medium para Windows ou outros aplicativos, como nós do Kubernetes.
Essas tarefas são descritas em detalhes a seguir. Boa sorte!
Tarefa 1: criar um bucket
É preciso criar um bucket com o nome para armazenar as fotos.
Crie o recurso na região e na zona .
Clique em Verificar meu progresso para conferir o objetivo.
Crie um bucket com o nome
Tarefa 2: criar um tópico do Pub/Sub
Crie um tópico do Pub/Sub com o nome para que a função do Cloud Run envie mensagens.
Clique em Verificar meu progresso para conferir o objetivo.
Crie um tópico do Pub/Sub com o nome
Tarefa 3: criar a miniatura da função do Cloud Run
Criar a função
Crie uma função do Cloud Run , que vai gerar uma miniatura a partir de uma imagem adicionada ao bucket .
Verifique se a função do Cloud Run está usando o ambiente Cloud Run functions (2ª geração).
Crie o recurso na região e na zona .
- Crie uma função do Cloud Run (2ª geração) chamada usando o
Node.js 22
.
Observação:
é preciso executar a função do Cloud Run toda vez que um objeto for criado no bucket da Tarefa 1.
Durante o processo, a função poderá pedir permissão para ativar APIs ou conceder papéis a contas de serviço.
Ative cada uma das APIs necessárias e conceda os papéis conforme solicitado.
-
Defina o Ponto de entrada (função a ser executada) como e o Gatilho como Cloud Storage
.
-
Adicione o código a seguir a index.js
:
const functions = require('@google-cloud/functions-framework');
const { Storage } = require('@google-cloud/storage');
const { PubSub } = require('@google-cloud/pubsub');
const sharp = require('sharp');
functions.cloudEvent('{{{ project_0.startup_script.function }}}', async cloudEvent => {
const event = cloudEvent.data;
console.log(`Event: ${JSON.stringify(event)}`);
console.log(`Hello ${event.bucket}`);
const fileName = event.name;
const bucketName = event.bucket;
const size = "64x64";
const bucket = new Storage().bucket(bucketName);
const topicName = "{{{ project_0.startup_script.topic }}}";
const pubsub = new PubSub();
if (fileName.search("64x64_thumbnail") === -1) {
// não tem uma miniatura, extraia a extensão do nome de arquivo
const filename_split = fileName.split('.');
const filename_ext = filename_split[filename_split.length - 1].toLowerCase();
const filename_without_ext = fileName.substring(0, fileName.length - filename_ext.length - 1); // corrija a substring para remover o ponto
if (filename_ext === 'png' || filename_ext === 'jpg' || filename_ext === 'jpeg') {
// por enquanto, só aceita png e jpg
console.log(`Processing Original: gs://${bucketName}/${fileName}`);
const gcsObject = bucket.file(fileName);
const newFilename = `${filename_without_ext}_64x64_thumbnail.${filename_ext}`;
const gcsNewObject = bucket.file(newFilename);
try {
const [buffer] = await gcsObject.download();
const resizedBuffer = await sharp(buffer)
.resize(64, 64, {
fit: 'inside',
withoutEnlargement: true,
})
.toFormat(filename_ext)
.toBuffer();
await gcsNewObject.save(resizedBuffer, {
metadata: {
contentType: `image/${filename_ext}`,
},
});
console.log(`Success: ${fileName} → ${newFilename}`);
await pubsub
.topic(topicName)
.publishMessage({ data: Buffer.from(newFilename) });
console.log(`Message published to ${topicName}`);
} catch (err) {
console.error(`Error: ${err}`);
}
} else {
console.log(`gs://${bucketName}/${fileName} is not an image I can handle`);
}
} else {
console.log(`gs://${bucketName}/${fileName} already has a thumbnail`);
}
});
- Adicione o código a seguir a
package.json
:
{
"name": "thumbnails",
"version": "1.0.0",
"description": "Create Thumbnail of uploaded image",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0",
"@google-cloud/pubsub": "^2.0.0",
"@google-cloud/storage": "^6.11.0",
"sharp": "^0.32.1"
},
"devDependencies": {},
"engines": {
"node": ">=4.3.2"
}
}
Observação: se você receber um erro de permissão recusada informando que pode levar alguns minutos até que todas as permissões necessárias sejam propagadas para o agente de serviço, aguarde alguns minutos e tente de novo. Verifique se todos os papéis relevantes (Agente de Serviço e Receptor de Eventos do Eventarc, Criador do Token da Conta de Serviço e Publicador do Pub/Sub) estão atribuídos às contas de serviço.
Testar a função
- Faça upload de uma imagem PNG ou JPG de sua escolha para o bucket .
Observação: uma alternativa é baixar a imagem https://storage.googleapis.com/cloud-training/gsp315/map.jpg
no seu computador
e enviá-la para o bucket.
A imagem da miniatura vai aparecer logo em seguida (use a opção ATUALIZAR na página de detalhes do bucket).
Após enviar o arquivo de imagem, clique abaixo para conferir seu progresso. Não é necessário esperar a criação da miniatura.
Opcional: se a função for implantada e você não encontrar a miniatura no bucket, verifique se a guia Gatilhos mostra as informações de gatilho que você forneceu anteriormente para a função. Se houver erros anteriores, talvez a função não tenha sido salva corretamente.
Se o gatilho do Cloud Storage não estiver na guia Gatilhos da função, recrie-o (consulte a página de documentação Criar um gatilho para serviços) e envie um novo arquivo para testar outra vez (atualize a página depois de adicionar um novo arquivo).
Clique em Verificar meu progresso para conferir o objetivo.
Verifique a função do Cloud Run
Tarefa 4: remover o engenheiro de nuvem anterior
Você perceberá que há dois usuários definidos no projeto:
- um é sua conta ( com o papel de Proprietário);
- o outro é o engenheiro de nuvem anterior ( com o papel de Leitor).
- Remova o acesso do engenheiro de nuvem anterior ao projeto.
Clique em Verificar meu progresso para conferir o objetivo.
Remova o engenheiro de nuvem anterior
Parabéns!

Próximas etapas / Saiba mais
Este selo de habilidade faz parte dos programas de aprendizado Executar tarefas básicas de infraestrutura no Google Cloud e Cloud Architect do Google. Se você já concluiu os demais cursos do seu programa de aprendizado, consulte o catálogo do Google Cloud Ensina para encontrar outras opções disponíveis.
Treinamento e certificação do Google Cloud
Esses treinamentos ajudam você a aproveitar as tecnologias do Google Cloud ao máximo. Nossas aulas incluem habilidades técnicas e práticas recomendadas para ajudar você a alcançar rapidamente o nível esperado e continuar sua jornada de aprendizado. Oferecemos treinamentos que vão do nível básico ao avançado, com opções de aulas virtuais, sob demanda e por meio de transmissões ao vivo para que você possa encaixá-las na correria do seu dia a dia. As certificações validam sua experiência e comprovam suas habilidades com as tecnologias do Google Cloud.
Manual atualizado em 8 de março de 2025
Laboratório testado em 8 de março de 2025
Copyright 2025 Google LLC. Todos os direitos reservados. Google e o logotipo do Google são marcas registradas da Google LLC. Todos os outros nomes de produtos e empresas podem ser marcas registradas das respectivas empresas a que estão associados.