Бессерверное приложение MEAN Stack на MongoDB Atlas и Cloud Run

1. Введение

В этой статье мы рассмотрим, как Cloud Run и MongoDB объединяются, чтобы обеспечить полностью бессерверную разработку приложений на основе стека MEAN. Мы узнаем, как создать бессерверное приложение MEAN с помощью Cloud Run и MongoDB Atlas , платформы для работы с данными приложений в мультиоблачной среде от MongoDB.

Что такое Cloud Run?

Cloud Run позволяет создавать и развертывать масштабируемые контейнерные приложения, написанные на любом языке (включая Go, Python, Java, Node.js, .NET и Ruby), на полностью управляемой платформе. Cloud Run выделяется среди конкурентов тем, что позволяет нам:

  • Упакуйте код в несколько контейнеров без сохранения состояния, которые поддерживают запросы и вызывают его посредством HTTP-запросов.
  • С вас будет взиматься плата только за фактически использованные ресурсы.
  • Поддерживается любой язык программирования, любая библиотека операционной системы на ваш выбор или любой бинарный файл.

Для получения более подробной информации о функциях в полном контексте перейдите по этой ссылке .

Бессерверная база данных с использованием MongoDB Atlas

MongoDB запустила бессерверные экземпляры — новое полностью управляемое развертывание бессерверных баз данных в Atlas, призванное решить эту проблему. С бессерверными экземплярами вам никогда не придется думать об инфраструктуре — просто разверните свою базу данных, и она будет беспрепятственно масштабироваться в зависимости от спроса, не требуя ручного управления. И самое главное, с вас будет взиматься плата только за выполняемые операции. Чтобы сделать нашу архитектуру по-настоящему бессерверной, мы объединим возможности Cloud Run и MongoDB Atlas.

MEAN Stack

MEAN-стек — это технологический стек для создания полнофункциональных веб-приложений, полностью использующих JavaScript и JSON. MEAN-стек состоит из четырех основных компонентов: MongoDB, Express, Angular и Node.js.

  • MongoDB отвечает за хранение данных.
  • Express.js — это фреймворк для веб-приложений на Node.js, предназначенный для создания API.
  • Angular — это клиентская JavaScript-платформа.
  • Node.js — это серверная среда выполнения JavaScript. Сервер использует драйвер MongoDB для Node.js для подключения к базе данных, а также для получения и сохранения данных.

Что вы построите

Вам предстоит разработать полнофункциональное приложение для управления должностными ролями сотрудников с использованием MongoDB, Express JS, Angular JS и Node JS. Оно будет включать в себя:

  • Серверное приложение на Node.js и Express.js, контейнеризированное
  • Клиентское приложение, разработанное на AngularJS и контейнеризированное.
  • Оба приложения развернуты в Cloud Run.
  • Серверное приложение подключается к бессерверному экземпляру MongoDB с помощью драйвера MongoDB для NodeJS.
  • API сервера осуществляет операции чтения и записи с базой данных.
  • Клиентское приложение — это пользовательский интерфейс для приложения «Сотрудник — Должностная роль».

Что вы узнаете

  • Как создать бессерверные экземпляры MongoDB
  • Как настроить проект Cloud Run
  • Как развернуть веб-приложения в Google Cloud Run
  • Как создать и развернуть приложение на основе MEAN Stack

2. Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud Platform, содержащий ваш экземпляр Cloud Run и MongoDB Atlas.
  • В следующем разделе приведен список шагов по созданию приложения на основе MEAN Stack.

3. Создайте бессерверный экземпляр MongoDB и базу данных.

e5cc775a49f2fb0.png

  • После регистрации нажмите кнопку «Создать базу данных», чтобы создать новый бессерверный экземпляр. Выберите следующую конфигурацию:

fca10bf6f031af7a.png

  • После того, как ваш бессерверный экземпляр будет создан, вы увидите, что он запущен и работает.

d13c4b8bdd9569fd.png

  • Нажмите кнопку «Подключиться», чтобы добавить IP-адрес подключения и пользователя базы данных.
  • Для этого практического занятия мы будем использовать настройку "Разрешить доступ из любого места". MongoDB Atlas поставляется с набором функций безопасности и управления доступом. Вы можете узнать о них больше в статье документации по функциям безопасности.
  • Используйте в качестве имени пользователя и пароля базы данных любые учетные данные по вашему выбору. После выполнения этих шагов вы должны увидеть следующее:

bffeef16de1d1cd2.png

  • Для продолжения нажмите кнопку «Выберите способ подключения», а затем выберите «Подключить ваше приложение».

75771e64427acd5e.png

  • Скопируйте строку подключения, которую вы видите, и замените пароль своим собственным. Мы будем использовать эту строку для подключения к нашей базе данных в следующих разделах.

4. Настройте проект Cloud Run.

  • Сначала войдите в Cloud Console , создайте новый проект или используйте существующий.
  • Запомните идентификатор проекта, который вы создали.
  • Ниже представлено изображение, демонстрирующее страницу создания нового проекта, где вы можете увидеть идентификатор своего проекта в момент его создания.

f32dbd4eb2b7501e.png

  • Затем включите API Cloud Run из Cloud Shell:
  • Активируйте Cloud Shell из консоли Cloud. Просто нажмите «Активировать Cloud Shell».
  • После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и проект уже настроен на ваш идентификатор проекта (PROJECT ID). Если по какой-либо причине проект не настроен, просто выполните следующую команду:
gcloud config set project PROJECT_ID

3da173210a016316.png

  • Воспользуйтесь следующей командой:
gcloud services enable run.googleapis.com
  • Для работы с кодом мы будем использовать Cloud Shell и Cloud Shell Editor . Чтобы получить доступ к Cloud Shell Editor, нажмите «Открыть редактор» в терминале Cloud Shell:

83793a577f08e4d4.png

5. Клонируйте проект MEAN Stack.

  • Мы развернем веб-приложение для управления персоналом. REST API создан с использованием Express и Node.js; веб-интерфейс — с помощью Angular; а данные будут храниться в экземпляре MongoDB Atlas, который мы создали ранее.
  • Клонируйте репозиторий проекта, выполнив следующую команду в терминале Cloud Shell:
git clone https://github.com/mongodb-developer/mean-stack-example.git

6. Разверните REST API на Express и Node.js.

Файл конфигурации Docker

  • Сначала мы развернем сервис Cloud Run для REST API Express. Самый важный файл для нашего развертывания — это конфигурационный файл Docker. Давайте посмотрим на него:

mean-stack-example/server/Dockerfile

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:17-slim
 
WORKDIR /usr/app
COPY ./ /usr/app
 
# Install dependencies and build the project.
RUN npm install
RUN npm run build
 
# Run the web service on container startup.
CMD ["node", "dist/server.js"]
  • Конфигурация настраивает Node.js, копирует и собирает проект. После запуска контейнера следующая команда запускает службу.
node dist/server.js
  • Чтобы начать новое развертывание Cloud Run, щелкните значок Cloud Run на левой боковой панели:

48c73bda3aa4ea02.png

  • Затем нажмите на значок «Развернуть в облаке»:

cde124ba8ec23b34.png

  • Заполните конфигурацию сервиса следующим образом:
  • Название сервиса: node-express-api
  • Платформа развертывания: Cloud Run (полностью управляемая)
  • Регион: Выберите регион, близкий к региону вашей базы данных, чтобы уменьшить задержку.
  • Аутентификация: Разрешить вызовы без аутентификации.
  • В разделе «Настройки ревизии» нажмите «Показать дополнительные настройки», чтобы развернуть их:
  • Контейнерный порт: 5200
  • Переменные среды. Добавьте следующую пару ключ-значение и убедитесь, что вы добавили строку подключения для вашего собственного развертывания MongoDB Atlas:
ATLAS_URI:mongodb+srv:/<username>:<password>@sandbox.pv0l7.mongodb.net/meanStackExample?retryWrites=true&w=majority
  • В качестве среды сборки выберите Cloud Build.
  • Наконец, в разделе «Параметры сборки» выберите:
  • Разработчик: Docker
  • Docker: mean-stack-example/server/Dockerfile
  • Нажмите кнопку «Развернуть», а затем «Показать подробные журналы», чтобы отследить развертывание вашей первой службы Cloud Run!
  • После завершения сборки вы должны увидеть URL-адрес развернутой службы:

759c69ba52a85b10.png

  • Откройте URL-адрес и добавьте в конец '/employees'.
  • Вы должны увидеть пустой массив, поскольку в данный момент в базе данных нет документов.

Давайте развернем пользовательский интерфейс, чтобы мы могли добавить несколько новых элементов!

7. Разверните веб-приложение Angular.

Наше Angular-приложение находится в директории клиента. Для его развертывания мы будем использовать сервер Nginx и Docker. Кстати, есть также вариант использования Firebase Hosting для развертывания Angular-приложения , поскольку вы можете напрямую предоставлять контент через CDN (сеть доставки контента).

Файлы конфигурации

Давайте посмотрим на конфигурационные файлы:

mean-stack-example/client/nginx.conf

events{}
 
http {
   include /etc/nginx/mime.types;
   server {
       listen 8080;
       server_name 0.0.0.0;
       root /usr/share/nginx/html;
       index index.html;
 
       location / {
           try_files $uri $uri/ /index.html;
       }
   }
}
  • В конфигурации Nginx мы указываем порт по умолчанию — 8080, и начальный файл — index.html.

mean-stack-example/client/Dockerfile

FROM node:17-slim AS build
 
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
 
# Install dependencies and copy them to the container
RUN npm install
COPY . .
 
# Build the Angular application for production
RUN npm run build --prod
 
# Configure the nginx web server
FROM nginx:1.17.1-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build /usr/src/app/dist/client /usr/share/nginx/html
 
# Run the web service on container startup.
CMD ["nginx", "-g", "daemon off;"]
  • В конфигурации Docker мы устанавливаем зависимости Node.js и собираем проект. Затем копируем собранные файлы в контейнер, настраиваем и запускаем службу Nginx.
  • Наконец, нам нужно настроить URL-адрес REST API, чтобы наше клиентское приложение могло отправлять к нему запросы. Поскольку мы используем URL-адрес только в одном файле проекта, мы пропишем его жестко. В качестве альтернативы вы можете прикрепить переменную окружения к объекту window и получить к нему доступ оттуда.

mean-stack-example/client/src/app/employee.service.ts

...
@Injectable({
 providedIn: 'root'
})
export class EmployeeService {
 // Replace with the URL of your REST API
 private url = 'https://node-express-api-vsktparjta-uc.a.run.app'; 
...
  • Мы готовы к развертыванию в Cloud Run! Начните новое развертывание со следующими параметрами конфигурации:
      - Service Settings: Create a service
    
  • Название сервиса: angular-web-app
  • Платформа развертывания: Cloud Run (полностью управляемая)
  • Аутентификация: Разрешить вызовы без аутентификации.
  • В качестве среды сборки выберите Cloud Build.
  • Наконец, в разделе «Параметры сборки» выберите:
  • Разработчик: Docker
  • Docker: mean-stack-example/client/Dockerfile
  • Нажмите кнопку «Развернуть» еще раз и следите за логами, пока ваше приложение отправляется в облако! После завершения развертывания вы должны увидеть URL-адрес клиентского приложения.

5da1d7defc1082fc.png

  • Откройте URL-адрес и поэкспериментируйте со своим приложением!

db154f1cd57e38f0.png

8. Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, выполните следующие действия.

Завершить работу экземпляров MongoDB

  1. Перейдите к кластерам экземпляров MongoDB.
  2. Выберите созданный вами кластер или экземпляр.
  3. Щелкните многоточие рядом с именем кластера и выберите «Завершить» из списка.

Удалите развертывания Cloud Run.

  1. Перейдите на страницу Cloud Run в консоли Google Cloud.
  2. Выберите службу Cloud Run, которую хотите удалить.
  3. Нажмите на значок удаления в верхней части консоли.

9. Поздравляем!

Поздравляем, вы успешно создали веб-приложение на основе MEAN Stack в Cloud Run!