Aplicativos MEAN Stack sem servidor com Cloud Run e MongoDB Atlas
Abirami Sukumaran, Stanimira Vlaeva8 min read • Published Jun 13, 2022 • Updated Apr 02, 2024
Avalie esse Tutorial
Como desenvolvedores de aplicativos modernos, estamos lidando com muitas prioridades: desempenho, flexibilidade, usabilidade, segurança, confiabilidade e facilidade de manutenção. Além disso, estamos lidando com dependências, configuração e implantação de vários componentes em vários ambientes e, às vezes, também em vários repositórios. E então temos que manter as coisas seguras e simples. Ah, o pesadelo!
Essa é a razão pela qual usamos computação sem servidor. O Serverless permite que os desenvolvedores se concentrem no que mais gostam de fazer - o desenvolvimento - e deixem o restante dos atributos, incluindo infraestrutura e manutenção, para as ofertas de plataforma.
Nesta leitura, vamos ver como o Cloud Run e o MongoDB se unem para permitir uma experiência de desenvolvimento de aplicativos de pilha MEAN completamente sem servidor. Aprenderemos como criar um aplicativo MEAN sem servidor com Cloud Run e MongoDB Atlas, a plataforma de dados para desenvolvedores de várias nuvens do MongoDB.
Todas as plataformas sem servidor oferecem recursos interessantes:
- Função orientada a eventos (embora não seja um requisito rígido)
- Manutenção sem infraestrutura
- Preços com base no uso
- Recursos de auto-scaling
Cloud Run se destaca por nos permitir:
- Código do pacote em vários contêineres sem estado que reconhecem solicitações e o invocam por meio de solicitações HTTP
- Só seja cobrado pelos recursos exatos que usar
- Suporta qualquer linguagem de programação ou qualquer biblioteca de sistema operacional de sua escolha, ou qualquer binário
No entanto, muitos modelos sem servidor ignoram o fato de que os bancos de dados tradicionais não são gerenciados. Você precisa provisionar manualmente a infraestrutura (dimensionamento vertical) ou adicionar mais servidores (dimensionamento horizontal) para dimensionar o banco de dados. Isso introduz um gargalo em sua arquitetura sem servidor e pode levar a problemas de desempenho.
O MongoDB lançou instâncias sem servidor, uma nova implantação de banco de dados sem servidor totalmente gerenciada no Atlas para resolver esse problema. Com instâncias sem servidor, você nunca precisa pensar em infraestrutura — basta implantar seu banco de dados e ele aumentará e diminuirá de acordo com a demanda — sem exigir gerenciamento prático. E a melhor parte, você só será cobrado pelas operações que executar. Para tornar nossa arquitetura verdadeiramente sem servidor, combinaremos os recursos do Cloud Run e do MongoDB Atlas.
A pilha MEAN é uma pilha de tecnologia para construir aplicações web full-stack inteiramente com JavaScript e JSON. A pilha MEAN é composta por quatro componentes principais – MongoDB, Express, Angular e Node.js.
- O MongoDB é responsável pelo armazenamento de dados.
- Express.js é uma estrutura de aplicativos da Web do Node.js para a criação de APIs.
- Angular é uma plataforma JavaScript do lado do cliente.
- O Node.js é um ambiente de tempo de execução JavaScript no lado do servidor. O servidor usa o driver MongoDB Node.js para se conectar ao banco de dados e recuperar e armazenar dados.
Nas seções a seguir, provisionaremos uma nova instância sem servidor do MongoDB, conectaremos um aplicativo web MEAN stack a ela e, finalmente, implantaremos o aplicativo no Cloud Run.
Depois de se inscrever, clique no botão "Build a Database " para criar uma nova instância sem servidor. Selecione a seguinte configuração:
Depois que sua instância sem servidor estiver provisionada, você deverá vê-la instalada e em execução.
Clique no botão "Connect " para adicionar um endereço IP de conexão e um usuário do banco de dados.
Para esta publicação do blog, usaremos a configuração "Allow Access from Anywhere ". O MongoDB Atlas vem com um conjunto de recursos de segurança e acesso. Você pode saber mais sobre eles no artigo de documentação de recursos de segurança.
Use as credenciais de sua escolha para o nome de usuário e a senha do banco de dados. Depois que essas etapas forem concluídas, você verá o seguinte:
Continue clicando no botão "Choose a connection method " e, em seguida, selecionando "Connect your application ".
Copie a string de conexão que você vê e substitua a senha pela sua. Usaremos essa string para conectar-se ao nosso banco de dados nas seções a seguir.
Lembre-se da ID do projeto para o projeto que você criou. Abaixo está uma imagem de https://codeLabs.developers.google.com/codeLabs/cloud-run-hello#1 que mostra como criar um novo projeto no Google Cloud.
- Ative o Cloud Shell no Console do Cloud. Basta clicar em Ativar Cloud Shell.
- Use o comando abaixo:
gcloud services enable run.googleapis.com
Usaremos o Cloud Shell e o Cloud Shell Editor para referências de código. Para acessar o Cloud Shell Editor, clique em Abrir editor no Terminal do Cloud Shell:
Finalmente, precisamos clonar o projeto MEAN stack que implantaremos.
Implementaremos um aplicativo da web de gerenciamento de funcionários. A REST API foi construída com Express e Node.js; a interface web, com Angular; e os dados serão armazenados na instância do MongoDB Atlas que criamos anteriormente.
Clone o repositório do projeto executando o seguinte comando no Terminal do Cloud Shell:
Nas seções a seguir, implantaremos alguns serviços — um para o Express REST API e outro para o Angular web application.
Primeiro, implementaremos um serviço cloud Run para a Express REST API.
O arquivo mais importante para nossa implantação é o arquivo de configuração do Docker. Vamos dar uma olhada:
exemplo de MEAN/servidor/Dockerfile
1 FROM node:17-slim 2 3 WORKDIR /usr/app 4 COPY ./ /usr/app 5 6 # Install dependencies and build the project. 7 RUN npm install 8 RUN npm run build 9 10 # Run the web service on container startup. 11 CMD ["node", "dist/server.js"]
A configuração define o Node.js, copia e cria o projeto. Quando o container inicia, o comando "node dist/server.js " inicia o serviço.
Para iniciar uma nova implantação do Cloud Run, clique no ícone do Cloud Run na barra lateral esquerda:
Em seguida, clique no ícone Implementar no Cloud Run:
Preencha a configuração do serviço da seguinte forma:
- Nome do serviço: node-express-api
- Plataforma de implantação: Cloud Run (totalmente gerenciado)
- Região: Selecione uma região próxima à região de seu banco de dados para reduzir a latência
- Autenticação: permitir invocações não autenticadas
Em Revision Settings (Configurações de revisão), clique em Show Advanced Settings (Mostrar configurações avançadas) para expandi-las:
- Porta do contêiner: 5200
- Variáveis de ambiente. Adicione o seguinte par de chave-valor e certifique-se de adicionar a string de conexão para sua própria implantação do MongoDB Atlas:
ATLAS_URI:mongodb+srv:/<username>:<password>@sandbox.pv0l7.mongodb.net/meanStackExample?retryWrites=true&w=majority
Para o ambiente de compilação, selecione Cloud Build.
Por fim, na seção Configurações de compilação, selecione:
- Construtor: Docker
- Docker: média-stack-example/server/Dockerfile
Clique no botão Deploy (Implementar) e depois em Show Detailed Logs (Mostrar registros detalhados) para acompanhar a implementação do seu primeiro serviço Cloud Run!
Após a conclusão da compilação, você deverá ver a URL do serviço implementado:
Abra o URL e acrescente "/emploees" ao final. Você deve ver uma array vazia porque, atualmente, não há documentos no banco de dados. Vamos distribuir a interface do usuário para que possamos adicionar algumas!
Nosso aplicativo Angular está no diretório do cliente. Para implementá-lo, usaremos o servidor Nginx e o Docker.
Só há uma opção para usar o Firebase Hosting para o sistema deaplicativo Angular, pois você pode servir seu conteúdo diretamente a uma CDN (rede de distribuição de conteúdo).
Vamos dar uma olhada nos arquivos de configuração:
MEAN-stack-example/client/nginx.conf
1 events{} 2 3 http { 4 5 include /etc/nginx/mime.types; 6 7 server { 8 listen 8080; 9 server_name 0.0.0.0; 10 root /usr/share/nginx/html; 11 index index.html; 12 13 location / { 14 try_files $uri $uri/ /index.html; 15 } 16 } 17 }
Na configuração do Nginx, especificamos a porta padrão-8080 e o arquivo inicial-
index.html
.exemplo de MEAN/cliente/Dockerfile
1 FROM node:17-slim AS build 2 3 WORKDIR /usr/src/app 4 COPY package.json package-lock.json ./ 5 6 # Install dependencies and copy them to the container 7 RUN npm install 8 COPY . . 9 10 # Build the Angular application for production 11 RUN npm run build --prod 12 13 # Configure the nginx web server 14 FROM nginx:1.17.1-alpine 15 COPY nginx.conf /etc/nginx/nginx.conf 16 COPY --from=build /usr/src/app/dist/client /usr/share/nginx/html 17 18 # Run the web service on container startup. 19 CMD ["nginx", "-g", "daemon off;"]
Na configuração do Docker, instalamos as dependências do Node.js e construímos o projeto. Em seguida, copiamos os arquivos criados para o container, configuramos e iniciamos o serviço Nginx.
Por fim, precisamos configurar a URL para a REST API para que nosso aplicativo cliente possa enviar solicitações para ela. Como estamos usando a URL em um único arquivo no projeto, codificaremos a URL. Alternativamente, você pode anexar a variável de ambiente ao objeto de janela e acessá-la de lá.
MEAN-stack-example/client/src/app/employee.service.ts
1 @Injectable({ 2 providedIn: 'root' 3 }) 4 export class EmployeeService { 5 // Replace with the URL of your REST API 6 private url = 'https://node-express-api-vsktparjta-uc.a.run.app'; 7 …
Estamos prontos para implantar no Cloud Run. Inicie uma nova implantação com as seguintes definições de configuração:
- Configurações do serviço: criar um serviço
- Nome do serviço: Angular-web-app
- Plataforma de implantação: Cloud Run (totalmente gerenciado)
- Autenticação: permitir invocações não autenticadas
Para o ambiente de compilação, selecione Cloud Build.
Por fim, na seção Configurações de compilação, selecione:
- Construtor: Docker
- Docker: média-stack-example/client/Dockerfile
Clique no botão Implementar novamente e observe os registros conforme seu aplicativo é enviado para a cloud! Quando a implantação estiver concluída, você deverá visualizar a URL do aplicativo cliente:
Abra o URL e jogue com seu aplicativo!
As etapas abordadas acima podem ser implementadas a partir do Command Shell, conforme abaixo:
Etapa 1: crie o novo diretório de projeto chamado "mean-stack-example " a partir do Editor de código ou do Cloud Shell Command ( Terminal):
mkdir mean-stack-demo cd mean-stack-demo
Etapa 2: Clone o repositório do projeto e faça as alterações necessárias na configuração e nas variáveis, da mesma forma mencionada na seção anterior.
Etapa 3: Crie sua imagem de container usando o cloud build executando o comando no shell cloud:
gcloud builds enviar --tag gcr.io/$GOOGLECLOUDPROJECT/mean-stack-demo
$GOOGLE_CLOUD_PROJECT é uma variável de ambiente que contém seu ID de projeto do Google Cloud ao ser executado no Cloud Shell.
Etapa 4: teste localmente executando: docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/mean-stack-demo e clicando em Visualização da Web, Visualização na porta 8080.
Etapa 5: execute o comando a seguir para implantar seu aplicativo em contêiner no Cloud Run:
gcloud run deploy mean-stack-demo --image gcr.io/$googleCloudProject/mean-stack-demo --platform managed --region us-central1 --allow-unauthenticated --update-env-vars DBHOST=$DB_HOST
a. –allow-unauthenticated permitirá que o serviço seja acessado sem autenticação.
b. –platform-managed significa que você está solicitando o ambiente totalmente gerenciado e não o do Kubernetes por meio do Anthos.
c. –update-env-vars espera que a cadeia de conexão do MongoDB seja passada para a variável de ambiente DBHOST. Aguarde até a seção sobre variável Env e Docker para implantação contínua para gerenciamento de Secrets e URIs de conexão.
d. Quando a implementação estiver concluída, você deverá ver a URL do serviço implementado na linha de comando.
e. Ao acessar o URL do serviço, você deve ver sua página da web no navegador e os registros na página do Cloud Logging Logs Explorer.
Se você deseja automatizar o processo de criação e implementação em vários containers, serviços ou componentes, armazenar essas configurações no repositório não é apenas complicado, mas também uma ameaça à segurança.
- Para facilitar a implantação contínua entre ambientes e evitar vulnerabilidades de segurança causadas pelo vazamento de informações de credenciais, podemos optar por passar variáveis no momento da compilação/implantação/ativação.--update-env-vars permite definir a variável de ambiente para um valor que é passado somente no tempo de execução. Em nosso exemplo, a variável DBHOST recebe o valor de $DB_HOST. que é definido como DB_HOST = '<>’.Observe que símbolos não codificados no URI de conexão (nome de usuário, senha) resultarão em problemas de conexão com o MongoDB. Por exemplo, se você tiver um $ na senha ou no nome de usuário, substitua-o por %24 no URI de conexão codificado.
- Como alternativa, você também pode passar variáveis de configuração como variáveis de env no momento da compilação para docker-compose (docker-compose.yml). Ao passar variáveis de configuração e credenciais, evitamos o vazamento de credenciais e automatizamos a implantação de forma segura e contínua em vários ambientes, usuários e aplicativos.
O MongoDB Atlas com Cloud Run cria uma solução de pilha MEAN verdadeiramente sem servidor e, para aqueles que procuram criar um aplicativo com uma opção sem servidor para executar em um container sem estado, o Cloud Run é sua melhor opção.
Agora que você aprendeu a implantar um aplicativo MEAN Stack simples no Cloud Run e no MongoDB Atlas, por que não dá um passo adiante com seu caso de uso cliente-servidor favorito? Consulte os recursos abaixo para obter mais inspiração:
- Cloud Run HelloWorld: https://codelabs.developers.google.com/codelabs/cloud-run-hello#4
- MongoDB - Pilha MEAN: https://www.mongodb.com/languages/mean-stack-tutorial
Se você tiver quaisquer comentários ou perguntas, fique à vontade para nos procurar online: Abirami Sukumaran e Standimira Vlaeva.