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

במדריך הזה נסביר איך ליצור שירות מותאם אישית של 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 יחד בכמה מיקומים יכול להשפיע על זמן האחזור ועל העלות של השירות.

‫Cloud Run זמין באזורים הבאים:

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

בכפוף לתמחור ברמה 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 מסוף.

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

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

  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 querystring.

תיאורי גרפים יכולים לכלול תווים שצריך לקודד בפורמט 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

המשך


// 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;
    });

צריך להבדיל בין שגיאות שרת פנימיות לבין קלט משתמש לא תקין. השירות לדוגמה הזה מחזיר שגיאת שרת פנימית לכל השגיאות בשורת הפקודה של dot, אלא אם הודעת השגיאה מכילה את המחרוזת 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

המשך


// 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 הוא מזהה הפרויקט שלכם, ו-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

    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 הוא מזהה הפרויקט, SA_NAME הוא השם של חשבון השירות שיצרתם, graphviz הוא השם של הקונטיינר מהשלב הקודם ו-graphviz-web הוא שם השירות. Google Cloud משיבים 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.