במדריך הזה נסביר איך ליצור שירות מותאם אישית של Cloud Run שמקבל כפרמטר תיאור של גרף וממיר אותו לדיאגרמה בפורמט התמונה PNG. הוא משתמש ב-Graphviz ומוגדר כחבילת מערכת בסביבת הקונטיינר של השירות.
הבקשות מוגשות באמצעות כלי שורת פקודה של Graphviz.
מטרות
- לכתוב ולבנות קונטיינר בהתאמה אישית באמצעות Dockerfile
- כתיבה, פיתוח ופריסה של שירות Cloud Run
- שימוש בכלי השירות Graphviz dot ליצירת דיאגרמות
- בודקים את השירות על ידי פרסום תרשים תחביר של DOT מהאוסף או יצירה משלכם
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- הפעלת Cloud Run Admin API
- מתקינים ומפעילים את ה-CLI של gcloud.
- עדכון רכיבים:
gcloud components update
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להשלמת המדריך, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- עריכה ב-Cloud Build (
roles/cloudbuild.builds.editor) - אדמין ב-Cloud Run (
roles/run.admin) - יצירת חשבונות שירות (
roles/iam.serviceAccountCreator) - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) - צרכן שימוש בשירות (
roles/serviceusage.serviceUsageConsumer) - אדמין באחסון (
roles/storage.admin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
הגדרת ברירות מחדל ב-gcloud
כדי להגדיר את gcloud עם ערכי ברירת מחדל לשירות Cloud Run:
מגדירים את פרויקט ברירת המחדל:
gcloud config set project PROJECT_ID
מחליפים את PROJECT_ID בשם הפרויקט שיצרתם לצורך המדריך הזה.
מגדירים את gcloud לאזור שבחרתם:
gcloud config set run/region REGION
מחליפים את REGION באזור נתמך ב-Cloud Run לבחירתכם.
מיקומים של Cloud Run
Cloud Run הוא שירות אזורי, כלומר התשתית שמריצה את שירותי Cloud Run ממוקמת באזור ספציפי ומנוהלת על ידי Google כך שתהיה זמינה באופן יתירתי בכל התחומים באותו אזור.
הקריטריונים העיקריים לבחירת האזור שבו יפעלו שירותי Cloud Run הם זמן האחזור, הזמינות או העמידות שנדרשים לכם.
בדרך כלל אפשר לבחור את האזור הקרוב ביותר למשתמשים, אבל כדאי לקחת בחשבון את המיקום של מוצרים Google Cloud
אחרים שבהם נעשה שימוש בשירות Cloud Run.
השימוש במוצרים של Google Cloud Google Cloud יחד בכמה מיקומים יכול להשפיע על זמן האחזור ועל העלות של השירות.
Cloud Run זמין באזורים הבאים:
בכפוף לתמחור ברמה 1
asia-east1(טייוואן)asia-northeast1(טוקיו)-
asia-northeast2(אוסקה) asia-south1(מומבאי, הודו)-
asia-southeast3(בנגקוק) europe-north1(פינלנד)רמה נמוכה של CO2
europe-north2(שטוקהולם)רמה נמוכה של CO2
europe-southwest1(מדריד)רמה נמוכה של CO2
europe-west1(בלגיה)רמה נמוכה של CO2
europe-west4(הולנד)רמה נמוכה של CO2
europe-west8(מילאנו)europe-west9(פריז)רמה נמוכה של CO2
me-west1(תל אביב)northamerica-south1(מקסיקו)us-central1(אייווה)רמה נמוכה של CO2
us-east1(דרום קרוליינה)-
us-east4(צפון וירג'יניה) us-east5(Columbus)us-south1(דאלאס)רמה נמוכה של CO2
us-west1(אורגון)רמה נמוכה של CO2
בכפוף לתמחור ברמה 2
africa-south1(יוהנסבורג)asia-east2(הונג קונג)asia-northeast3(סיאול, קוריאה הדרומית)asia-southeast1(סינגפור)asia-southeast2(ג'אקארטה)asia-south2(דלהי, הודו)-
australia-southeast1(סידני) australia-southeast2(מלבורן)europe-central2(ורשה, פולין)-
europe-west10(Berlin) europe-west12(טורינו)europe-west2(לונדון, בריטניה)רמה נמוכה של CO2
-
europe-west3(פרנקפורט, גרמניה) europe-west6(ציריך, שווייץ)רמה נמוכה של CO2
-
me-central1(דוחה) -
me-central2(דמאם) northamerica-northeast1(מונטריאול)רמה נמוכה של CO2
northamerica-northeast2(טורונטו)רמה נמוכה של CO2
southamerica-east1(סאו פאולו, ברזיל)רמה נמוכה של CO2
southamerica-west1(סנטיאגו, צ'ילה)רמה נמוכה של CO2
-
us-west2(לוס אנג'לס) -
us-west3(סולט לייק סיטי) -
us-west4(לאס וגאס)
אם כבר יצרתם שירות Cloud Run, תוכלו לראות את האזור בלוח הבקרה של Cloud Run בGoogle Cloud מסוף.
אחזור של דוגמת הקוד
כדי לאחזר את דוגמת קוד לשימוש:
משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
אפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
אפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
המשך
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
אפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
אפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
עוברים לספרייה שמכילה את הקוד לדוגמה של Cloud Run:
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
הדמיה של הארכיטקטורה
הארכיטקטורה הבסיסית נראית כך:
המשתמש שולח בקשת HTTP לשירות Cloud Run, שמריץ כלי Graphviz כדי להמיר את הבקשה לתמונה. התמונה הזו מועברת למשתמש כתגובת HTTP.
הסבר על הקוד
הגדרת תצורת הסביבה באמצעות Dockerfile
ה-Dockerfile שלכם ספציפי לשפה ולסביבת ההפעלה הבסיסית, כמו Ubuntu, שבה השירות שלכם ישתמש.
השירות הזה דורש חבילות מערכת נוספות שלא זמינות כברירת מחדל.
פותחים את
Dockerfileבעורך.מחפשים דף חשבון ב-
DockerfileRUN. ההצהרה הזו מאפשרת להריץ פקודות שרירותיות של מעטפת כדי לשנות את הסביבה. אםDockerfileמורכב מכמה שלבים, שזוהו על ידי מציאת כמה הצהרותFROM, הוא יימצא בשלב האחרון.החבילות הספציפיות שנדרשות והמנגנון להתקנתן משתנים בהתאם למערכת ההפעלה שמוצהרת בתוך הקונטיינר.
כדי לקבל הוראות למערכת ההפעלה או לתמונת הבסיס שלכם, לוחצים על הכרטיסייה המתאימה.
Debian/Ubuntu Alpine ב-Alpine נדרשת חבילה שנייה לתמיכה בגופנים.כדי לזהות את מערכת ההפעלה של קובץ אימג' של קונטיינר, בודקים את השם בהצהרה
FROMאו בקובץ README שמשויך לתמונת הבסיס. לדוגמה, אם אתם מרחיבים מ-node, תוכלו למצוא תיעוד ואת ההורהDockerfileב-Docker Hub.כדי לבדוק את ההתאמה האישית, יוצרים את האימג' באמצעות
docker buildבאופן מקומי או באמצעות Cloud Build.
טיפול בבקשות נכנסות
שירות הדוגמה משתמש בפרמטרים מבקשת ה-HTTP הנכנסת כדי להפעיל קריאת מערכת שמבצעת את פקודת כלי השירות המתאימה dot.
ב-HTTP handler שבהמשך, פרמטר הקלט של תיאור הגרף מחולץ מהמשתנה dot querystring.
תיאורי גרפים יכולים לכלול תווים שצריך לקודד בפורמט URL כדי להשתמש בהם במחרוזת שאילתה.
Node.js
Python
המשך
Java
צריך להבדיל בין שגיאות שרת פנימיות לבין קלט משתמש לא תקין. השירות לדוגמה הזה מחזיר שגיאת שרת פנימית לכל השגיאות בשורת הפקודה של dot, אלא אם הודעת השגיאה מכילה את המחרוזת syntax, שמציינת בעיה בקלט של המשתמש.
יצירת תרשים
הלוגיקה המרכזית של יצירת התרשים משתמשת בכלי dot משורת הפקודה כדי לעבד את פרמטר הקלט של תיאור הגרף לתרשים בפורמט תמונה PNG.
Node.js
Python
המשך
Java
תכנון שירות מאובטח
כל נקודת חולשה בכלי dot היא נקודת חולשה פוטנציאלית בשירות האינטרנט. כדי לצמצם את הסיכון הזה, מומלץ להשתמש בגרסאות עדכניות של חבילת graphviz על ידי בנייה מחדש של קובץ אימג' של קונטיינר באופן קבוע.
אם מרחיבים את הדוגמה הנוכחית כדי לקבל קלט של משתמשים כפרמטרים של שורת הפקודה, צריך להגן מפני מתקפות הזרקת פקודות. כמה מהדרכים למניעת מתקפות הזרקה הן:
- מיפוי של קלט למילון של פרמטרים נתמכים
- אימות התאמה של קלט לטווח של ערכים בטוחים ידועים, אולי באמצעות ביטויים רגולריים
- הוספת תווי Escape לקלט כדי לוודא שתחביר המעטפת לא מוערך
כדי לצמצם עוד יותר את הסיכון לפגיעות פוטנציאליות, מומלץ לפרוס את השירות עם חשבון שירות שלא קיבל הרשאות להשתמש בשירותי Google Cloud, במקום להשתמש בחשבון ברירת המחדל, שיש לו הרשאות נפוצות. לכן, בשלבים של המדריך הזה אנחנו יוצרים חשבון שירות חדש ומשתמשים בו.
שליחת הקוד
כדי לשלוח את הקוד, יוצרים אותו באמצעות Cloud Build, מעלים אותו ל-Artifact Registry ופורסים אותו ב-Cloud Run:
יוצרים Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
מחליפים את:
- REPOSITORY: שם ייחודי למאגר. לכל מיקום של מאגר בפרויקט, שמות המאגרים צריכים להיות ייחודיים.
- REGION: האזור Google Cloud שבו ישמש מאגר Artifact Registry.
מריצים את הפקודה הבאה כדי ליצור את הקונטיינר ולפרסם אותו ב-Artifact Registry.
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
כאשר PROJECT_ID הוא מזהה הפרויקט שלכם, ו-
graphvizהוא השם שאתם רוצים לתת לשירות. Google Cloudאם הפעולה תצליח, תופיע הודעה עם המזהה, זמן היצירה ושם התמונה. התמונה מאוחסנת ב-Artifact Registry ואפשר לעשות בה שימוש חוזר אם רוצים.
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
כאשר PROJECT_ID הוא מזהה הפרויקט שלכם, ו-
graphvizהוא השם שאתם רוצים לתת לשירות. Google Cloudאם הפעולה תצליח, תופיע הודעה עם המזהה, זמן היצירה ושם התמונה. התמונה מאוחסנת ב-Artifact Registry ואפשר לעשות בה שימוש חוזר אם רוצים.
המשך
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
כאשר PROJECT_ID הוא מזהה הפרויקט שלכם, ו-
graphvizהוא השם שאתם רוצים לתת לשירות. Google Cloudאם הפעולה תצליח, תופיע הודעה עם המזהה, זמן היצירה ושם התמונה. התמונה מאוחסנת ב-Artifact Registry ואפשר לעשות בה שימוש חוזר אם רוצים.
Java
בדוגמה הזו נעשה שימוש ב-Jib כדי ליצור תמונות Docker באמצעות כלים נפוצים של Java. Jib מבצע אופטימיזציה של בניית קונטיינרים בלי צורך בקובץ Dockerfile או בהתקנה של Docker. מידע נוסף על יצירת מאגרי Java באמצעות Jibבאמצעות קובץ Docker, מגדירים ויוצרים תמונת בסיס עם חבילות המערכת שהותקנו כדי לבטל את תמונת הבסיס שמוגדרת כברירת מחדל ב-Jib:
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
כאשר PROJECT_ID הוא מזהה הפרויקט. Google Cloud
משתמשים בכלי העזר לפרטי כניסה של gcloud כדי לתת ל-Docker הרשאה להעביר בדחיפה אל Artifact Registry.
gcloud auth configure-docker
יוצרים את מאגר התגים הסופי באמצעות Jib ומפרסמים אותו ב-Artifact Registry:
mvn compile jib:build \ -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz \ -Djib.from.image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
כאשר PROJECT_ID הוא מזהה הפרויקט. Google Cloud
אפשר לבצע פריסה באמצעות האפשרויות הבאות:
gcloud
- יוצרים חשבון שירות חדש. הקוד שלכם, כולל חבילות המערכת שבהן הוא משתמש, יכול להשתמש רק בשירותיGoogle Cloud שקיבלו הרשאה לחשבון השירות הזה.
כאשר SA_NAME הוא השם שאתם נותנים לחשבון השירות הזה. אם יש שגיאה או פגיעות בקוד, הקוד לא יוכל לגשת למשאבים אחרים בפרויקט Google Cloud .gcloud iam service-accounts create SA_NAME
- מבצעים פריסה של הקוד ומציינים את חשבון השירות.
כאשר PROJECT_ID הוא מזהה הפרויקט, SA_NAME הוא השם של חשבון השירות שיצרתם,gcloud run deploy graphviz-web --service-account SA_NAME@PROJECT_ID.iam.gserviceaccount.com --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
graphvizהוא השם של הקונטיינר מהשלב הקודם ו-graphviz-webהוא שם השירות. Google Cloud משיביםYלהנחיה 'אישור גישה לא מאומתת'. מידע נוסף על אימות מבוסס-IAM מופיע במאמר ניהול גישה. - ממתינים עד שהפריסה תסתיים. הפעולה עשויה להימשך כחצי דקה. אם הפעולה בוצעה ללא שגיאות, כתובת ה-URL של השירות מוצגת בשורת הפקודה.
Terraform
כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.
קוד ה-Terraform הבא יוצר שירות Cloud Run.
מחליפים את IMAGE_URL בהפניה לקובץ אימג' של קונטיינר, לדוגמה,
us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, צריך ליצור מראש את המאגר REPO_NAME. כתובת ה-URL היא בפורמטLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.קוד ה-Terraform הבא הופך את שירות Cloud Run לציבורי.
- יוצרים חשבון שירות חדש. הקוד שלכם, כולל חבילות המערכת שבהן הוא משתמש, יכול להשתמש רק בשירותיGoogle Cloud שקיבלו הרשאה לחשבון השירות הזה.
אם רוצים לפרוס עדכון קוד בשירות, חוזרים על השלבים הקודמים. כל פריסה לשירות יוצרת גרסה חדשה ומתחילה להציג תנועה באופן אוטומטי כשהיא מוכנה.
רוצה לנסות?
כדי לנסות את השירות, שולחים בקשות HTTP POST עם תיאורים בתחביר DOT במטען הייעודי (payload) של הבקשה.
שליחת בקשת HTTP לשירות.
מעתיקים את כתובת ה-URL לסרגל הכתובות בדפדפן ומעדכנים את
[SERVICE_DOMAIN]:https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }
אפשר להטמיע את הדיאגרמה בדף אינטרנט:
<img src="https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" />
פותחים את קובץ
diagram.pngשנוצר בכל אפליקציה שתומכת בקובציPNG, כמו Chrome.הוא אמור להיראות כך:
מקור: תיאור DOT
אתם יכולים לעיין באוסף קטן של תיאורים מוכנים מראש של דיאגרמות.
- העתקת התוכן של קובץ
.dotשנבחר שליחת בקשת HTTP לשירות.
מעתיקים את כתובת ה-URL לסרגל הכתובות בדפדפן.
https://SERVICE_DOMAIN/diagram.png?dot=SELECTED DOTFILE CONTENTS
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון Google Cloud , מוחקים את כל המשאבים שהצבתם באמצעות המדריך הזה.
מחיקת הפרויקט
אם יצרתם פרויקט חדש בשביל המדריך הזה, מוחקים את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שהוספתם במדריך הזה, תצטרכו למחוק את המשאבים שיצרתם לצורך המדריך.
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.
כדי למחוק את הפרויקט:
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת משאבי הדרכה
מוחקים את שירות Cloud Run שפרסתם במדריך הזה. שירותי Cloud Run לא צוברים עלויות עד שהם מקבלים בקשות.
כדי למחוק את שירות Cloud Run, מריצים את הפקודה הבאה:
gcloud run services delete SERVICE-NAME
מחליפים את SERVICE-NAME בשם השירות.
אפשר גם למחוק שירותים של Cloud Run מGoogle Cloud המסוף.
מסירים את הגדרת ברירת המחדל של האזור
gcloudשהוספתם במהלך ההגדרה של המדריך:gcloud config unset run/regionמסירים את הגדרות הפרויקט:
gcloud config unset projectמחיקת משאבים אחרים Google Cloud שנוצרו במדריך הזה:
מוחקים את קובץ אימג' של קונטיינר בשם
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphvizמ-Artifact Registry.מוחקים את חשבון השירות SA_NAME.
gcloud iam service-accounts delete SA_NAME@PROJECT_ID.iam.gserviceaccount.com
המאמרים הבאים
- ניסוי עם אפליקציית graphviz:
- הוספת תמיכה בכלי עזר אחרים של Graphviz שמחילים אלגוריתמים שונים על יצירת דיאגרמות.
- שמירת תרשימים ב-Cloud Storage. רוצה לשמור את התמונה או את תחביר ה-DOT?
- הטמעה של הגנה מפני התנהלות פוגעת בתוכן באמצעות Cloud Natural Language API.
- דוגמה נוספת לחבילת מערכת מופיעה במדריך לעיבוד תמונות באמצעות Cloud Run.
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.