In this step, you will learn how to monitor the application, view logs, and troubleshoot common issues using CloudWatch, CloudWatch Logs, and other AWS tools.
# CPU Utilization
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=AutoScalingGroupName,Value=workshop-aws-dev-asg \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 300 \
--statistics Average,Maximum \
--region ap-southeast-1
# Memory Utilization (if CloudWatch Agent installed)
aws cloudwatch get-metric-statistics \
--namespace CWAgent \
--metric-name mem_used_percent \
--dimensions Name=AutoScalingGroupName,Value=workshop-aws-dev-asg \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 300 \
--statistics Average \
--region ap-southeast-1
# Database Connections
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name DatabaseConnections \
--dimensions Name=DBInstanceIdentifier,Value=workshop-aws-dev-db \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 300 \
--statistics Average,Maximum \
--region ap-southeast-1
# CPU Utilization
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name CPUUtilization \
--dimensions Name=DBInstanceIdentifier,Value=workshop-aws-dev-db \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 300 \
--statistics Average \
--region ap-southeast-1
# Request Count
aws cloudwatch get-metric-statistics \
--namespace AWS/ApplicationELB \
--metric-name RequestCount \
--dimensions Name=LoadBalancer,Value=app/workshop-aws-dev-alb/xxxxx \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 300 \
--statistics Sum \
--region ap-southeast-1
# Target Response Time
aws cloudwatch get-metric-statistics \
--namespace AWS/ApplicationELB \
--metric-name TargetResponseTime \
--dimensions Name=LoadBalancer,Value=app/workshop-aws-dev-alb/xxxxx \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 300 \
--statistics Average \
--region ap-southeast-1
# List log streams
aws logs describe-log-streams \
--log-group-name /aws/workshop-aws/dev/application \
--order-by LastEventTime \
--descending \
--max-items 5 \
--region ap-southeast-1
# Tail logs (real-time)
aws logs tail /aws/workshop-aws/dev/application \
--follow \
--region ap-southeast-1
# Filter logs by pattern
aws logs filter-log-events \
--log-group-name /aws/workshop-aws/dev/application \
--filter-pattern "ERROR" \
--start-time $(date -d '1 hour ago' +%s)000 \
--region ap-southeast-1
# Search for specific errors
aws logs filter-log-events \
--log-group-name /aws/workshop-aws/dev/application \
--filter-pattern "NullPointerException" \
--start-time $(date -d '1 hour ago' +%s)000 \
--region ap-southeast-1
# Get instance ID
INSTANCE_ID=$(aws ec2 describe-instances \
--filters "Name=tag:aws:cloudformation:stack-name,Values=workshop-aws-dev" \
"Name=instance-state-name,Values=running" \
--region ap-southeast-1 \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
# Get console output
aws ec2 get-console-output \
--instance-id $INSTANCE_ID \
--region ap-southeast-1 \
--output text
# List all alarms
aws cloudwatch describe-alarms \
--alarm-name-prefix workshop-aws-dev \
--region ap-southeast-1
# Get alarm history
aws cloudwatch describe-alarm-history \
--alarm-name workshop-aws-dev-cpu-high \
--max-records 10 \
--region ap-southeast-1
# Alarm for High Error Rate
aws cloudwatch put-metric-alarm \
--alarm-name workshop-aws-dev-high-error-rate \
--alarm-description "Alert when error rate exceeds 5%" \
--metric-name 5XXError \
--namespace AWS/ApplicationELB \
--statistic Sum \
--period 300 \
--evaluation-periods 2 \
--threshold 10 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=LoadBalancer,Value=app/workshop-aws-dev-alb/xxxxx \
--alarm-actions arn:aws:sns:ap-southeast-1:123456789012:workshop-aws-dev-alarms \
--region ap-southeast-1
# Alarm for Database Connections
aws cloudwatch put-metric-alarm \
--alarm-name workshop-aws-dev-high-db-connections \
--alarm-description "Alert when DB connections exceed 80" \
--metric-name DatabaseConnections \
--namespace AWS/RDS \
--statistic Average \
--period 300 \
--evaluation-periods 2 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=DBInstanceIdentifier,Value=workshop-aws-dev-db \
--alarm-actions arn:aws:sns:ap-southeast-1:123456789012:workshop-aws-dev-alarms \
--region ap-southeast-1
# Create dashboard JSON
cat > dashboard.json <<'EOF'
{
"widgets": [
{
"type": "metric",
"properties": {
"metrics": [
["AWS/EC2", "CPUUtilization", {"stat": "Average"}]
],
"period": 300,
"stat": "Average",
"region": "ap-southeast-1",
"title": "EC2 CPU Utilization"
}
},
{
"type": "metric",
"properties": {
"metrics": [
["AWS/RDS", "DatabaseConnections", {"stat": "Average"}]
],
"period": 300,
"stat": "Average",
"region": "ap-southeast-1",
"title": "RDS Connections"
}
},
{
"type": "metric",
"properties": {
"metrics": [
["AWS/ApplicationELB", "RequestCount", {"stat": "Sum"}]
],
"period": 300,
"stat": "Sum",
"region": "ap-southeast-1",
"title": "ALB Request Count"
}
}
]
}
EOF
# Create dashboard
aws cloudwatch put-dashboard \
--dashboard-name workshop-aws-dev-dashboard \
--dashboard-body file://dashboard.json \
--region ap-southeast-1
Open CloudWatch Console → Dashboards → workshop-aws-dev-dashboard
Symptoms:
Diagnosis:
# Check CPU metrics
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=AutoScalingGroupName,Value=workshop-aws-dev-asg \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 60 \
--statistics Average,Maximum \
--region ap-southeast-1
# SSH to EC2 and check processes
aws ssm start-session --target $INSTANCE_ID
top -bn1 | head -20
Solutions:
Symptoms:
Diagnosis:
# Check DB connections
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name DatabaseConnections \
--dimensions Name=DBInstanceIdentifier,Value=workshop-aws-dev-db \
--start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
--period 60 \
--statistics Average,Maximum \
--region ap-southeast-1
# Connect to DB and check
mysql -h $RDS_ENDPOINT -u admin -p
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
Solutions:
Symptoms:
Diagnosis:
# Check target health
aws elbv2 describe-target-health \
--target-group-arn <arn> \
--region ap-southeast-1
# Check backend logs
aws logs tail /aws/workshop-aws/dev/application --follow
# Check Security Groups
aws ec2 describe-security-groups \
--group-ids <ec2-sg-id> \
--region ap-southeast-1
Solutions:
systemctl status workshop# Daily health check script
#!/bin/bash
echo "=== Daily Health Check ==="
echo "Date: $(date)"
# Check stack status
echo "CloudFormation Stack:"
aws cloudformation describe-stacks --stack-name workshop-aws-dev --query 'Stacks[0].StackStatus'
# Check EC2
echo "EC2 Instances:"
aws ec2 describe-instances --filters "Name=tag:aws:cloudformation:stack-name,Values=workshop-aws-dev" --query 'Reservations[*].Instances[*].[InstanceId,State.Name]'
# Check RDS
echo "RDS Database:"
aws rds describe-db-instances --db-instance-identifier workshop-aws-dev-db --query 'DBInstances[0].DBInstanceStatus'
# Check API
echo "API Health:"
curl -s $API_URL/dna_service/actuator/health | jq .
After setting up monitoring: