تواجه المنظمات التي تعتمد على البنية التحتية ككود (IaC) على AWS غالبًا صعوبة في ضمان أن بنيتها التحتية ليست فقط موفرة بشكل صحيح ولكن أيضًا تعمل كما هو مقصود بمجرد نشرها. حتى التكوينات الخاطئة الطفيفة يمكن أن تؤدي إلى توقف مكلف، أو ثغرات أمنية، أو مشاكل في الأداء.
طرق الاختبار التقليدية – مثل فحص الموارد يدويًا أو الاعتماد فقط على تحليل الكود الثابت – لا توفر الثقة الكافية لبيئات الإنتاج. هناك حاجة ملحة لوجود طريقة موثوقة وآلية للتحقق من تغييرات البنية التحتية لـ AWS قبل أن تصبح حية.
الحل
Terratest يوفر إطار اختبار آلي مكتوب بلغة Go، مصمم خصيصًا لاختبار كود البنية التحتية في بيئات السحاب الحقيقية مثل AWS. من خلال نشر الموارد والتحقق منها وتدميرها برمجيًا، يسد Terratest الفجوة بين كتابة IaC (مثل Terraform) والشحن بثقة بالتغييرات. إليك كيف يعمل:
فيما يلي دليل مفصل حول كيفية تحقيق اختبار البنية التحتية لـ AWS باستخدام Terratest مع Terraform، جنبًا إلى جنب مع مقتطفات كود نموذجية بلغة Go. ستساعدك هذه العملية في توفير موارد AWS، وإجراء اختبارات عليها لضمان عملها كما هو مقصود، ثم تدمير كل شيء تلقائيًا.
المتطلبات الأساسية
تثبيت Terraform
قم بتنزيل وتثبيت Terraform من الموقع الرسمي.
تثبيت Go
تم كتابة Terratest بلغة Go، لذا ستحتاج إلى تثبيت Go. قم بتنزيل Go من الموقع الرسمي.
إعداد بيانات اعتماد AWS
تأكد من تكوين بيانات اعتماد AWS الخاصة بك (مثل ~/.aws/credentials أو متغيرات البيئة مثل AWS_ACCESS_KEY_ID
و AWS_SECRET_ACCESS_KEY
).
تهيئة وحدة Go
في دليل مشروعك، قم بتشغيل:
go mod init github.com/yourusername/yourproject
go mod tidy
إضافة Terratest إلى go.mod
في دليل المشروع/المستودع الخاص بك، قم بتشغيل:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
مثال على تكوين Terraform
قم بإنشاء تكوين Terraform بسيط يقوم بتشغيل مثيل AWS EC2. ضع الملفات التالية في دليل باسم aws_ec2_example (أو أي اسم تفضله).
احفظه كـ main.tf للرجوع إليه.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
required_version = ">= 1.3.0"
}
provider "aws" {
region = var.aws_region
}
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = "t2.micro"
tags = {
Name = "Terratest-Example"
}
}
output "instance_id" {
value = aws_instance.example.id
}
بعد ذلك، variables.tf:
variable "aws_region" {
type = string
default = "us-east-1"
}
variable "ami_id" {
type = string
default = "ami-0c55b159cbfafe1f0" # Example Amazon Linux AMI (update as needed)
}
لقطة كود Terratest
قم بإنشاء ملف اختبار Go في دليل باسم test (أو يمكنك تسميته أي شيء، لكن test هو الاسم التقليدي). على سبيل المثال، aws_ec2_test.go:
package test
import (
"testing"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestAwsEC2Instance(t *testing.T) {
// Define Terraform options to point to the Terraform folder
terraformOptions := &terraform.Options{
TerraformDir: "../aws_ec2_example",
// Optional: pass variables if you want to override defaults
Vars: map[string]interface{}{
"aws_region": "us-east-1",
"ami_id": "ami-0c55b159cbfafe1f0",
},
}
// At the end of the test, destroy the resources
defer terraform.Destroy(t, terraformOptions)
// Init and apply the Terraform configuration
terraform.InitAndApply(t, terraformOptions)
// Fetch the output variable
instanceID := terraform.Output(t, terraformOptions, "instance_id")
// Run a simple assertion to ensure the instance ID is not empty
assert.NotEmpty(t, instanceID, "Instance ID should not be empty")
}
ماذا يفعل هذا الاختبار
- يبدأ ويطبق تكوين Terraform في
../aws_ec2_exampl
e. - ينشر مثيل EC2 مع AMI المحدد في us-east-1.
- يستخرج مخرجات Terraform ل
instance_id
. - يتحقق من أن معرف المثيل ليس فارغًا باستخدام مكتبة Testify’s assert.
- يدمر الموارد في نهاية الاختبار لتجنب تكبد التكاليف المستمرة.
تشغيل الاختبارات
- انتقل إلى الدليل الذي يحتوي على ملف اختبار Go الخاص بك (مثل، دليل الاختبار).
- قم بتشغيل الأمر التالي:
go test -v
- راقب المخرجات:
- سترى Terraform تبدأ وتطبق بنيتك التحتية على AWS.
- بعد اجتياز تأكيدات الاختبار، سيقوم Terraform بتدمير الموارد.
الخاتمة
من خلال اتباع هذه الخطوات، يمكنك دمج Terratest في سير عمل AWS IaC الخاص بك لـ:
- توفير موارد AWS باستخدام Terraform.
- اختبارها برمجيًا مع اختبارات قائمة على Go.
- التحقق من أن بنيتك التحتية تم تكوينها بشكل صحيح وتعمل كما هو متوقع.
- قم بتفكيك تلقائيًا، لضمان عدم تكبدك تكاليف AWS غير الضرورية والحفاظ على بيئة نظيفة لتكرار اختباراتك.