تيرافورم كود البنية التحتية عملياً: الكود والأوامر التي تهم حقاً
Terraform Infrastructure Code : الأساسيات في مقال واحد — كود حقيقي، مخططات وخطوات ملموسة، مقتطفات من دورة تضم 38 درسًا.
لا توجد نظرية لا نهاية لها هنا: نفتح الطرفية ونمارس. إليك أساسيات Terraform Infrastructure Code، مستخرجة مباشرة من دورة كاملة تضم 38 درسًا — مع كود حقيقي يمكنك نسخه ولصقه الآن.
- مقدمة إلى Terraform و IaC
- التثبيت والخطوات الأولى
- لغة HCL و Providers و Variables و Ressources
- الوحدات (Modules) وتنظيم الكود
- State Backend البعيد و Workspaces
Chapitre 08 – Leçon 2 : Premier Projet GCP — VPC, Firewall et Compute Engine
1. المتطلبات الأساسية
قبل البدء، تأكد من توفر جميع العناصر أدناه. بدون هذه المتطلبات، سيفشل terraform apply بسبب أخطاء في المصادقة أو عدم تفعيل واجهات برمجة التطبيقات.
1.1 الحسابات والأدوات
1.2 بيانات اعتماد GCP المطلوب استخراجها
ستحتاج إلى هذه المعلومات لتهيئة موفر Terraform ومصادقة استدعاءات واجهات برمجة التطبيقات:
| العنصر | كيفية الحصول عليه | مثال |
|---|---|---|
| Project ID (سلسلة قصيرة) | gcloud config get-value project | mon-projet-tf-prod |
| Project Number (12 رقمًا) | gcloud projects describe PROJECT_ID --format="value(projectNumber)" | 123456789012 |
| Organization ID (اختياري) | gcloud organizations list | 987654321000 |
| Billing Account ID | gcloud billing accounts list | 0X0X0X-0Y0Y0Y-0Z0Z0Z |
| Service Account email | التنسيق القياسي لـ SA Terraform | tf-sa@PROJECT_ID.iam.gserviceaccount.com |
gcloud auth application-default login.1.3 تهيئة مصادقة gcloud + ADC
مرة واحدة فقط على جهازك: سجّل الدخول بحسابك على Google، حدد المشروع، أنشئ Service Account مخصصًا لـ Terraform، وهيّئ Application Default Credentials (ADC) التي يقرأها Terraform تلقائيًا.
# 1. تسجيل دخول المستخدم (يفتح المتصفح)
gcloud auth login
# 2. تحديد المشروع
gcloud config set project mon-projet-tf-prod
# 3. إنشاء Service Account مخصص لـ Terraform
gcloud iam service-accounts create tf-sa \
--display-name="Terraform Service Account"
# 4. منح الدور (Editor للتمارين، أكثر تقييدًا في الإنتاج)
gcloud projects add-iam-policy-binding mon-projet-tf-prod \
--member="serviceAccount:tf-sa@mon-projet-tf-prod.iam.gserviceaccount.com" \
--role="roles/editor"
# 5. ADC للتطوير المحلي (الطريقة الموصى بها لـ Terraform)
gcloud auth application-default login
# 6. (بديل CI/CD) إنشاء مفتاح JSON — حساس، يجب حمايته!
gcloud iam service-accounts keys create key.json \
--iam-account=tf-sa@mon-projet-tf-prod.iam.gserviceaccount.com
# export GOOGLE_APPLICATION_CREDENTIALS=$PWD/key.json
# 7. التحقق
gcloud auth list
gcloud config list project1.4 تفعيل واجهات برمجة التطبيقات المطلوبة على GCP
يتطلب GCP تفعيل كل خدمة صراحة قبل استخدامها. لهذا الدرس، Compute Engine ضروري فقط، لكن من الأفضل تفعيل واجهات برمجة التطبيقات الشائعة دفعة واحدة:
gcloud services enable \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
iam.googleapis.com \
iap.googleapis.com
# التحقق من واجهات برمجة التطبيقات المفعّلة
gcloud services list --enabled1.5 أذونات IAM الدنيا
لهذا التمرين، يجب أن يتمكن Service Account Terraform من إنشاء موارد Compute Engine وقراءة المشروع. الدور roles/editor (المستخدم في 1.3) يغطي الحاجة بشكل كافٍ. في الإنتاج، يُفضل استخدام أدوار مستهدفة مثل roles/compute.admin + roles/iam.serviceAccountUser (أقل امتياز).
1.6 مفتاح SSH لـ Compute Engine
للاتصال عبر SSH بالجهاز الافتراضي (خارج IAP)، يدعم GCP وضعين: OS Login (موصى به، مصادقة عبر IAM — مستخدم في هذا الدرس) أو مفاتيح SSH التقليدية عبر بيانات تعريف المشروع. إليك كيفية إنشاء مفتاح مخصص لـ GCP:
# إنشاء زوج مفاتيح RSA بطول 4096 بت مخصص لـ GCP
ssh-keygen -t rsa -b 4096 -f ~/.ssh/gcp_vm -C "votre-user@gcp"
# الخيار أ: OS Login مفعّل على الجهاز الافتراضي (مستخدم في هذا الدرس)
# → المفتاح العام يُدار بواسطة IAM، لا شيء يُرسل إلى البيانات التعريفية
# الخيار ب: الإضافة عبر بيانات تعريف المشروع (مفتاح SSH تقليدي)
gcloud compute project-info add-metadata \
--metadata-from-file ssh-keys=~/.ssh/gcp_vm.pub
# تقييد أذونات المفتاح الخاص (إلزامي)
chmod 400 ~/.ssh/gcp_vm2. هيكل المشروع
إليك الهيكل النموذجي لهذا الدرس. يُنظم الكود في عدة ملفات .tf حسب مسؤوليتها، بالإضافة إلى سكريبت Bash خارجي يُحقن في الجهاز الافتراضي عبر metadata_startup_script.
# Structure recommandée pour ce projet premier-projet-gcp/ ├── versions.tf # Configuration Terraform + provider google ├── variables.tf # Variables d'entrée (project_id, region, zone, ...) ├── main.tf # VPC + subnet + firewall rules + VM Compute Engine ├── outputs.tf # IP publique, commande SSH IAP, URL HTTP ├── startup-script.sh # Script Bash exécuté au boot de la VM (Nginx) ├── terraform.tfvars # Valeurs spécifiques (project_id, ...) — NON-COMMITTÉ └── .gitignore # Exclure .tfstate, .tfvars, .terraform/, key.json
2.1 دور كل ملف
| الملف | الدور | يقرأه Terraform؟ |
|---|---|---|
versions.tf | كتلة terraform { required_providers } + كتلة provider "google" | نعم |
variables.tf | متغيرات الإدخال مع type و default و description | نعم |
main.tf | جميع موارد resource ومصادر data على GCP | نعم |
outputs.tf | المخرجات المعروضة بعد apply (IP، URL، أمر SSH IAP) | نعم |
startup-script.sh | سكريبت Bash يُحقن في الجهاز الافتراضي عبر الدالة file() | يُقرأ بواسطة file() |
terraform.tfvars | القيم الفعلية للمتغيرات (project_id = "...") | يُحمّل تلقائيًا |
.gitignore | استبعاد *.tfstate و *.tfvars و .terraform/ و key.json | لا (Git) |
2.2 كيف يحمّل Terraform الملفات
Chapitre 08 – Leçon 1 : GCP Fondamentaux et Authentification Terraform
gcloud CLI، إنشاء Service Account، تفعيل واجهات برمجة التطبيقات المطلوبة، وتهيئة موفر google في Terraform.1. التسلسل الهرمي لـ GCP مقابل AWS و Azure
| المستوى | AWS | Azure | GCP |
|---|---|---|---|
| المستوى الأعلى | Organization | Tenant | Organization |
| الحاوية الوسيطة | OU | Management Group | Folder |
| حساب الفوترة | Account | Subscription | Project (مرتبط بحساب فوترة) |
| المنطقة | Region | Location | Region (us-central1, europe-west1, northamerica-northeast1...) |
| المنطقة الفرعية | AZ | Availability Zone | Zone (us-central1-a, -b, -c) |
| هوية الخدمة | IAM Role | Service Principal / MI | Service Account |
project صراحة.2. تثبيت gcloud CLI
Windows (PowerShell)
تنزيل وتشغيل مثبت Google Cloud SDK الرسمي لنظام Windows. بمجرد تشغيله، يقوم المثبت بتهيئة gcloud وgsutil وbq، ويعرض تهيئة الاتصال بحساب GCP الخاص بك.
(New-Object Net.WebClient).DownloadFile("https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe", "$env:Temp\GoogleCloudSDKInstaller.exe")
& $env:Temp\GoogleCloudSDKInstaller.exemacOS
تثبيت gcloud عبر Homebrew (مدير الحزم الأكثر استخدامًا على macOS). يقوم cask بتثبيت SDK الكامل وإضافته تلقائيًا إلى PATH.
brew install --cask google-cloud-sdk
Linux (apt)
الإجراء الرسمي لـ Debian/Ubuntu: إضافة مستودع Google APT، استيراد مفتاح GPG الموقّع، ثم تثبيت google-cloud-cli. تتيح هذه الطريقة الحصول على التحديثات التلقائية عبر apt.
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" \
| sudo tee /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
sudo apt update && sudo apt install -y google-cloud-cliالتحقق السريع من التثبيت: يعرض الأمر إصدارات SDK وbq (BigQuery) وgsutil (Storage). إذا كان الإخراج فارغًا، فهناك مشكلة في PATH يجب تصحيحها قبل المتابعة.
# التحقق gcloud --version # Google Cloud SDK 488.x.x # bq 2.x.x # gsutil 5.x.x
3. إنشاء وتهيئة مشروع GCP
الإعداد الكامل لمشروع GCP عبر CLI:
# 1. تسجيل الدخول (يفتح المتصفح) gcloud auth login # 2. إنشاء مشروع (يجب أن يكون project_id فريدًا عالميًا) PROJECT_ID="monprojet-tf-$(date +%s)" gcloud projects create $PROJECT_ID --name="Mon Projet Terraform" # 3. ربطه بحساب الفوترة (إلزامي لمعظم الموارد) BILLING_ID=$(gcloud billing accounts list --format="value(ACCOUNT_ID)" --limit=1) gcloud billing projects link $PROJECT_ID --billing-account=$BILLING_ID # 4. تعيين المشروع النشط gcloud config set project $PROJECT_ID gcloud config set compute/region us-central1 gcloud config set compute/zone us-central1-a # 5. التحقق gcloud config list # [compute] # region = us-central1 # zone = us-central1-a # [core] # project = monprojet-tf-1714234567
4. تفعيل واجهات برمجة التطبيقات اللازمة
تفعيل دفعة واحدة لـ واجهات برمجة التطبيقات الأكثر شيوعًا على GCP اللازمة لـ Compute وStorage وIAM وCloud SQL وCloud Run وSecret Manager. يتيح الأمر الثاني (gcloud services list --enabled) التحقق مما هو مفعّل بالفعل على المشروع.
# Activer les APIs courantes
gcloud services enable \
compute.googleapis.com `# Compute Engine` \
storage.googleapis.com `# Cloud Storage` \
cloudresourcemanager.googleapis.com `# Resource Manager` \
iam.googleapis.com `# IAM` \
iamcredentials.googleapis.com `# IAM Credentials (pour SA tokens)` \
sqladmin.googleapis.com `# Cloud SQL Admin` \
run.googleapis.com `# Cloud Run` \
secretmanager.googleapis.com `# Secret Manager` \
--project=$PROJECT_ID
# Lister les APIs activées
gcloud services list --enabled --project=$PROJECT_IDChapitre 03 – Leçon 4 : Projet Serverless — Lambda, API Gateway et VPC avec Modules
1. المتطلبات الأساسية
ينشر هذا المشروع 3 وحدات Terraform تعمل معًا لتنسيق VPC ودالة Lambda وAPI Gateway. قبل تشغيل terraform apply، تحقق من توفر جميع العناصر أدناه — وإلا ستحصل على أخطاء IAM أو مهلات في استدعاء Lambda أو أخطاء 500 على الAPI.
1.1 الحسابات والأدوات
1.2 بيانات اعتماد AWS المطلوب استخراجها
ستحتاج إلى هذه المعلومات الثلاث من وحدة تحكم AWS لمصادقة Terraform:
| العنصر | مكان العثور عليه | مثال |
|---|---|---|
| Account ID (12 رقمًا) | وحدة تحكم AWS → أعلى اليمين، انقر على اسمك → حسابي | 123456789012 |
| Access Key ID | IAM → Users → مستخدمك → Security credentials → Create access key | AKIAIOSFODNN7EXAMPLE |
| Secret Access Key | يُعرض مرة واحدة فقط عند الإنشاء (وإلا أعد إنشاء مفتاح جديد) | wJalrXUt...EXAMPLEKEY |
aws configure (مخزنة في ~/.aws/credentials) أو متغيرات البيئة. أضف *.tfvars و*.tfstate* و.terraform/ وdist/ إلى .gitignore.1.3 تهيئة مصادقة AWS CLI
مرة واحدة فقط على جهازك: نفّذ aws configure والصق مفاتيحك. يُنشأ الملف ~/.aws/credentials، وسيقرأه Terraform تلقائيًا (لا يحتاج موفر AWS وموفر archive إلى أي رمز مميز محدد).
aws configure
# AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
# AWS Secret Access Key [None]: wJalrXUt...EXAMPLEKEY
# Default region name [None]: ca-central-1
# Default output format [None]: json
# التحقق من أنه يعمل
aws sts get-caller-identity
# {
# "UserId": "AIDA...EXAMPLE",
# "Account": "123456789012", ← معرّف حسابك
# "Arn": "arn:aws:iam::123456789012:user/votre-user"
# }1.4 أذونات IAM الدنيا
يجب أن يتمكن المستخدم (أو الدور) المستخدم من إنشاء Lambda وAPI Gateway وIAM (أدوار التنفيذ) وVPC وسجلات CloudWatch. لهذا التمرين، اربط السياسات المُدارة التالية بالمستخدم IAM:
| السياسة المُدارة من AWS | السبب |
|---|---|
AWSLambda_FullAccess | إنشاء/تعديل دالة Lambda وaws_lambda_permission |
AmazonAPIGatewayAdministrator | إنشاء REST API والطرق والتكاملات والنشر |
IAMFullAccess | إنشاء دور تنفيذ Lambda وربط السياسات به |
AmazonVPCFullAccess | إنشاء VPC والشبكات الفرعية ومجموعة الأمان لوحدة vpc |
CloudWatchLogsFullAccess | إنشاء aws_cloudwatch_log_group للـ Lambda |
PowerUserAccess + IAMFullAccess.1.5 كود مصدر Lambda
تقوم الوحدة data "archive_file" (المستخدمة في main.tf الجذري) بضغط كود Python الخاص بك تلقائيًا في كل plan. يجب إنشاء مجلد المصدر قبل أول terraform plan، وإلا سيفشل Terraform مع رسالة « source_dir does not exist »:
# Créer la structure attendue par data "archive_file" mkdir -p src/lambda touch src/lambda/index.py # Le contenu sera vu en section 8 # Pas de SSH/.pem nécessaire ici — la Lambda s'invoque via API Gateway, pas en SSH
2. هيكل المشروع
إليك الهيكل الكامل للمشروع، مصمم للنمطية. يلعب main.tf الجذري دور المنسق الرئيسي: ينشئ الوحدات الثلاث ويربط مخرجاتها/مدخلاتها. كل وحدة في modules/ هي مكتفية ذاتيًا (لها variables.tf وoutputs.tf الخاصة بها) ويمكن إعادة استخدامها في مشروع آخر.
# Structure complète du projet serverless
project-serverless/
├── providers.tf # Versions Terraform + provider AWS + archive
├── variables.tf # Variables globales (project_name, environment, region)
├── main.tf # Orchestration : appels module.vpc, module.lambda, module.api_gateway
├── outputs.tf # Outputs racines (api_url, lambda_name, lambda_arn)
├── terraform.tfvars # Valeurs concrètes (NON-COMMITTÉ)
├── .gitignore # *.tfstate, *.tfvars, .terraform/, dist/
├── README.md
│
├── src/
│ └── lambda/
│ └── index.py # Code Python de la Lambda
│
├── dist/ # ZIP généré par data "archive_file" (NON-COMMITTÉ)
│ └── lambda.zip
│
├── environments/ # Valeurs spécifiques par environnement
│ ├── dev.tfvars
│ └── prod.tfvars
│
└── modules/
├── vpc/ # Module réseau réutilisable
│ ├── main.tf # aws_vpc, aws_subnet, aws_security_group
│ ├── variables.tf # prefix, cidr, environment
│ └── outputs.tf # vpc_id, private_subnets, lambda_sg_id
│
├── lambda/ # Module fonction Lambda + IAM
│ ├── main.tf # aws_lambda_function, aws_cloudwatch_log_group
│ ├── iam.tf # Rôle d'exécution + policy attachments
│ ├── variables.tf # function_name, runtime, handler, vpc_id...
│ └── outputs.tf # function_name, function_arn, invoke_arn
│
└── api_gateway/ # Module API REST
├── main.tf # aws_api_gateway_rest_api, methods, deployment
├── variables.tf # api_name, lambda_arn, lambda_name
└── outputs.tf # api_id, api_url, stage2.1 دور كل ملف
| الملف | الدور | المستوى |
|---|---|---|
providers.tf | إصدارات Terraform + الموفرين (aws، archive) | الجذر |
variables.tf | المتغيرات العامة المشتركة بين جميع الوحدات | الجذر |
main.tf (الجذر) | ينشئ الوحدات وينقل مخرجات إحداها كمدخلات للأخرى | الجذر |
outputs.tf (الجذر) | يعيد عرض مخرجات الوحدات على مستوى المشروع (مثل api_url) | الجذر |
modules/<m>/main.tf | منطق العمل للوحدة (موارد AWS) | الوحدة |
modules/<m>/variables.tf | الواجهة العامة للوحدة — ما يمكن للمستهلك تهيئته | الوحدة |
modules/<m>/outputs.tf | القيم المعروضة من الوحدة (قابلة للاستهلاك من الجذر أو وحدة أخرى) | الوحدة |
src/lambda/index.py | كود تطبيق Python — يُضغط تلقائيًا بواسطة data "archive_file" | التطبيق |
environments/*.tfvars | القيم الفعلية لكل بيئة (تُمرر عبر -var-file) | التهيئة |
2.2 كيف يحمّل Terraform الملفات — لا يوجد "نقطة دخول"
main.tf أولاً. بل يدمج تلقائيًا جميع ملفات .tf في المجلد الحالي في مجموعة واحدة. أسماء main.tf وiam.tf وvariables.tf هي اصطلاح وليست إلزامًا تقنيًا. في وحدة lambda/، فصل iam.tf عن main.tf يحسن القراءة — أما Terraform فهو مكافئ تمامًا لملف واحد كبير.يغطي هذا المقال المقتطفات الأكثر فائدة — الدورة الكاملة Terraform Infrastructure Code (10 فصول، 38 درسًا، تمارين مصححة ومشروع نهائي) تأخذك إلى النهاية.
./acceder-au-cours-complet cours gratuit : Maîtriser Claude CodeFAQ
كم من الوقت يستغرق تعلم Terraform Infrastructure Code؟
هل هناك متطلبات مسبقة؟
من أين نبدأ عمليًا؟
📬 هل تريد تلقي هذا النوع من الأدلة كل أسبوع؟ اشترك مجانًا — كود حقيقي، بدون كلام فارغ.