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

במאמר הזה מוסבר איך ליצור מכונה וירטואלית (VM) שמוגדרת לשימוש בחשבון שירות שמנוהל על ידי משתמש. חשבון שירות הוא סוג מיוחד של חשבון, שמשמש בדרך כלל אפליקציה או עומס עבודה ממוחשב כדי לבצע קריאות מורשות ל-API.

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

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

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

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

    צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:

    המסוף

    כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים ולממשקי ה-API, לא צריך להגדיר אימות. Google Cloud

    gcloud

    1. התקינו את ה-CLI של Google Cloud. אחר כך, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:

      gcloud init

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  • הגדרת אזור ותחום כברירת מחדל
  • Terraform

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של Terraform שבדף הזה, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.

    1. התקינו את ה-CLI של Google Cloud.

    2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    3. אם אתם משתמשים במעטפת מקומית, אתם צריכים ליצור פרטי כניסה לאימות מקומי עבור חשבון המשתמש:

      gcloud auth application-default login

      אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.

      אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

    REST

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.

      התקינו את ה-CLI של Google Cloud.

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .

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

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

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

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

ההרשאות הנדרשות

כדי ליצור מכונות וירטואליות שמשתמשות בחשבונות שירות, צריך את ההרשאות הבאות:

  • כדי ליצור חשבונות שירות: כל ההרשאות בתפקיד iam.serviceAccountCreator
  • כדי לתת הרשאות לחשבון השירות: כל ההרשאות בתפקיד resourcemanager.projectIamAdmin
  • כדי ליצור מכונות וירטואליות:
    • compute.instances.create בפרויקט
    • כדי להשתמש באימג' בהתאמה אישית ליצירת המכונה הווירטואלית (VM): compute.images.useReadOnly בקובץ אימג'
    • כדי להשתמש ב-snapshot ליצירת המכונה הווירטואלית: compute.snapshots.useReadOnly בקובץ ה-snapshot
    • כדי להשתמש בתבנית של הגדרות מכונה ליצירת המכונה הווירטואלית: compute.instanceTemplates.useReadOnly בתבנית של הגדרות המכונה
    • כדי להקצות רשת מדור קודם למכונה הווירטואלית: compute.networks.use בפרויקט
    • כדי לציין כתובת IP סטטית למכונה הווירטואלית: compute.addresses.use בפרויקט
    • כדי להקצות כתובת IP חיצונית למכונה הווירטואלית כשמשתמשים ברשת מדור קודם: compute.networks.useExternalIp בפרויקט
    • כדי לציין רשת משנה למכונה הווירטואלית: compute.subnetworks.use בפרויקט או ברשת המשנה שנבחרה
    • כדי להקצות כתובת IP חיצונית למכונה הווירטואלית כשמשתמשים ברשת VPC: compute.subnetworks.useExternalIp בפרויקט או ברשת המשנה שנבחרה
    • כדי להגדיר מטא-נתונים של המכונה הווירטואלית למכונה הווירטואלית: compute.instances.setMetadata בפרויקט
    • כדי להגדיר תגים למכונה הווירטואלית: compute.instances.setTags במכונה הווירטואלית
    • כדי להגדיר תוויות למכונה הווירטואלית: compute.instances.setLabels במכונה הווירטואלית
    • כדי להגדיר חשבון שירות לשימוש של המכונה הווירטואלית: compute.instances.setServiceAccount במכונה הווירטואלית
    • כדי ליצור דיסק חדש למכונה הווירטואלית: compute.disks.create בפרויקט
    • כדי לצרף דיסק קיים במצב קריאה-בלבד או במצב קריאה וכתיבה: compute.disks.use בדיסק
    • כדי לצרף דיסק קיים במצב קריאה-בלבד: compute.disks.useReadOnly בדיסק

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

סקירה כללית

מומלץ להגדיר חשבונות שירות למכונות הווירטואליות באופן הבא:

  1. יוצרים חשבון שירות חדש שמנוהל על ידי המשתמש במקום להשתמש בחשבון השירות שמוגדר כברירת מחדל של Compute Engine, ומקצים לחשבון השירות הזה תפקידי IAM רק למשאבים ולפעולות שהוא צריך.
  2. מצרפים את חשבון השירות למכונה הווירטואלית.
  3. מגדירים את היקף פלטפורמת הענן (https://www.googleapis.com/auth/cloud-platform) במכונה הווירטואלית. כך חשבון השירות של מכונת ה-VM יכול לקרוא לממשקי ה- Google Cloud API שיש לו הרשאה להשתמש בהם.
    • אם מציינים את חשבון השירות באמצעות Google Cloud המסוף, צריך להגדיר את היקף הגישה של חשבון השירות לAllow full access to all Cloud APIs.
    • אם מציינים את חשבון השירות באמצעות Google Cloud CLI או Compute Engine API, אפשר להשתמש בפרמטר scopes כדי להגדיר את היקף הגישה.

הגדרה של חשבון שירות

יוצרים חשבון שירות ומקצים לו את תפקידי ה-IAM הנדרשים. מקצים כמה תפקידי IAM שצריך. אפשר לשנות את תפקידי ה-IAM בחשבון השירות לפי הצורך.

‫Google ממליצה להגביל את ההרשאות של חשבונות שירות ולבדוק באופן קבוע את ההרשאות של חשבונות השירות כדי לוודא שהן עדכניות.

אפשר להגדיר את חשבון השירות באחת מהדרכים הבאות.

המסוף

    מוודאים שיש לכם את תפקיד ה-IAM 'יצירת חשבונות שירות' (roles/iam.serviceAccountCreator) ואת התפקיד 'אדמין IAM בפרויקט' (roles/resourcemanager.projectIamAdmin). איך מקצים תפקידים
  1. במסוף Google Cloud , נכנסים לדף יצירת חשבון שירות.

    כניסה לדף Create service account
  2. בוחרים את הפרויקט הרצוי.
  3. כותבים שם בשדה Service account name. המסוף Google Cloud ממלא את השדה מזהה חשבון שירות בהתאם לשם הזה.

    כותבים תיאור בשדה Service account description. לדוגמה: Service account for quickstart.

  4. לוחצים על Create and continue.
  5. מקצים לחשבון השירות את התפקידים הנדרשים.

    כדי להקצות תפקיד, בוחרים תפקיד מהרשימה Select a role.

    כדי להקצות עוד תפקידים, לוחצים על Add another role ומוסיפים את כולם.

  6. לוחצים על Continue.
  7. בשדה Service account users role, מזינים את המזהה של חשבון המשתמש שיצרף את חשבון השירות למשאבים אחרים, כמו מכונות של Compute Engine.

    בדרך כלל מזהה המשתמש הוא כתובת האימייל של חשבון Google.

  8. לוחצים על Done כדי לסיים ליצור את חשבון השירות.

gcloud

    מגדירים את האימות:

    1. מוודאים שיש לכם את תפקיד ה-IAM ‏Create Service Accounts ‏(roles/iam.serviceAccountCreator) ואת תפקיד ה-IAM ‏Project Admin ‏(roles/resourcemanager.projectIamAdmin). איך מקצים תפקידים
    2. יוצרים את חשבון השירות:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      מחליפים את הערך SERVICE_ACCOUNT_NAME בשם שרוצים לתת לחשבון השירות.

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

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      מחליפים את מה שכתוב בשדות הבאים:

      • SERVICE_ACCOUNT_NAME: השם של חשבון השירות
      • PROJECT_ID: מזהה הפרויקט שבו יצרתם את חשבון השירות
      • ROLE: התפקיד שאתם רוצים לתת
    4. כדי להקצות תפקיד נוסף לחשבון השירות, מריצים שוב את הפקודה שמו שעשיתם בשלב הקודם.
    5. מקצים את התפקיד הנדרש לחשבון המשתמש שיצרף את חשבון השירות למשאבים אחרים.

      gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member="user:USER_EMAIL" --role=roles/iam.serviceAccountUser

      מחליפים את מה שכתוב בשדות הבאים:

      • SERVICE_ACCOUNT_NAME: השם של חשבון השירות
      • PROJECT_ID: מזהה הפרויקט שבו יצרתם את חשבון השירות
      • USER_EMAIL: כתובת האימייל של חשבון Google

Terraform

כדי ליצור חשבון שירות, אפשר להשתמש במשאב google_service_account.

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

חשוב להחליף את ערכי placeholder במאפיינים account_id ו-display_name.

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

יצירת מכונה וירטואלית וצירוף חשבון השירות

אחרי שיוצרים את חשבון השירות, יוצרים מכונה וירטואלית ומצרפים אליה את חשבון השירות שיצרתם בקטע הקודם. צריך גם להגדיר את היקף הגישה של ה-VM ל-cloud-platform.

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

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

אפשר להשתמש באחת מהשיטות הבאות כדי ליצור מכונה וירטואלית ולצרף אליה את חשבון השירות.

המסוף

  1. נכנסים לדף Create an instance במסוף Google Cloud .

    כניסה לדף Create an instance

  2. כדי לצרף חשבון שירות:

    1. בתפריט הניווט, לוחצים על אבטחה.
    2. ברשימה Service account בוחרים את חשבון השירות שיצרתם.
    3. בקטע Access scopes בוחרים באפשרות Allow full access to all Cloud APIs.
  3. אופציונלי: מציינים אפשרויות הגדרה אחרות. מידע נוסף מופיע במאמר אפשרויות הגדרה במהלך יצירת מכונה.

  4. כדי ליצור את המכונה ולהפעיל אותה, לוחצים על Create.

gcloud

כדי ליצור מכונת VM חדשה ולהגדיר אותה לשימוש בחשבון שירות מותאם אישית באמצעות Google Cloud CLI, משתמשים בפקודה gcloud compute instances create ומספקים את כתובת האימייל בחשבון השירות ואת היקף הגישה cloud-platform למכונת ה-VM.

gcloud compute instances create VM_NAME \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=https://www.googleapis.com/auth/cloud-platform

מחליפים את מה שכתוב בשדות הבאים:

  • SERVICE_ACCOUNT_EMAIL: כתובת האימייל של חשבון השירות שיצרתם. לדוגמה: my-sa-123@my-project-123.iam.gserviceaccount.com. כדי לראות את כתובת האימייל, קראו את המאמר בנושא הצגת רשימה של חשבונות שירות.
  • VM_NAME: השם של מופע ה-VM.

לדוגמה:

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/cloud-platform

אפשר גם לציין את ההיקף באמצעות הכינוי: --scopes=cloud-platform. הכינויים האלה מזוהים רק על ידי ה-CLI של gcloud. ה-API וספריות אחרות לא מזהים את הכינויים האלה, ולכן צריך לציין את מזהה ה-URI המלא של ההיקף.

Terraform

כדי להגדיר מכונה וירטואלית חדשה לשימוש בחשבון שירות, אפשר להשתמש במשאב google_compute_instance.

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

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

REST

משתמשים בשיטת instances.insert כדי ליצור את מכונת ה-VM ולציין את כתובת האימייל בחשבון השירות ואת היקף הגישה למכונת ה-VM.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
   "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE",
   "name":"VM_NAME",
   
   "disks":[
      {
         "initializeParams":{
            "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
         },
         "boot":true
      }
   ],
   
   
   "networkInterfaces":[
      {
         "network":"global/networks/NETWORK_NAME"
      }
   ],
   
  "serviceAccounts": [
      {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
      }
   ],
   "shieldedInstanceConfig":{
      "enableSecureBoot":"ENABLE_SECURE_BOOT"
   }
}

מחליפים את מה שכתוב בשדות הבאים:

  • PROJECT_ID: המזהה של הפרויקט שבו רוצים ליצור את המכונה הווירטואלית
  • ZONE: האזור שבו רוצים ליצור את המכונה הווירטואלית
  • MACHINE_TYPE_ZONE: האזור שמכיל את סוג המכונה שרוצים להשתמש בו למכונה הווירטואלית החדשה
  • MACHINE_TYPE: סוג המכונה, מוגדר מראש או מותאם אישית, של המכונה הווירטואלית החדשה
  • VM_NAME: name של המכונה הווירטואלית החדשה
  • IMAGE_PROJECT: הפרויקט שמכיל את התמונה
    . לדוגמה, אם מציינים debian-10 כמשפחת התמונות, מציינים debian-cloud כפרויקט התמונות.
  • IMAGE: מציינים אחת מהאפשרויות הבאות:
    • IMAGE: גרסה ספציפית של תמונה ציבורית

      לדוגמה, "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"

    • IMAGE_FAMILY: משפחת תמונות

      הפעולה הזו יוצרת את מכונת ה-VM מתמונת מערכת ההפעלה העדכנית ביותר שלא הוצאה משימוש. לדוגמה, אם מציינים "sourceImage": "projects/debian-cloud/global/images/family/debian-10",‏ Compute Engine יוצר מכונה וירטואלית מהגרסה האחרונה של תמונת מערכת ההפעלה במשפחת התמונות Debian 10.

  • NETWORK_NAME: רשת ה-VPC שבה רוצים להשתמש עבור מכונת ה-VM. אפשר לציין default כדי להשתמש ברשת ברירת המחדל.
  • SERVICE_ACCOUNT_EMAIL: כתובת האימייל של חשבון השירות שיצרתם. לדוגמה: my-sa-123@my-project-123.iam.gserviceaccount.com. במאמר איך מקבלים כתובת אימייל של חשבון שירות מוסבר איך לראות את כתובת האימייל.
  • ENABLE_SECURE_BOOT: אופציונלי: אם בחרתם תמונה שתומכת בתכונות של Shielded VM,‏ Compute Engine מפעיל כברירת מחדל את מודול הפלטפורמה הווירטואלית המהימנה (vTPM) ואת המעקב אחר השלמות. ב-Compute Engine, האפשרות Secure Boot לא מופעלת כברירת מחדל.

    אם מציינים true עבור enableSecureBoot, ‏ Compute Engine יוצר מכונה וירטואלית עם כל שלושת התכונות של מכונה וירטואלית מוגנת. אחרי שמכונה וירטואלית מופעלת ב-Compute Engine, כדי לשנות את האפשרויות של Shielded VM, צריך להפסיק את הפעולה של המכונה הווירטואלית.

גישה לשירותים אחרים Google Cloud ושימוש בהם

אחרי שמגדירים את המכונה הווירטואלית לשימוש בחשבון השירות, האפליקציות יכולות להשתמש בחשבון השירות כדי לבצע אימות. השיטה הנפוצה ביותר היא אימות באמצעות Application Default Credentials וספריית לקוח. חלק Google Cloud מהכלים, כמו ה- CLI של gcloud, יכולים להשתמש באופן אוטומטי בחשבון השירות כדי לגשת Google Cloud לממשקי API ממכונה וירטואלית. מידע נוסף זמין במאמר אימות עומסי עבודה באמצעות חשבונות שירות.

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

דוגמה: גישה למשאבים של Cloud Storage ממכונת ה-VM

אחרי שמגדירים את המכונה הווירטואלית לשימוש בחשבון שירות עם תפקיד storage.admin, אפשר להשתמש בכלים כמו ה-CLI של gcloud כדי לנהל קבצים ששמרתם ב-Cloud Storage. כדי לגשת למשאבים של Cloud Storage, צריך לבצע את הפעולות הבאות:

  1. מוודאים שלחשבון השירות שמחובר למכונה הווירטואלית מוקצה התפקיד roles/storage.admin.

  2. אם ה-VM שלכם משתמש בקובץ אימג' מותאם אישית של מערכת הפעלה, צריך להתקין את ה-CLI של gcloud. כברירת מחדל, ה-CLI של gcloud מותקן ברוב תמונות מערכות ההפעלה הציבוריות שמסופקות על ידי Google Cloud.

  3. מתחברים ל-VM.

  4. מתוך מכונת ה-VM, משתמשים ב-Google Cloud CLI כדי לנהל את המשאבים ב-Cloud Storage.

מה השלב הבא?