אתם יכולים לייבא את התשתית הקיימת שלכם ל-Terraform כדי לנהל באמצעות Terraform את המשאבים שיצרתם במקומות אחרים.
אפשר לייבא את המצב של כל Google Cloud משאב.
אלה הדרכים לייבא משאבים ב-Terraform:
- כל משאב בנפרד באמצעות הפקודה
terraform import. - בכמות גדולה באמצעות הוספת בלוק של
importבהגדרה (נדרשת גרסה 1.5 ואילך של Terraform). - בכמות גדולה באמצעות Google Cloud תכונה שמאפשרת לבצע ייבוא משאבים אחרי ייצוא בכמות גדולה.
ייבוא של כל משאב בנפרד
הפקודה 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 למשאבים
אם עדיין לא יצרתם את הספרייה שאליה תרצו לייצא את הגדרות הפרויקט, תצטרכו ליצור אותה:
mkdir OUTPUT_DIRECTORY
מריצים את הפקודה
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
מפעילים:
terraform init
מריצים את הסקריפט:
./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.