אפליקציית מקבץ MEAN ללא שרת (serverless) ב-MongoDB Atlas ו-Cloud Run

1. מבוא

בפוסט הזה נראה איך Cloud Run ו-MongoDB משתלבים כדי לאפשר חוויית פיתוח אפליקציות של סטאק MEAN ללא שרת (serverless). נלמד איך לפתח אפליקציית MEAN ללא שרת (serverless) באמצעות Cloud Run ו-MongoDB Atlas, פלטפורמת נתוני האפליקציות מרובת עננים (multi-cloud) של MongoDB.

מה זה Cloud Run?

בעזרת Cloud Run אפשר לפתח ולפרוס אפליקציות בקונטיינרים שניתן להתאים, שנכתבו בכל שפה (כולל Go, Python, Java, Node.js, .NET ו-Ruby) בפלטפורמה מנוהלת. Cloud Run מתבלט בליגה בכך שהוא מאפשר לנו:

  • קוד חבילה בכמה קונטיינרים ללא שמירת מצב שמוּכנים לבקשות ומפעילים אותו באמצעות בקשות HTTP
  • נחייב אותך רק על המשאבים המדויקים שבהם השתמשת
  • תמיכה בכל שפת תכנות, בכל ספריית מערכת הפעלה לבחירתכם, או בכל תוכנה בינארית

בקישור הזה תוכלו למצוא תכונות נוספות בהקשר המלא.

מסד נתונים ללא שרת (serverless) עם MongoDB Atlas

כדי לפתור את הבעיה הזו, MongoDB השיקה מכונות ללא שרת (serverless) – פריסה חדשה של מסד נתונים ללא שרת (serverless) ב-Atlas. במכונות ללא שרת (serverless) שלא צריך לחשוב על תשתיות – פשוט פורסים את מסד הנתונים, והוא יגדל ויקטן בצורה חלקה לפי דרישה – ללא צורך בניהול מעשי. והכי חשוב – תחויבו רק על הפעולות שאתם מנהלים. כדי שהארכיטקטורה שלנו תהיה ללא שרת (serverless), נשלב את היכולות של Cloud Run ושל MongoDB Atlas.

ערימת MEAN

סטאק 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, בקונטיינר
  • פיתוח גרסת build של אפליקציית לקוח ב-AgularJS, בקונטיינר
  • שתי האפליקציות פרוסות ב-Cloud Run
  • אפליקציית שרת מתחברת למכונה של MongoDB ללא שרת (serverless) באמצעות מנהל התקן MongoDB NodeJS
  • ה-API של השרת מבצע את האינטראקציות של קריאה-כתיבה עם מסד הנתונים
  • אפליקציית הלקוח היא ממשק המשתמש של האפליקציה 'תפקיד עובד-מעון'

מה תלמדו

  • איך יוצרים מכונות MongoDB ללא שרת (serverless)
  • איך מגדירים פרויקט ב-Cloud Run
  • כיצד לפרוס אפליקציות אינטרנט ב-Google Cloud Run
  • איך ליצור ולפרוס אפליקציית מקבץ MEAN Stack

2. דרישות

  • דפדפן כמו Chrome או Firefox
  • פרויקט ב-Google Cloud Platform שמכיל את המכונה של Cloud Run ו-MongoDB Atlas
  • בקטע הבא מפורטת רשימת השלבים ליצירת האפליקציה 'מקבץ MEAN Stack'.

3. יצירת מכונה ומסד נתונים של MongoDB Serverless

e5cc775a49f2fb0.png

  • לאחר ההרשמה, לחצו על הקישור "Build a Database" (בניית מסד נתונים). כדי ליצור מכונה חדשה ללא שרת (serverless). בוחרים את ההגדרות האישיות הבאות:

fca10bf6f031af7a.png

  • אחרי שמקבלים מכונה ללא שרת (serverless), היא אמורה להתחיל לפעול.

d13c4b8bdd9569fd.png

  • לוחצים על 'התחברות'. לחצן להוספת כתובת IP לחיבור ומשתמש במסד הנתונים
  • לצורך ה-Codelab הזה, נשתמש באפשרות 'מתן גישה מכל מקום' הגדרה אישית. MongoDB Atlas מגיע עם מערך של תכונות אבטחה וגישה. מידע נוסף על התכונות האלה זמין במאמר העזרה של תכונות האבטחה
  • השתמשו בפרטי הכניסה שבחרתם עבור שם המשתמש והסיסמה של מסד הנתונים. לאחר השלמת השלבים, אתם אמורים לראות:

bffeef16de1d1cd2.png

  • כדי להמשיך, לוחצים על 'בחירת שיטת חיבור' ואז בחירה באפשרות 'קישור האפליקציה'

75771e64427acd5e.png

  • מעתיקים את מחרוזת החיבור שמוצגת ומחליפים את הסיסמה בסיסמה שלכם. נשתמש במחרוזת הזו כדי להתחבר למסד הנתונים שלנו בקטעים הבאים

4. הגדרת פרויקט ב-Cloud Run

  • קודם כול, נכנסים למסוף Cloud, יוצרים פרויקט חדש או משתמשים שוב בפרויקט קיים.
  • חשוב לזכור את מזהה הפרויקט של הפרויקט שיצרתם
  • למטה מופיעה תמונה של דף הפרויקט החדש, שבו ניתן לראות את מזהה הפרויקט בזמן היצירה שלו

f32dbd4eb2b7501e.png

  • לאחר מכן, מפעילים את Cloud Run API מ-Cloud Shell:
  • מפעילים את Cloud Shell ממסוף Cloud. פשוט לוחצים על Activate Cloud Shell
  • אחרי ההתחברות ל-Cloud Shell, אתם אמורים לראות שכבר בוצע אימות ושהפרויקט כבר מוגדר למזהה הפרויקט שלכם. אם מסיבה כלשהי הפרויקט לא מוגדר, פשוט מריצים את הפקודה הבאה:
gcloud config set project PROJECT_ID

3da173210a016316.png

  • משתמשים בפקודה הבאה:
gcloud services enable run.googleapis.com
  • נשתמש ב-Cloud Shell וב-Cloud Shell Editor כחומר עזר בנושא קוד. כדי לגשת לעורך Cloud Shell, לוחצים על Open Editor מהטרמינל של Cloud Shell:

83793a577f08e4d4.png

5. שכפול פרויקט MEAN Stack

  • נפרוס אפליקציית אינטרנט לניהול עובדים. ה-API ל-REST מבוסס על Express ו-Node.js. ממשק האינטרנט באמצעות Angular; והנתונים יישמרו במכונה של MongoDB Atlas שיצרנו קודם
  • משכפלים את מאגר הפרויקטים על ידי הרצת הפקודה הבאה בטרמינל של Cloud Shell:
git clone https://github.com/mongodb-developer/mean-stack-example.git

6. פריסת API ל-REST של Express ו-Node.js

קובץ תצורה של Docker

  • בשלב הראשון נפרוס שירות Cloud Run ל-API ל-REST ב-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

  • לאחר מכן, לוחצים על הסמל Deploy to Cloud Run:

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
  • בסביבת Build, בוחרים ב-Cloud Build
  • לבסוף, בקטע 'הגדרות Build', בוחרים באפשרות:
  • Builder: Docker
  • Docker: mean-stack-example/server/Dockerfile
  • לוחצים על הלחצן Deploy (פריסה) ולאחר מכן על Show Detailed Logs (הצגת יומנים מפורטים) כדי לעקוב אחרי הפריסה של שירות Cloud Run הראשון!
  • בסיום ה-build, אמורה להופיע כתובת ה-URL של השירות שנפרס:

759c69ba52a85b10.png

  • פותחים את כתובת ה-URL ומצרפים את הטקסט ' /employees'. לסוף
  • אמור להופיע מערך ריק כי כרגע אין מסמכים במסד הנתונים.

בואו לפרוס את ממשק המשתמש כדי שנוכל להוסיף קצת!

7. פריסה של אפליקציית Angular Web

אפליקציית Angular נמצאת בספריית הלקוח. כדי לפרוס אותו, נשתמש בשרת Nginx וב-Docker. חשוב לדעת: יש גם אפשרות להשתמש באירוח ב-Firebase לצורך פריסת אפליקציות ב-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 ל-API ל-REST כדי שאפליקציית הלקוח תוכל לשלוח אליה בקשות. אנחנו משתמשים בכתובת ה-URL רק בקובץ אחד בפרויקט, ולכן נקודד את כתובת ה-URL בתוך הקוד. לחלופין, אתם יכולים לצרף את משתנה הסביבה לאובייקט החלון ולגשת אליו משם.

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 (מנוהלת)
  • אימות: אפשר להפעיל הפעלות לא מאומתות
  • בסביבת Build, בוחרים ב-Cloud Build
  • לבסוף, בקטע 'הגדרות Build', בוחרים באפשרות:
  • Builder: Docker
  • Docker: mean-stack-example/client/Dockerfile
  • לוחצים שוב על הלחצן Deploy וצופים ביומנים בזמן שהאפליקציה נשלחת לענן. בסיום הפריסה אמורה להופיע כתובת ה-URL של אפליקציית הלקוח

5da1d7defc1082fc.png

  • פתחו את כתובת ה-URL ושחקו עם האפליקציה שלכם!

db154f1cd57e38f0.png

8. הסרת המשאבים

כדי לא לצבור חיובים לחשבון Google Cloud עבור המשאבים שבהם השתמשתם בפוסט הזה:

סיום מכונות MongoDB

  1. עוברים לאשכולות MongoDB Instance
  2. בוחרים את האשכול, המכונה שיצרתם.
  3. לוחצים על 3 הנקודות שלצד שם האשכול ובוחרים באפשרות 'סיום' מהרשימה.

מחיקת הפריסות של Cloud Run

  1. נכנסים לדף Cloud Run במסוף Google Cloud.
  2. בוחרים את השירות של Cloud Run שרוצים למחוק.
  3. לוחצים על סמל המחיקה בחלק העליון של המסוף.

9. מזל טוב

מזל טוב, יצרתם בהצלחה את אפליקציית האינטרנט של MEAN Stack ב-Cloud Run!