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

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

אפשר להשתמש ב-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. ההצהרה הזו מאפשרת להריץ פקודות shell שרירותיות כדי לשנות את הסביבה. אם ל-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;
    });

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

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 הוא השם שרוצים לתת לשירות.

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

    Python

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

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

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

    המשך

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

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

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

    Java

    בדוגמה הזו משתמשים ב-Jib כדי ליצור קובצי אימג' של Docker באמצעות כלי Java נפוצים. ‫Jib מבצע אופטימיזציה של גרסאות build של קונטיינרים בלי צורך בקובץ Docker או בהתקנה של 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 להודעה allow unauthenticated. במאמר ניהול הגישה מוסבר בהרחבה על אימות מבוסס-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 to Build to Deploy to '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.