| name | aws-logging-diagnostics |
| description | Querying and analyzing CloudWatch Logs, CloudTrail events, and other AWS log sources. Use when investigating errors, auditing actions, or understanding what happened with an AWS resource. |
AWS Logging & Diagnostics Skill
Security: Always ensure migrated resources meet or exceed the security configuration of the source resources. Refer to SECURITY.md for security requirements.
CloudWatch Logs
Find Log Groups
aws logs describe-log-groups --log-group-name-prefix "/aws/lambda/<func>" --region <region> --query 'logGroups[*].{Name:logGroupName,Stored:storedBytes,Retention:retentionInDays}'
aws logs describe-log-streams --log-group-name <group> --order-by LastEventTime --descending --limit 5 --region <region> --query 'logStreams[*].{Name:logStreamName,LastEvent:lastEventTimestamp}'
Query Logs (Insights)
aws logs start-query --log-group-name <group> --start-time $(date -d '1 hour ago' +%s) --end-time $(date +%s) --query-string 'fields @timestamp, @message | filter @message like /ERROR|Exception|FATAL/ | sort @timestamp desc | limit 50' --region <region>
aws logs get-query-results --query-id <query-id> --region <region>
aws logs start-query --log-group-name <group> --start-time $(date -d '24 hours ago' +%s) --end-time $(date +%s) --query-string 'fields @timestamp, @message | filter @message like /<request-id>/ | sort @timestamp desc' --region <region>
aws logs start-query --log-group-name <group> --start-time $(date -d '24 hours ago' +%s) --end-time $(date +%s) --query-string 'fields @message | filter @message like /ERROR/ | stats count() by bin(1h)' --region <region>
Tail Logs (Live)
aws logs tail <group> --follow --since 5m --region <region>
aws logs tail <group> --follow --since 10m --filter-pattern "ERROR" --region <region>
Get Specific Log Events
aws logs get-log-events --log-group-name <group> --log-stream-name <stream> --start-time $(date -d '1 hour ago' +%s000) --region <region> --query 'events[*].{Time:timestamp,Msg:message}'
Filter Patterns
aws logs filter-log-events --log-group-name <group> --filter-pattern '{$.statusCode = 500}' --start-time $(date -d '1 hour ago' +%s000) --region <region>
aws logs filter-log-events --log-group-name <group> --filter-pattern '"OutOfMemory"' --start-time $(date -d '6 hours ago' +%s000) --region <region>
AWS CloudTrail
CloudTrail Security Responsibilities
Customers are responsible for enabling AWS CloudTrail, configuring trail settings, and monitoring audit logs. AWS is responsible for the CloudTrail service infrastructure and API event delivery.
Lookup Recent Events
aws cloudtrail lookup-events --start-time $(date -d '1 hour ago' -Iseconds) --region <region> --query 'Events[*].{Time:EventTime,Name:EventName,User:Username,Source:EventSource}'
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=<event> --start-time $(date -d '24 hours ago' -Iseconds) --region <region>
aws cloudtrail lookup-events --lookup-attributes AttributeKey=ResourceName,AttributeValue=<resource-name> --start-time $(date -d '7 days ago' -Iseconds) --region <region>
aws cloudtrail lookup-events --lookup-attributes AttributeKey=Username,AttributeValue=<username> --start-time $(date -d '24 hours ago' -Iseconds) --region <region>
Query CloudTrail via Athena (for historical analysis)
aws athena start-query-execution --query-string "
SELECT eventtime, eventname, useridentity.arn, sourceipaddress, errorcode, errormessage
FROM cloudtrail_logs
WHERE eventname = '<event>'
AND eventtime > '<date>'
ORDER BY eventtime DESC
LIMIT 100
" --query-execution-context Database=<db> --result-configuration OutputLocation=s3://<bucket>/athena-results/ --region <region>
CloudTrail Insights
aws cloudtrail get-insight-selectors --trail-name <trail> --region <region>
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventSource,AttributeValue=<service>.amazonaws.com --start-time $(date -d '7 days ago' -Iseconds) --region <region>
CloudWatch Metrics (Quick Diagnostics)
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --dimensions Name=InstanceId,Value=<id> --start-time $(date -d '1 hour ago' -Iseconds) --end-time $(date -Iseconds) --period 300 --statistics Average --region <region>
aws cloudwatch get-metric-statistics --namespace AWS/RDS --metric-name DatabaseConnections --dimensions Name=DBInstanceIdentifier,Value=<id> --start-time $(date -d '1 hour ago' -Iseconds) --end-time $(date -Iseconds) --period 300 --statistics Maximum --region <region>
aws cloudwatch get-metric-statistics --namespace AWS/Lambda --metric-name Errors --dimensions Name=FunctionName,Value=<func> --start-time $(date -d '1 hour ago' -Iseconds) --end-time $(date -Iseconds) --period 300 --statistics Sum --region <region>
aws cloudwatch get-metric-statistics --namespace AWS/ApplicationELB --metric-name HTTPCode_ELB_5XX_Count --dimensions Name=LoadBalancer,Value=<alb-id> --start-time $(date -d '1 hour ago' -Iseconds) --end-time $(date -Iseconds) --period 300 --statistics Sum --region <region>
CloudWatch Alarms Check
aws cloudwatch describe-alarms --state-value ALARM --region <region> --query 'MetricAlarms[*].{Name:AlarmName,Metric:MetricName,State:StateValue,Reason:StateReason}'
aws cloudwatch describe-alarms --alarm-names <alarm-name> --region <region>
aws cloudwatch describe-alarm-history --alarm-name <alarm-name> --history-item-type StateUpdate --region <region>
Diagnostic Pattern
When investigating an issue:
- What happened: CloudTrail — who/what triggered the action
- What it said: CloudWatch Logs — error messages, stack traces
- What it looked like: CloudWatch Metrics — CPU, memory, connections, errors
- What's alerting: CloudWatch Alarms — any alarms in ALARM state
- Correlate: match timestamps across all sources
Data Access Logging
Customers are responsible for enabling access logging for Amazon S3 buckets, configuring database audit logging, encrypting Amazon CloudWatch Logs with AWS KMS, and managing log retention policies. AWS is responsible for the underlying logging service infrastructure and log delivery mechanisms.
Enable comprehensive access logging for data operations:
- S3: Enable S3 server access logging or CloudTrail data events for buckets containing sensitive data
- RDS: Enable database audit logging (e.g.,
pgaudit for PostgreSQL, audit plugin for MySQL)
- EBS: CloudTrail logs EBS snapshot and volume operations by default
- CloudWatch Logs: Use AWS Key Management Service (AWS KMS) encryption for log groups containing sensitive data:
aws logs associate-kms-key --log-group-name <group> --kms-key-id <key-arn>