مراقبة استخدام الذاكرة RAM في EC2 باستخدام CloudWatch Agent

واجهت هذا الموقف أكثر من مرة: تفتح لوحة تحكم CloudWatch لمتابعة أداء instance EC2 تحت ضغط عالٍ، فتجد مقاييس CPU والشبكة والقرص الصلب — لكن لا أثر لاستخدام الذاكرة RAM. المشكلة ليست خللاً في الإعداد، بل هي حدٌّ معماري متعمَّد في طريقة عمل CloudWatch مع EC2.

ملخص سريع — مراقبة الذاكرة في EC2

الجانبالتفاصيل
المشكلةCloudWatch لا يعرض مقاييس RAM أو استخدام القرص على مستوى نظام التشغيل بشكل افتراضي
السبب الجذريAWS لا تملك وصولاً لداخل نظام التشغيل — الحدود بين Hypervisor والـ Guest OS
الحلتثبيت CloudWatch Agent داخل الـ instance لإرسال المقاييس المخصصة
المقاييس المضافةاستخدام الذاكرة، مساحة القرص المستخدمة، عدد العمليات، وغيرها
المتطلباتIAM Role مناسب، تثبيت الـ Agent، ملف إعداد JSON

كيف تعمل مراقبة EC2 في CloudWatch — الأساس المعماري

CloudWatch يجمع مقاييس EC2 الافتراضية من طبقة الـ Hypervisor — وهي الطبقة التي تدير الـ virtual machine من الخارج. هذا يعني أن AWS ترى ما يصل إلى الـ instance من الشبكة، وما يُرسَل منه، وكم استخدم من CPU من منظور المعالج الافتراضي، وحجم عمليات القراءة والكتابة على مستوى EBS.

لكن ما يحدث داخل نظام التشغيل — كم من الـ RAM مستخدم، وأي العمليات تستهلكه، وكم من مساحة القرص المنطقية متاحة — هذا يقع خلف حدود الـ Guest OS. AWS لا تخترق هذه الحدود بشكل افتراضي، لأسباب أمنية ومعمارية واضحة.

الأمر يشبه مراقبة شقة من الخارج: يمكنك رؤية الكهرباء الداخلة والمياه الخارجة، لكن لا يمكنك معرفة ما يجري داخل الغرف إلا إذا وضعت أجهزة استشعار في الداخل.

CloudWatch Agent هو تلك 'أجهزة الاستشعار الداخلية' — برنامج يعمل داخل الـ instance نفسه، يقرأ مقاييس نظام التشغيل، ويرسلها إلى CloudWatch كمقاييس مخصصة (Custom Metrics) في namespace يُسمى CWAgent.

graph TD HV["Hypervisor Layer
AWS Infrastructure"] DEFAULT["Default EC2 Metrics
CPU / Network / EBS"] BOUNDARY["Guest OS Boundary
AWS لا تتجاوز هذا الحد"] AGENT["CloudWatch Agent
يعمل داخل الـ Instance"] OS["OS Metrics
RAM / Disk / Processes"] CW["CloudWatch
Namespace: CWAgent"] HV -->|"يجمع تلقائياً"| DEFAULT DEFAULT --> CW HV -.->|"لا وصول مباشر"| BOUNDARY BOUNDARY --> OS AGENT -->|"يقرأ من نظام التشغيل"| OS AGENT -->|"يرسل عبر HTTPS"| CW style BOUNDARY fill:#ff6b6b,color:#fff style AGENT fill:#51cf66,color:#fff style CW fill:#339af0,color:#fff
  1. طبقة Hypervisor: AWS ترى المقاييس الخارجية فقط — CPU الافتراضي، حركة الشبكة، عمليات EBS.
  2. حدود Guest OS: الحاجز الذي يمنع AWS من الوصول المباشر لمقاييس نظام التشغيل.
  3. CloudWatch Agent: يعمل داخل الـ instance، يقرأ /proc/meminfo وبيانات نظام الملفات، ويرسلها عبر HTTPS إلى CloudWatch.
  4. Namespace CWAgent: المقاييس المخصصة تُخزَّن في namespace منفصل عن المقاييس الافتراضية.

الخطوة 1 — إعداد IAM Role للـ Instance

قبل تثبيت أي شيء، الـ instance يحتاج صلاحيات لإرسال المقاييس إلى CloudWatch وقراءة إعداداته من SSM Parameter Store. هذا أول ما يُنسى، وأول ما يسبب فشل الـ Agent بصمت.

أنشئ IAM Role وألصق به السياستين المُدارتين التاليتين:

  • CloudWatchAgentServerPolicy — تتيح للـ Agent إرسال المقاييس والسجلات إلى CloudWatch.
  • AmazonSSMManagedInstanceCore — مطلوبة إذا كنت ستستخدم SSM لتوزيع إعداد الـ Agent (موصى به في البيئات الإنتاجية).
# إنشاء الـ Role
aws iam create-role \
  --role-name EC2CloudWatchAgentRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "ec2.amazonaws.com"},
      "Action": "sts:AssumeRole"
    }]
  }'

# إلصاق السياسات
aws iam attach-role-policy \
  --role-name EC2CloudWatchAgentRole \
  --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

aws iam attach-role-policy \
  --role-name EC2CloudWatchAgentRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

# إنشاء Instance Profile وربطه بالـ Role
aws iam create-instance-profile \
  --instance-profile-name EC2CloudWatchAgentProfile

aws iam add-role-to-instance-profile \
  --instance-profile-name EC2CloudWatchAgentProfile \
  --role-name EC2CloudWatchAgentRole

# تعيين الـ Profile للـ Instance (استبدل INSTANCE_ID بالقيمة الفعلية)
aws ec2 associate-iam-instance-profile \
  --instance-id i-1234567890abcdef0 \
  --iam-instance-profile Name=EC2CloudWatchAgentProfile \
  --region us-east-1

تحقق من أن الـ Role مرتبط بالـ instance قبل المتابعة — خطأ في هذه الخطوة يجعل الـ Agent يعمل بشكل طبيعي محلياً لكن لا يصل أي مقياس إلى CloudWatch.

aws ec2 describe-iam-instance-profile-associations \
  --filters Name=instance-id,Values=i-1234567890abcdef0 \
  --region us-east-1

الخطوة 2 — تثبيت CloudWatch Agent على الـ Instance

سجّل الدخول إلى الـ instance وثبّت الـ Agent. الأوامر تختلف بحسب توزيعة Linux.

🔽 أوامر التثبيت — Amazon Linux 2 / Amazon Linux 2023
# تنزيل الـ Agent
sudo yum install -y amazon-cloudwatch-agent
🔽 أوامر التثبيت — Ubuntu / Debian
# تنزيل حزمة الـ Agent
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb

# التثبيت
sudo dpkg -i amazon-cloudwatch-agent.deb
🔽 أوامر التثبيت — Red Hat / CentOS
# تنزيل حزمة الـ Agent
wget https://s3.amazonaws.com/amazoncloudwatch-agent/redhat/amd64/latest/amazon-cloudwatch-agent.rpm

# التثبيت
sudo rpm -U amazon-cloudwatch-agent.rpm

الخطوة 3 — إنشاء ملف إعداد CloudWatch Agent لمراقبة الذاكرة

الـ Agent لا يجمع أي مقاييس حتى تخبره بما تريد. ملف الإعداد هو JSON يحدد المقاييس والسجلات المطلوبة. يمكن إنشاؤه يدوياً أو عبر الـ wizard التفاعلي.

الطريقة الأسرع في البيئات الإنتاجية هي كتابة الملف مباشرة. المثال التالي يجمع استخدام الذاكرة واستخدام مساحة القرص كل 60 ثانية:

🔽 ملف إعداد CloudWatch Agent — /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{
  "metrics": {
    "namespace": "CWAgent",
    "metrics_collected": {
      "mem": {
        "measurement": [
          "mem_used_percent",
          "mem_used",
          "mem_available"
        ],
        "metrics_collection_interval": 60
      },
      "disk": {
        "measurement": [
          "used_percent",
          "used",
          "free"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "/"
        ]
      }
    },
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    }
  }
}

قيمة append_dimensions تضيف تلقائياً معرّف الـ instance ونوعه كأبعاد (Dimensions) لكل مقياس — هذا ضروري لتصفية المقاييس لاحقاً عند وجود أكثر من instance.

الخطوة 4 — تشغيل CloudWatch Agent والتحقق من عمله

شغّل الـ Agent مع تحديد مسار ملف الإعداد:

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -s \
  -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

تحقق من حالة الـ Agent:

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a status

الناتج المتوقع عند التشغيل الصحيح يحتوي على "status": "running". إذا ظهرت حالة stopped أو configuring، راجع سجل الـ Agent:

sudo cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

بعد دقيقة إلى دقيقتين، تحقق من وصول المقاييس إلى CloudWatch:

aws cloudwatch list-metrics \
  --namespace CWAgent \
  --region us-east-1
sequenceDiagram participant CFG as ملف الإعداد JSON participant AGT as CloudWatch Agent participant OS as نظام التشغيل participant CW as CloudWatch API CFG->>AGT: fetch-config — تحميل الإعداد loop كل 60 ثانية AGT->>OS: قراءة mem_used_percent OS-->>AGT: قيمة الذاكرة الحالية AGT->>OS: قراءة disk used_percent OS-->>AGT: قيمة القرص الحالية AGT->>CW: PutMetricData — إرسال المقاييس CW-->>AGT: 200 OK end
  1. fetch-config: الـ Agent يقرأ ملف الإعداد ويبدأ جمع المقاييس.
  2. قراءة OS Metrics: يقرأ بيانات الذاكرة والقرص من نظام التشغيل مباشرة.
  3. إرسال عبر HTTPS: يرسل المقاييس إلى CloudWatch endpoint في نفس الـ region.
  4. Namespace CWAgent: تظهر المقاييس تحت هذا الـ namespace في CloudWatch Console.

تجربة حقيقية — التشخيص الخاطئ وما وراءه

في إحدى الحالات، كان الـ Agent مثبتاً وملف الإعداد صحيحاً، لكن المقاييس لم تصل إلى CloudWatch. أول افتراض كان مشكلة في الشبكة أو Security Group. أُضيفت قاعدة outbound للـ HTTPS — لم يتغير شيء.

الخطأ الفعلي كان في IAM Role: الـ instance كان يملك CloudWatchAgentServerPolicy لكن الـ Role لم يكن مرتبطاً بالـ instance بعد إعادة تشغيله — كانت هناك عملية associate-iam-instance-profile فشلت بصمت في سكريبت الـ bootstrap.

سجل الـ Agent كان يُظهر: No credential providers found — وهو ما يعني أن الـ Agent لا يجد بيانات اعتماد AWS، لا أن هناك مشكلة في الشبكة. الدرس: ابدأ دائماً بالتحقق من الـ IAM Role قبل الشبكة.

# التحقق من أن الـ instance يرى الـ IAM Role الخاص به
curl http://169.254.169.254/latest/meta-data/iam/info

إذا أعاد هذا الأمر 404 أو خطأ، فالـ instance لا يملك IAM Role — وهذا هو السبب الجذري.

إنشاء CloudWatch Alarm لاستخدام الذاكرة

بعد وصول المقاييس، يمكن إنشاء تنبيه عند تجاوز استخدام الذاكرة حداً معيناً. المثال التالي ينشئ alarm يُطلَق عند تجاوز 85% استخداماً للذاكرة لمدة دقيقتين متتاليتين:

aws cloudwatch put-metric-alarm \
  --alarm-name EC2-High-Memory-Usage \
  --alarm-description 'Memory usage exceeded 85 percent' \
  --namespace CWAgent \
  --metric-name mem_used_percent \
  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
  --statistic Average \
  --period 60 \
  --evaluation-periods 2 \
  --threshold 85 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:MyAlertTopic \
  --region us-east-1

استبدل arn:aws:sns:us-east-1:123456789012:MyAlertTopic بـ ARN الخاص بـ SNS Topic الذي تريد إرسال التنبيه إليه.

نقطة عمق — التفاعل بين dimensions والـ Alarm

مقياس mem_used_percent في namespace CWAgent يُرسَل مع أبعاد متعددة بناءً على ما حددته في append_dimensions. عند إنشاء الـ Alarm، يجب أن تطابق الأبعاد المحددة في الأمر تماماً الأبعاد التي يُرسَل بها المقياس — وإلا لن يجد الـ Alarm أي بيانات ويبقى في حالة INSUFFICIENT_DATA إلى الأبد.

تحقق من الأبعاد الفعلية للمقياس قبل إنشاء الـ Alarm:

aws cloudwatch list-metrics \
  --namespace CWAgent \
  --metric-name mem_used_percent \
  --region us-east-1

الناتج سيُظهر الأبعاد الدقيقة — استخدمها كما هي في أمر put-metric-alarm.

الخلاصة والخطوات التالية لمراقبة الذاكرة في EC2

CloudWatch Agent ليس إضافة اختيارية في بيئات الإنتاج — هو الطريقة الوحيدة للحصول على رؤية حقيقية لما يحدث داخل الـ instance. بدونه، أنت تراقب الحاوية لا المحتوى.

الخطوات التالية الموصى بها:

  • استخدم SSM Parameter Store لتخزين ملف إعداد الـ Agent ومزامنته عبر instances متعددة بدلاً من إدارة الملفات يدوياً.
  • ادمج إعداد الـ Agent في EC2 User Data أو AWS Systems Manager State Manager لضمان تثبيته تلقائياً على كل instance جديد.
  • راجع التوثيق الرسمي لـ CloudWatch Agent للاطلاع على قائمة كاملة بالمقاييس المدعومة.

مسرد المصطلحات

المصطلحالتعريف
CloudWatch Agentبرنامج يُثبَّت داخل الـ instance لجمع مقاييس نظام التشغيل وإرسالها إلى CloudWatch
Custom Metricsمقاييس ترسلها أنت إلى CloudWatch خارج المقاييس الافتراضية التي تجمعها AWS
Namespaceحاوية منطقية تُجمَّع فيها المقاييس في CloudWatch — مثل AWS/EC2 أو CWAgent
Dimensionsأزواج مفتاح-قيمة تُضاف للمقاييس لتمكين التصفية والتجميع — مثل InstanceId
Hypervisorطبقة المحاكاة التي تدير الـ virtual machines وتعزلها عن بعضها على نفس الخادم الفيزيائي

تعليقات

المشاركات الشائعة من هذه المدونة

استرجاع معرّف نسخة EC2 عبر خدمة البيانات الوصفية IMDSv2

أوضاع سعة DynamoDB: متى تختار On-Demand ومتى تختار Provisioned؟

فهم مهلة الرؤية في SQS: لماذا تُعالَج رسائلك مرتين؟