הדרכה בנושא שימוש בחבילות מערכת

במדריך הזה נסביר איך ליצור שירות מותאם אישית של Cloud Run שממיר פרמטר קלט של תיאור גרף לתרשים בפורמט התמונה PNG. הוא משתמש ב-Graphviz ומוגדר כחבילת מערכת בסביבת הקונטיינר של השירות. השימוש ב-Graphviz מתבצע באמצעות כלי שורת פקודה כדי להגיב לבקשות.

מטרות

  • לכתוב ולבנות קונטיינר בהתאמה אישית באמצעות Dockerfile
  • כתיבה, פיתוח ופריסה של שירות Cloud Run
  • שימוש בכלי Graphviz dot ליצירת דיאגרמות
  • בודקים את השירות על ידי פרסום דיאגרמת תחביר של DOT מהאוסף או יצירה משלכם

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. הפעלת Cloud Run Admin API
  7. מתקינים ומפעילים את ה-CLI של gcloud.
  8. מעדכנים את הרכיבים:
    gcloud components update

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות להשלמת המדריך, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

הגדרת ברירות מחדל ב-gcloud

כדי להגדיר את gcloud עם ערכי ברירת מחדל לשירות Cloud Run:

  1. מגדירים את פרויקט ברירת המחדל:

    gcloud config set project PROJECT_ID

    מחליפים את PROJECT_ID בשם הפרויקט שיצרתם לצורך המדריך הזה.

  2. מגדירים את 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 Run זמין באזורים הבאים:

בכפוף לתמחור ברמה 1

בכפוף לתמחור ברמה 2

  • africa-south1 (יוהנסבורג)
  • asia-east2 (הונג קונג)
  • asia-northeast3 (סיאול, קוריאה הדרומית)
  • asia-southeast1 (סינגפור)
  • asia-southeast2 (ג'קרטה)
  • asia-south2 (דלהי, הודו)
  • ‫australia-southeast1 (סידני)
  • ‫australia-southeast2 (מלבורן)
  • europe-central2 (ורשה, פולין) סמל של עלה רמה נמוכה של CO2
  • ‫europe-west10 (ברלין)
  • europe-west12 (טורינו) סמל של עלה רמה נמוכה של CO2
  • 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 מסוף.

אחזור של דוגמת הקוד

כדי לאחזר את דוגמת קוד לשימוש:

  1. משכפלים את מאגר האפליקציה לדוגמה למחשב המקומי:

    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 ולחלץ אותו.

  2. עוברים לספרייה שמכילה את הקוד לדוגמה של 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/

המחשת הארכיטקטורה

הארכיטקטורה הבסיסית נראית כך:

דיאגרמה המציגה זרימת בקשה ממשתמש לשירות אינטרנט לכלי Graphviz dot.
למקור הדיאגרמה, אפשר לעיין ב תיאור DOT

המשתמש שולח בקשת HTTP לשירות Cloud Run, שמריץ כלי Graphviz כדי להפוך את הבקשה לתמונה. התמונה הזו מועברת למשתמש כתגובת HTTP.

הסבר על הקוד

הגדרת תצורת הסביבה באמצעות Dockerfile

ה-Dockerfile ספציפי לשפה ולסביבת ההפעלה הבסיסית, כמו Ubuntu, שבה השירות ישתמש.

השירות הזה דורש חבילות מערכת נוספות שלא זמינות כברירת מחדל.

  1. פותחים את Dockerfile בעורך.

  2. מחפשים דף חשבון Dockerfile RUN. ההצהרה הזו מאפשרת להריץ פקודות שרירותיות של מעטפת כדי לשנות את הסביבה. אם ל-Dockerfile יש כמה שלבים, שזוהו על ידי מציאת כמה הצהרות FROM, הוא יימצא בשלב האחרון.

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

    כדי לקבל הוראות למערכת ההפעלה או לקובץ הבסיס, לוחצים על הכרטיסייה המתאימה.

    Debian/Ubuntu
    RUN apt-get update -y && apt-get install -y \
      graphviz \
      && apt-get clean
    Alpine
    ב-Alpine נדרשת חבילה שנייה לתמיכה בגופנים.
    RUN apk --no-cache add graphviz

    כדי לזהות את מערכת ההפעלה של קובץ אימג' של קונטיינר, בודקים את השם בהצהרה FROM או בקובץ README שמשויך לקובץ האימג' הבסיסי. לדוגמה, אם אתם מרחיבים מ-node, תוכלו למצוא תיעוד ואת האב Dockerfile ב-Docker Hub.

  3. כדי לבדוק את ההתאמה האישית, צריך ליצור את האימג' באמצעות docker build באופן מקומי או באמצעות Cloud Build.

טיפול בבקשות נכנסות

שירות הדוגמה משתמש בפרמטרים מבקשת ה-HTTP הנכנסת כדי להפעיל קריאה למערכת שמבצעת את פקודת כלי השירות המתאימה dot.

ב-HTTP handler שבהמשך, פרמטר הקלט של תיאור הגרף מחולץ מהמשתנה dot של מחרוזת השאילתה.

תיאורי הגרפים יכולים לכלול תווים שצריך לקודד בפורמט URL כדי להשתמש בהם במחרוזת שאילתה.

Node.js

app.get('/diagram.png', (req, res) => {
  try {
    const image = createDiagram(req.query.dot);
    res.setHeader('Content-Type', 'image/png');
    res.setHeader('Content-Length', image.length);
    res.setHeader('Cache-Control', 'public, max-age=86400');
    res.send(image);
  } catch (err) {
    console.error(`error: ${err.message}`);
    const errDetails = (err.stderr || err.message).toString();
    if (errDetails.includes('syntax')) {
      res.status(400).send(`Bad Request: ${err.message}`);
    } else {
      res.status(500).send('Internal Server Error');
    }
  }
});

Python

@app.route("/diagram.png", methods=["GET"])
def index():
    """Takes an HTTP GET request with query param dot and
    returns a png with the rendered DOT diagram in a HTTP response.
    """
    try:
        image = create_diagram(request.args.get("dot"))
        response = make_response(image)
        response.headers.set("Content-Type", "image/png")
        return response

    except Exception as e:
        print(f"error: {e}")

        # If no graphviz definition or bad graphviz def, return 400
        if "syntax" in str(e):
            return f"Bad Request: {e}", 400

        return "Internal Server Error", 500

Go


// diagramHandler renders a diagram using HTTP request parameters and the dot command.
func diagramHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		log.Printf("method not allowed: %s", r.Method)
		http.Error(w, fmt.Sprintf("HTTP Method %s Not Allowed", r.Method), http.StatusMethodNotAllowed)
		return
	}

	q := r.URL.Query()
	dot := q.Get("dot")
	if dot == "" {
		log.Print("no graphviz definition provided")
		http.Error(w, "Bad Request", http.StatusBadRequest)
		return
	}

	// Cache header must be set before writing a response.
	w.Header().Set("Cache-Control", "public, max-age=86400")

	input := strings.NewReader(dot)
	if err := createDiagram(w, input); err != nil {
		log.Printf("createDiagram: %v", err)
		// Do not cache error responses.
		w.Header().Del("Cache-Control")
		if strings.Contains(err.Error(), "syntax") {
			http.Error(w, "Bad Request: DOT syntax error", http.StatusBadRequest)
		} else {
			http.Error(w, "Internal Server Error", http.StatusInternalServerError)
		}
	}
}

Java

get(
    "/diagram.png",
    (req, res) -> {
      InputStream image = null;
      try {
        String dot = req.queryParams("dot");
        image = createDiagram(dot);
        res.header("Content-Type", "image/png");
        res.header("Content-Length", Integer.toString(image.available()));
        res.header("Cache-Control", "public, max-age=86400");
      } catch (Exception e) {
        if (e.getMessage().contains("syntax")) {
          res.status(400);
          return String.format("Bad Request: %s", e.getMessage());
        } else {
          res.status(500);
          return "Internal Server Error";
        }
      }
      return image;
    });

צריך להבדיל בין שגיאות שרת פנימיות לבין קלט משתמש לא תקין. שירות לדוגמה הזה מחזיר שגיאת שרת פנימית לכל השגיאות בשורת הפקודה של נקודה, אלא אם הודעת השגיאה מכילה את המחרוזת syntax, שמציינת בעיה בקלט של המשתמש.

יצירת דיאגרמה

הלוגיקה המרכזית של יצירת התרשים משתמשת בכלי שורת הפקודה dot כדי לעבד את פרמטר הקלט של תיאור הגרף לתרשים בפורמט תמונה PNG.

Node.js

// Generate a diagram based on a graphviz DOT diagram description.
const createDiagram = dot => {
  if (!dot) {
    throw new Error('syntax: no graphviz definition provided');
  }

  // Adds a watermark to the dot graphic.
  const dotFlags = [
    '-Glabel="Made on Cloud Run"',
    '-Gfontsize=10',
    '-Glabeljust=right',
    '-Glabelloc=bottom',
    '-Gfontcolor=gray',
  ].join(' ');

  const image = execSync(`/usr/bin/dot ${dotFlags} -Tpng`, {
    input: dot,
  });
  return image;
};

Python

def create_diagram(dot):
    """Generates a diagram based on a graphviz DOT diagram description.

    Args:
        dot: diagram description in graphviz DOT syntax

    Returns:
        A diagram in the PNG image format.
    """
    if not dot:
        raise Exception("syntax: no graphviz definition provided")

    dot_args = [  # These args add a watermark to the dot graphic.
        "-Glabel=Made on Cloud Run",
        "-Gfontsize=10",
        "-Glabeljust=right",
        "-Glabelloc=bottom",
        "-Gfontcolor=gray",
        "-Tpng",
    ]

    # Uses local `dot` binary from Graphviz:
    # https://graphviz.gitlab.io
    image = subprocess.run(
        ["dot"] + dot_args, input=dot.encode("utf-8"), stdout=subprocess.PIPE
    ).stdout

    if not image:
        raise Exception("syntax: bad graphviz definition provided")
    return image

Go


// createDiagram generates a diagram image from the provided io.Reader written to the io.Writer.
func createDiagram(w io.Writer, r io.Reader) error {
	stderr := new(bytes.Buffer)
	args := []string{
		"-Glabel=Made on Cloud Run",
		"-Gfontsize=10",
		"-Glabeljust=right",
		"-Glabelloc=bottom",
		"-Gfontcolor=gray",
		"-Tpng",
	}
	cmd := exec.Command("/usr/bin/dot", args...)
	cmd.Stdin = r
	cmd.Stdout = w
	cmd.Stderr = stderr

	if err := cmd.Run(); err != nil {
		return fmt.Errorf("exec(%s) failed (%w): %s", cmd.Path, err, stderr.String())
	}

	return nil
}

Java

// Generate a diagram based on a graphviz DOT diagram description.
public static InputStream createDiagram(String dot) {
  if (dot == null || dot.isEmpty()) {
    throw new NullPointerException("syntax: no graphviz definition provided");
  }
  // Adds a watermark to the dot graphic.
  List<String> args = new ArrayList<>();
  args.add("/usr/bin/dot");
  args.add("-Glabel=\"Made on Cloud Run\"");
  args.add("-Gfontsize=10");
  args.add("-Glabeljust=right");
  args.add("-Glabelloc=bottom");
  args.add("-Gfontcolor=gray");
  args.add("-Tpng");

  StringBuilder output = new StringBuilder();
  InputStream stdout = null;
  try {
    ProcessBuilder pb = new ProcessBuilder(args);
    Process process = pb.start();
    OutputStream stdin = process.getOutputStream();
    stdout = process.getInputStream();
    // The Graphviz dot program reads from stdin.
    Writer writer = new OutputStreamWriter(stdin, "UTF-8");
    writer.write(dot);
    writer.close();
    process.waitFor();
  } catch (Exception e) {
    System.out.println(e);
  }
  return stdout;
}

תכנון שירות מאובטח

כל נקודת חולשה בכלי dot היא נקודת חולשה פוטנציאלית בשירות האינטרנט. כדי לצמצם את הסיכון הזה, אפשר להשתמש בגרסאות עדכניות של חבילת graphviz על ידי בנייה מחדש של קובץ אימג' של קונטיינר באופן קבוע.

אם מרחיבים את הדוגמה הנוכחית כדי לקבל קלט של משתמשים כפרמטרים של שורת הפקודה, צריך להגן מפני מתקפות הזרקת פקודות. כמה מהדרכים למניעת מתקפות הזרקה:

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

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

שליחת הקוד

כדי לשלוח את הקוד, יוצרים אותו באמצעות Cloud Build, מעלים אותו ל-Artifact Registry ופורסים אותו ב-Cloud Run:

  1. יוצרים Artifact Registry:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format docker \
        --location REGION

    מחליפים את:

    • ‫REPOSITORY: שם ייחודי למאגר. לכל מיקום של מאגר בפרויקט, שמות המאגרים צריכים להיות ייחודיים.
    • ‫REGION: האזור Google Cloud שבו ישמש מאגר Artifact Registry.
  2. מריצים את הפקודה הבאה כדי ליצור את הקונטיינר ולפרסם אותו ב-Artifact Registry.

    Node.js

    gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz

    כאשר PROJECT_ID הוא מזהה הפרויקט Google Cloud , ו-graphviz הוא השם שרוצים לתת לשירות.

    אם הפעולה תצליח, תופיע הודעה עם המזהה, זמן היצירה ושם התמונה. התמונה מאוחסנת ב-Artifact Registry ואפשר להשתמש בה שוב אם רוצים.

    Python

    gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz

    כאשר PROJECT_ID הוא מזהה הפרויקט Google Cloud , ו-graphviz הוא השם שרוצים לתת לשירות.

    אם הפעולה תצליח, תופיע הודעה עם המזהה, זמן היצירה ושם התמונה. התמונה מאוחסנת ב-Artifact Registry ואפשר לעשות בה שימוש חוזר אם רוצים.

    המשך

    gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz

    כאשר PROJECT_ID הוא מזהה הפרויקט Google Cloud , ו-graphviz הוא השם שרוצים לתת לשירות.

    אם הפעולה תצליח, תופיע הודעה עם המזהה, זמן היצירה ושם התמונה. התמונה מאוחסנת ב-Artifact Registry ואפשר לעשות בה שימוש חוזר אם רוצים.

    Java

    בדוגמה הזו נעשה שימוש ב-Jib כדי ליצור תמונות Docker באמצעות כלים נפוצים של Java. ‫Jib מבצע אופטימיזציה של בניית קונטיינרים בלי שצריך קובץ Dockerfile או ש-Docker מותקן. מידע נוסף על יצירת מאגרי Java באמצעות Jib

    1. באמצעות קובץ Docker, מגדירים ויוצרים תמונת בסיס עם חבילות המערכת שהותקנו כדי לבטל את תמונת הבסיס שמוגדרת כברירת מחדל ב-Jib:

      # Use the Official eclipse-temurin image for a lean production stage of our multi-stage build.
      # https://hub.docker.com/_/eclipse-temurin/
      FROM eclipse-temurin:17.0.18_8-jre
      
      RUN apt-get update -y && apt-get install -y \
        graphviz \
        && apt-get clean
      gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base

      כאשר PROJECT_ID הוא Google Cloud מזהה הפרויקט.

    2. משתמשים בכלי העזר לפרטי כניסה של gcloud כדי לתת ל-Docker הרשאה להעביר בדחיפה אל Artifact Registry.

      gcloud auth configure-docker

    3. יוצרים את מאגר התגים הסופי באמצעות Jib ומפרסמים אותו ב-Artifact Registry:

      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>3.4.0</version>
        <configuration>
          <from>
            <image>gcr.io/PROJECT_ID/graphviz-base</image>
          </from>
          <to>
            <image>gcr.io/PROJECT_ID/graphviz</image>
          </to>
        </configuration>
      </plugin>
      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 הפרויקט.

  3. מבצעים פריסה באמצעות:

    gcloud

    1. יוצרים חשבון שירות חדש. הקוד שלכם, כולל חבילות מערכת שבהן הוא משתמש, יכול להשתמש רק בGoogle Cloud שירותים שקיבלו הרשאה לחשבון השירות הזה.
      ‫
      gcloud iam service-accounts create SA_NAME
      כאשר SA_NAME הוא השם שאתם נותנים לחשבון השירות הזה. אם יש שגיאה או פגיעות בקוד, הקוד לא יוכל לגשת למשאבים אחרים של הפרויקט Google Cloud .
    2. פורסים את הקוד ומציינים את חשבון השירות.
      ‫
      gcloud run deploy graphviz-web --service-account SA_NAME@PROJECT_ID.iam.gserviceaccount.com  --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
      כאשר PROJECT_ID הוא מזהה הפרויקט Google Cloud , SA_NAME הוא השם של חשבון השירות שיצרתם, graphviz הוא השם של הקונטיינר מהשלב הקודם ו-graphviz-web הוא שם השירות. משיבים Y להנחיה 'אישור גישה ללא אימות'. מידע נוסף על אימות מבוסס-IAM מופיע במאמר ניהול גישה.
    3. מחכים שהפריסה תסתיים. התהליך עשוי להימשך כחצי דקה. אם הפקודה מסתיימת ללא שגיאות, כתובת ה-URL של השירות מוצגת בשורת הפקודה.

    Terraform

    כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

    קוד ה-Terraform הבא יוצר שירות Cloud Run.

    resource "google_service_account" "graphviz" {
      account_id   = "graphviz"
      display_name = "GraphViz Tutorial Service Account"
    }
    
    resource "google_cloud_run_v2_service" "default" {
      name     = "graphviz-example"
      location = "us-central1"
    
      deletion_protection = false # set to "true" in production
    
      template {
        containers {
          # Replace with the URL of your graphviz image
          #   gcr.io/<YOUR_GCP_PROJECT_ID>/graphviz
          image = "us-docker.pkg.dev/cloudrun/container/hello"
        }
    
        service_account = google_service_account.graphviz.email
      }
    }

    מחליפים את 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 לציבורי.

    # Make Cloud Run service publicly accessible
    resource "google_cloud_run_service_iam_member" "allow_unauthenticated" {
      service  = google_cloud_run_v2_service.default.name
      location = google_cloud_run_v2_service.default.location
      role     = "roles/run.invoker"
      member   = "allUsers"
    }
  4. כדי לפרוס עדכון קוד בשירות, חוזרים על השלבים הקודמים. כל פריסה לשירות יוצרת גרסה חדשה ומתחילה להציג תנועה באופן אוטומטי כשהיא מוכנה.

רוצה לנסות?

כדי לנסות את השירות, שולחים בקשות HTTP POST עם תיאורים בתחביר DOT במטען הייעודי (payload) של הבקשה.

  1. שליחת בקשת 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 }" />
  2. פותחים את קובץ diagram.png שנוצר בכל אפליקציה שתומכת בקובצי PNG, כמו Chrome.

    הוא אמור להיראות כך:

    תרשים שמציג את זרימת השלבים: Code (קוד) > Build (בנייה) > Deploy (פריסה) > Run (הפעלה).
    מקור: תיאור DOT

אתם יכולים לעיין באוסף קטן של תיאורים מוכנים של דיאגרמות.

  1. העתקת התוכן של קובץ .dot שנבחר
  2. שליחת בקשת HTTP לשירות.

    מעתיקים את כתובת ה-URL לסרגל הכתובות בדפדפן.

    ‫
    https://SERVICE_DOMAIN/diagram.png?dot=SELECTED DOTFILE CONTENTS

הסרת המשאבים

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

מחיקת הפרויקט

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

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבים של מדריך

  1. מוחקים את שירות Cloud Run שפרסתם במדריך הזה. שירותי Cloud Run לא צוברים עלויות עד שהם מקבלים בקשות.

    כדי למחוק את שירות Cloud Run, מריצים את הפקודה הבאה:

    gcloud run services delete SERVICE-NAME

    מחליפים את SERVICE-NAME בשם השירות.

    אפשר גם למחוק שירותים של Cloud Run מGoogle Cloud המסוף.

  2. מסירים את הגדרת ברירת המחדל של האזור gcloud שהוספתם במהלך ההגדרה של המדריך:

     gcloud config unset run/region
    
  3. מסירים את הגדרת הפרויקט:

     gcloud config unset project
    
  4. מחיקה של Google Cloud משאבים אחרים שנוצרו במדריך הזה:

המאמרים הבאים

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