ייבוא משאבים של Google Cloud למצב של Terraform

אתם יכולים לייבא את התשתית הקיימת שלכם ל-Terraform כדי לנהל באמצעות Terraform את המשאבים שיצרתם במקומות אחרים.

אפשר לייבא את המצב של כל Google Cloud משאב.

אלה הדרכים לייבא משאבים ב-Terraform:

ייבוא של כל משאב בנפרד

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

  • מזהים את כתובת המשאב לייבוא:

    resource "google_storage_bucket" "sample" {
     name          = "my-bucket"
     project       = "sample-project"
     location      = "US"
     force_destroy = true
    }
    

    במשאב לדוגמה, כמו קטגוריה של Cloud Storage שהוגדרה למעלה, כתובת המשאב היא google_storage_bucket.sample.

  • תוכלו לעיין במסמכי התיעוד לייבוא ספקים של המשאב google_storage_bucket כדי לזהות את הפורמט של מזהה המשאב. במקרה שלנו הוא מופיע כ-project/name, אז מזהה המשאב מהדוגמה שלמעלה הוא sample-project/my-bucket.

  • כדי ליצור את ההצהרה import, משתמשים בכתובת ובמזהה של המשאב:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    

    פלט:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    google_storage_bucket.sample: Importing from ID "sample-project/my-bucket"...
    google_storage_bucket.sample: Import prepared!
    Prepared google_storage_bucket for import
    google_storage_bucket.sample: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

ייבוא משאבים במודולים

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

  • מזהים את המשאבים שרוצים לייבא במודול.

    module "gcs_bucket" {
     source  = "terraform-google-modules/cloud-storage/google//modules/simple_bucket"
     version = "~> 3.4"
    
     name       = "my-bucket"
     project_id = "sample-project"
     location   = "us-east1"
    }
    

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

    terraform apply
    module.gcs_bucket.google_storage_bucket.bucket: Creating...
    ╷
    │ Error: googleapi: Error 409: Your previous request to create the named bucket succeeded and you already own it., conflict
    │
    │   with module.gcs_bucket.google_storage_bucket.bucket,
    

    בדוגמת היומן שלמעלה, כתובת המשאב שצריך לייבא היא module.gcs_bucket.google_storage_bucket.bucket.

  • תוכלו לעיין במסמכי התיעוד לייבוא ספקים של המשאב google_storage_bucket כדי לזהות את הפורמט של מזהה המשאב. במקרה הזה, project/name. אפשר לזהות את השם לפי פלט התוכנית.

    פלט:

    module.gcs_bucket.google_storage_bucket.bucket will be created
    + resource "google_storage_bucket" "bucket" {
        + name                        = "my-bucket"
        + project                     = "sample-project"
        ...
      }
    

    בדוגמה שלמעלה, מזהה המשאב הוא sample-project/my-bucket.

  • כדי ליצור את ההצהרה import, משתמשים בכתובת ובמזהה של המשאב:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    

    פלט:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    module.gcs_bucket.google_storage_bucket.bucket: Importing from ID "sample-project/my-bucket"...
    module.gcs_bucket.google_storage_bucket.bucket: Import prepared!
    Prepared google_storage_bucket for import
    module.gcs_bucket.google_storage_bucket.bucket: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

ייבוא משאבים בכמות גדולה באמצעות בלוק import מבוסס הגדרות

בגרסה 1.5 של Terraform אפשר להוסיף בלוק import להגדרות ב-Terraform. כך אפשר לראות תצוגה מקדימה של פעולות הייבוא במהלך הפעולה plan ולבצע אותה באמצעות הפעולה apply.

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

הבלוק import כולל שני פרמטרים:

  • id: מזהה המשאב של המשאב ב-Cloud לייבוא, כפי שהוגדר על ידי הספק.

    למידע על מזהה המשאב שהוגדר על ידי הספק, קראו את הקטע ייבוא המשאב במסמכי התיעוד של Hashicorp, הספק של Google. לדוגמה, המזהה projects/{project}/global/networks/{name} הוא מזהה המשאב של רשת VPC, כפי שהוא מופיע בדף העזר של google_compute_network.

  • to: הכתובת של המשאב שצריך ליצור ב-Terraform. בדרך כלל בפורמט RESOURCE TYPE.NAME.

הנה דוגמה לבלוק import לרשת בענן וירטואלי פרטי (VPC):

import {
  # Provider-defined resource ID of the cloud resource to be imported
  id = "projects/PROJECT_ID/global/networks/my-network"

  # Terraform resource address to be created
  to = google_compute_network.my_network
}

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

אם אתם רוצים ש-Terraform תיצור בשבילכם את הבלוקים של המשאבים, תוכלו להשתמש בדגל -generate-config-out כדי לציין את הקובץ ליצירת ההגדרות.

לדוגמה:

 terraform plan -generate-config-out=generated_resources.tf

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

ייבוא משאבים שנוצרו אחרי ייצוא בכמות גדולה

ייצוא משאבים בכמות גדולה מאפשר לייצא Google Cloud משאבים כהגדרות של Terraform, ולייבא למשאבים האלה את המצב ב-Terraform, כך שתוכלו לנהל את הפריסה ב-Terraform.

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

  • מכינים את Cloud Shell.

    מפעילים את Cloud Shell ומגדירים את פרויקט ברירת המחדל שבו רוצים ליצור את הקוד של Terraform למשאבים שנפרסו. Google Cloud

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

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

  • מתקינים ב-Cloud Shell את ממשק שורת הפקודה (CLI) ב-Config Connector.

    gcloud components install config-connector
    

    באמצעות Config Connector תוכלו להשתמש בכלי של Google Cloudלייצוא בכמות גדולה ב-Terraform.

    אם רואים ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation, מריצים את הפקודה הבאה:

    sudo apt-get install google-cloud-sdk-config-connector
    
  • מפעילים את Cloud Asset API.

    gcloud services enable cloudasset.googleapis.com
    

יצירת קוד ב-Terraform למשאבים

  1. אם עדיין לא יצרתם את הספרייה שאליה תרצו לייצא את הגדרות הפרויקט, תצטרכו ליצור אותה:

    mkdir OUTPUT_DIRECTORY
    
  2. מריצים את הפקודה gcloud beta resource-config bulk-export כדי ליצור פלט של כל הגדרות הפרויקט בנתיב OUTPUT_DIRECTORY:

    gcloud beta resource-config bulk-export \
       --path=OUTPUT_DIRECTORY \
       --project=PROJECT_ID \
       --resource-format=terraform
    

יצירת מודולים של Terraform מהקוד שנוצר

מריצים את הפקודה gcloud beta resource-config terraform generate-import שמפנה אל התוכן בספריית הפלט:

gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY

הפקודה יוצרת מודולים של Terraform וסקריפט ייבוא:

  • הקובץ gcloud-export-modules.tf, שמפנה לכל המודולים ממשאבי המשנה. התוכן של הקובץ נראה כך:

    provider "google" {
     project = "PROJECT_ID"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeBackendService-global" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeBackendService/global"
    }
    

    ... וכן הלאה.

  • סקריפט מעטפת של קובץ הפעלה שמכיל רשימת פקודות של terraform import. השם שלו יהיה דומה ל-terraform_import_20220331-19-12-33.sh, לדוגמה:

    #!/bin/sh
    # Terraform Import Script generated by gcloud cli
    
    terraform import module.OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    

    ... וכן הלאה.

    הפקודות terraform import משמשות לייבוא המודולים שנוצרו על ידי הפקודה generate-import למצב של Terraform.

ייבוא המודולים למצב של Terraform

  1. מפעילים:

    terraform init
    
  2. מריצים את הסקריפט:

    ./terraform_import_20220331-19-12-33.sh
    

    פלט:

    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Importing from ID
    "projects/PROJECT_ID/zones/us-central1-a/instances/instance-1"...
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Import prepared!
     Prepared google_compute_instance for import
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Refreshing state...
    [id=projects/PROJECT_ID/zones/us-central1-a/instances/instance-1]
    
    Import successful!
    
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

השלבים הבאים