أساسيات السحابة: خدمات AWS الأساسية

AWS CLI والواجهات البرمجية

18 دقيقة الدرس 9 من 30

AWS CLI والواجهات البرمجية

كل إجراء تتخذه في وحدة تحكم AWS — تشغيل نسخة EC2، أو إنشاء دلو S3، أو إرفاق سياسة IAM — ليس سوى استدعاء HTTPS مصادق عليه إلى نقطة نهاية API خاصة بـ AWS. وواجهة سطر أوامر AWS (CLI) ليست إلا غلافاً رفيعاً حول تلك الواجهات البرمجية عينها. فهم هذا التكافؤ هو التحول الذهني الذي يحوّلك من مشغّل وحدة تحكم إلى مهندس أتمتة قادر على كتابة نصوص برمجية، واختبار، وإعادة إنتاج، وإصدار التحكم في كل تغيير في البنية التحتية.

على نطاق الشركات الكبرى، CLI ليست اختصاراً للراحة — بل هي أساس كل خط نشر، وكتيب إجراءات تشغيل، ونص برمجي للاستجابة للحوادث. يغطي هذا الدرس كل ما تحتاجه لاستخدامها احترافياً: كيفية تحليل بيانات الاعتماد، وكيفية تكوين ملفات تعريف مسمّاة لحسابات وأدوار متعددة، والأنماط الرئيسية التي يستخدمها كل مهندس SRE يومياً، وكيفية تركيب خطوط أنابيب jq القوية لاستخراج الإشارة التي تحتاجها بالضبط من استجابات API بصيغة JSON.

كيف يحلّ CLI بيانات الاعتماد — سلسلة بيانات الاعتماد

أهم مفهوم يجب فهمه في AWS CLI هو سلسلة موفر بيانات الاعتماد (credential provider chain). عند تشغيل أي أمر aws، تعمل SDK عبر قائمة أولويات ثابتة وتستخدم أول مصدر لبيانات الاعتماد تجده:

  1. علامات CLI: --profile، و--region، وتجاوزات متغيرات البيئة الممررة مباشرة.
  2. متغيرات البيئة: AWS_ACCESS_KEY_ID، وAWS_SECRET_ACCESS_KEY، وAWS_SESSION_TOKEN، وAWS_PROFILE. هذه تتجاوز كل مصدر قائم على الملفات — مفيدة في CI لكنها خطرة إذا نسيتها مضبوطة في جلسة طرفية.
  3. ~/.aws/credentials و~/.aws/config: ملفات تعريف مسمّاة. يُستخدم ملف التعريف [default] عندما لا يُحدَّد ملف تعريف آخر.
  4. AWS SSO / Identity Center: رمز قصير الأجل يُحصل عليه عبر aws sso login.
  5. دور مهمة ECS / ملف تعريف نسخة EC2: على الحوسبة المدارة بواسطة AWS، تُحقن بيانات الاعتماد تلقائياً عبر Instance Metadata Service أو نقطة نهاية موفر بيانات اعتماد ECS. هذه هي الطريقة التي يجب أن تصادق بها أحمال العمل الإنتاجية — لا تضع مطلقاً مفاتيح طويلة الأجل داخل EC2 أو الحاويات.
  6. افتراض الدور عبر ملف تكوين AWS: ملف تعريف يحتوي role_arn + source_profile يجعل CLI تستدعي sts:AssumeRole تلقائياً وتخزن بيانات الاعتماد الناتجة مؤقتاً.
لا تضع مطلقاً مفاتيح IAM طويلة الأجل في متغيرات البيئة في الإنتاج. تسريب AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY في صورة Docker، أو سجل CI، أو ثنائي محمول هو أحد أكثر الأسباب شيوعاً لاستيلاء على الحسابات السحابية. في الإنتاج، استخدم دائماً ملفات تعريف النسخ، وأدوار المهام، أو جلسات SSO قصيرة الأجل. قم بتدوير أي مفتاح طويل الأجل موجود — تعامل معها كلمات مرور.

تكوين ملفات التعريف المسمّاة

يدير المستخدمون المحترفون لـ AWS حسابات متعددة — تطوير، وتدريج، وإنتاج، بالإضافة إلى حسابات منفصلة لكل فريق خدمة في المنظمات الكبيرة. تتيح ملفات التعريف المسمّاة في ~/.aws/config التبديل بين السياقات بشكل نظيف دون إعادة تصدير متغيرات البيئة.

# ~/.aws/config — ملف التكوين الرئيسي (بيانات الاعتماد تذهب إلى ~/.aws/credentials) [default] region = us-east-1 output = json # ملف تعريف بيانات اعتماد ثابتة (لحساب AWS الشخصي للتطوير) [profile dev] region = us-west-2 output = json # ملف تعريف افتراض الدور — تستدعي CLI sts:AssumeRole تلقائياً [profile prod-readonly] role_arn = arn:aws:iam::123456789012:role/ReadOnlyOpsRole source_profile = dev region = us-east-1 role_session_name = edrees-ops-session duration_seconds = 3600 # ملف تعريف SSO (Identity Center — مفضل للوصول البشري في المنظمات الكبيرة) [profile acme-prod] sso_start_url = https://acme.awsapps.com/start sso_account_id = 987654321098 sso_role_name = SREReadOnly sso_region = us-east-1 region = us-east-1 output = json

بمجرد تحديد ملفات التعريف، حدّدها لكل أمر باستخدام --profile أو اضبط AWS_PROFILE طوال فترة جلسة Shell:

# علامة ملف التعريف الصريح — الأأمن للنصوص البرمجية، لا لبس فيه دائماً aws s3 ls --profile prod-readonly # تسجيل الدخول إلى SSO وتخزين رمز قصير الأجل (ينتهي بعد 8 ساعات افتراضياً) aws sso login --profile acme-prod # تحقق من الهوية التي تتصرف بها — شغّل هذا دائماً أولاً في shell جديد aws sts get-caller-identity --profile acme-prod # الناتج: # { # "UserId": "AROA...:edrees-ops-session", # "Account": "987654321098", # "Arn": "arn:aws:sts::987654321098:assumed-role/SREReadOnly/edrees-ops-session" # } # تبديل البيئة لبقية الجلسة export AWS_PROFILE=prod-readonly export AWS_DEFAULT_REGION=us-east-1 # تحقق من التكوين الفعلي الحالي aws configure list
شغّل دائماً aws sts get-caller-identity قبل أي عملية مدمرة — terminate-instances، وdelete-stack، وdelete-bucket. تستغرق 200 ميلي ثانية وتؤكد أنك مصادق عليه بالدور الذي تقصده، في الحساب الذي تقصده. الفرق التي تتخطى هذه الخطوة تحذف عن طريق الخطأ موارد الإنتاج من ملف تعريف خاطئ.

أنماط CLI الشائعة التي يستخدمها كل مهندس SRE

علامة --query (تعبير JMESPath) وعلامة --output (json أو text أو table أو yaml) هما أدواتك الأساسية لتشكيل استجابات API دون أدوات خارجية. ادمجهما مع --filters لدفع التصفية إلى جانب الخادم وتجنب نقل حمولات استجابة كبيرة.

AWS CLI Request and Response Flow Terminal aws ec2 describe --query --filter AWS CLI Credential chain Sign request (SigV4) HTTPS AWS API Authn: SigV4 Authz: IAM policy Server-side --filter JSON response ec2.amazonaws.com jq / --query Client-side transform table / text / yaml أنت تكتب أنت تقرأ
تدفق طلب AWS CLI: تُحلَّل بيانات الاعتماد محلياً، يُوقَّع الطلب بـ SigV4، يُرسَل إلى AWS API، وتُشكَّل استجابة JSON بواسطة --query أو تُمرَّر عبر jq.
# --- أنماط EC2 --- # سرد النسخ الشغّالة: المعرف، والنوع، ومنطقة التوفر، والـ IP الخاص، واسم الوسم aws ec2 describe-instances \ --filters "Name=instance-state-name,Values=running" \ --query 'Reservations[*].Instances[*].{ ID:InstanceId, Type:InstanceType, AZ:Placement.AvailabilityZone, IP:PrivateIpAddress, Name:Tags[?Key==`Name`]|[0].Value }' \ --output table # إيقاف نسخة محددة (حماية الإنتاج: اطلب علامة --profile دائماً) aws ec2 stop-instances \ --instance-ids i-0abc123def456 \ --profile dev # إنهاء كل النسخ الموقوفة في منطقة (نفّذ DRY RUN أولاً -- مهم!) aws ec2 describe-instances \ --filters "Name=instance-state-name,Values=stopped" \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text | xargs aws ec2 terminate-instances --dry-run --instance-ids # --- أنماط S3 --- # مزامنة دليل محلي مع S3 (رفع الملفات المتغيرة فقط) aws s3 sync ./dist s3://my-frontend-bucket/ \ --delete \ --cache-control "max-age=31536000" \ --exclude "*.html" \ --include "*.js" --include "*.css" # --- أنماط CloudFormation --- # نشر مكدس (إنشاء أو تحديث) — مستقل aws cloudformation deploy \ --template-file infra/vpc.yaml \ --stack-name acme-vpc \ --capabilities CAPABILITY_IAM \ --parameter-overrides Env=prod CIDR=10.0.0.0/16 \ --profile prod-readonly # متابعة أحداث المكدس أثناء النشر aws cloudformation describe-stack-events \ --stack-name acme-vpc \ --query 'StackEvents[?ResourceStatus!=`UPDATE_COMPLETE`].[Timestamp,ResourceStatus,ResourceStatusReason]' \ --output text | head -20

خطوط أنابيب jq للاستعلامات الإنتاجية

jq هو معالج JSON في سطر الأوامر يجب أن يكون كل مهندس SRE بارعاً فيه. بينما يتعامل --query المدمج في CLI (JMESPath) مع الإسقاطات البسيطة، يمنحك jq تحويلات كاملة: شروط، وعمليات حسابية، وتجميع، ومفاتيح مخصصة، وربط بين موارد مختلفة. مرّر أي استدعاء aws ... --output json عبر jq وسيكون لديك محرك استعلام كامل على حالة بنيتك التحتية.

# البحث عن نسخ EC2 غير مُوسوَمة بـ "Environment" — تدقيق امتثال شائع aws ec2 describe-instances --output json | \ jq ' [.Reservations[].Instances[] | select(.State.Name == "running") | select(.Tags == null or ((.Tags | map(.Key) | index("Environment")) == null)) | {id: .InstanceId, type: .InstanceType, az: .Placement.AvailabilityZone} ] ' # مساعد تحليل التكلفة: عدّ النسخ الشغّالة لكل نوع aws ec2 describe-instances \ --filters "Name=instance-state-name,Values=running" \ --output json | \ jq ' [.Reservations[].Instances[].InstanceType] | group_by(.) | map({type: .[0], count: length}) | sort_by(.count) | reverse ' # استخراج صحة أهداف ELB — أي الأهداف غير صحية؟ aws elbv2 describe-target-health \ --target-group-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/my-tg/abc123 \ --output json | \ jq ' [.TargetHealthDescriptions[] | select(.TargetHealth.State != "healthy") | {id: .Target.Id, port: .Target.Port, state: .TargetHealth.State, reason: .TargetHealth.Reason} ] ' # سلسلة: ابحث عن Security Group لنسخة شغّالة، ثم سرد قواعدها INSTANCE_ID="i-0abc123def456" SG_ID=$(aws ec2 describe-instances \ --instance-ids $INSTANCE_ID \ --output json | \ jq -r '.Reservations[0].Instances[0].SecurityGroups[0].GroupId') aws ec2 describe-security-groups \ --group-ids $SG_ID \ --output json | \ jq ' .SecurityGroups[0].IpPermissions[] | {proto: .IpProtocol, from: .FromPort, to: .ToPort, cidrs: [.IpRanges[].CidrIp]} '
استخدم --dry-run قبل العمليات المدمرة. تقبل كثير من استدعاءات الكتابة في EC2 وIAM علامة --dry-run. ترسل الطلب المصادق عليه كاملاً إلى AWS، وتُجري كل فحوصات تفويض IAM، لكنها لا تنفذ التغيير. ستحصل على خطأ DryRunOperation (يعني "لديك الإذن وهذا كان سينجح") أو خطأ مصادقة حقيقي (يعني "أصلح IAM قبل التنفيذ الفعلي"). اجعل dry-run جزءاً من معيار كتيب الإجراءات لأي عملية تمس الإنتاج.

واجهات AWS البرمجية خارج CLI — SDKs والـ HTTP المباشر

CLI مبنية على boto3 (SDK بايثون) أو Go SDK لـ CLI الإصدار الثاني الأحدث. كل استدعاء SDK يُعادل 1:1 أمر CLI: aws ec2 describe-instances هو بالضبط boto3.client('ec2').describe_instances(). فهم هذا يتيح لك النمذجة في CLI ثم الترقية إلى كود SDK في دوال Lambda، ومزودي Terraform، والأدوات الداخلية دون إعادة تعلم شكل الـ API.

كل طلب AWS API مصادق عليه باستخدام Signature Version 4 (SigV4) — خوارزمية توقيع HMAC-SHA256 تغطي طريقة الطلب، والـ URI، والترويسات، والجسم، مما يمنع التلاعب أثناء النقل. لن تنفّذ SigV4 يدوياً أبداً (كل SDK تفعل ذلك)، لكن معرفة وجودها يُفسّر لماذا يبطّل تدوير مفتاح مخترَق فوراً جميع الطلبات الجارية الموقعة بالمفتاح القديم.

صفحّ كل شيء في النصوص البرمجية. معظم واجهات AWS للقوائم تُعيد بحد أقصى 100–1000 نتيجة لكل استدعاء وNextToken للصفحات اللاحقة. علامة CLI --no-paginate تجلب كل الصفحات تلقائياً (على حساب الذاكرة)، بينما لدى AWS SDK كائنات paginator مخصصة. نص برمجي يقرأ فقط الصفحة الأولى من describe-instances أو list-buckets يفوّت موارد بصمت في الحسابات الكبيرة — خطأ خفي تسبّب في حوادث إنتاجية حقيقية عندما فوّتت نصوص الامتثال موارد غير مُوسوَمة أو مُهيَّأة بشكل خاطئ.

النقاط الرئيسية

  • تحلّ سلسلة موفر بيانات الاعتماد بيانات الاعتماد بترتيب أولوية صارم: العلامات، ومتغيرات البيئة، وملفات التكوين، وSSO، وملف تعريف النسخة. في الإنتاج، استخدم دائماً ملفات تعريف النسخ أو أدوار المهام — لا مفاتيح طويلة الأجل.
  • ملفات التعريف المسمّاة في ~/.aws/config مع role_arn + source_profile تتيح افتراض الدور التلقائي — ضروري للبيئات متعددة الحسابات.
  • شغّل aws sts get-caller-identity قبل أي عملية مدمرة للتأكد من الهوية الفعلية والحساب.
  • استخدم --filters للتصفية من جانب الخادم (يقلل حجم استجابة API) و--query (JMESPath) للإسقاط من جانب العميل.
  • jq يُتيح استعلامات عبر موارد متعددة، ومنطقاً شرطياً، وتجميعاً، وخطوط أنابيب تدقيق لا يستطيع JMESPath التعبير عنها.
  • كل استدعاءات CLI هي طلبات HTTP مصادق عليها موقعة بـ SigV4. CLI سكر نحوي رفيع فوق نفس الواجهات البرمجية العامة التي تستخدمها وحدة التحكم وSDKs وTerraform.
  • صفحّ دائماً في النصوص البرمجية — تفويت الصفحة الثانية من النتائج هو نمط فشل حقيقي وصامت في الحسابات كبيرة النطاق.