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

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

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

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

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

  • יוצרים ומפעילים את הצהרת הייבוא לפי כתובת המשאב והמזהה, 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.

  • יוצרים ומפעילים את הצהרת הייבוא לפי כתובת המשאב והמזהה 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.
    

ייבוא משאבים שנוצרו באמצעות ייצוא בכמות גדולה (Bulk Export)

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

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

  • מתקינים את CLI של gcloud ל-Config Connector.

    gcloud components install config-connector
    

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

  • מפעילים את Cloud Asset API.

    gcloud services enable cloudasset.googleapis.com
    
  • מוודאים שלסוכן השירות ב-Cloud Asset‏, gcp-sa-cloudasset.iam.gserviceaccount.com, מוקצה התפקיד roles/servicenetworking.serviceAgent.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/servicenetworking.serviceAgent
    

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

מריצים את הפקודה gcloud beta resource-config bulk-export כדי ליצור פלט של כל הגדרות הפרויקט בנתיב entire-tf-output:

gcloud beta resource-config bulk-export \
  --path=entire-tf-output \
  --project=PROJECT_ID \
  --resource-format=terraform

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

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

gcloud beta resource-config terraform generate-import entire-tf-output

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

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

    provider "google" {
    project = "PROJECT_ID"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeFirewall" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeBackendService-global" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeBackendService/global"
    }
    
    ...and so on
    
  • סקריפט מעטפת של קובץ הפעלה שמכיל רשימת פקודות של terraform import. השם שלו יהיה דומה ל-terraform_import_20220331-19-12-33.sh, לדוגמה:

    #!/bin/sh
    # Terraform Import Script generated by gcloud cli
    
    terraform import module.entire-tf-output-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    
    ...and so on
    

    הפקודות 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.
    

השלבים הבאים