Detection Day 1
SCS-C03 · Domain 1 · Detection (16%) · Day 1 of 4

Monitoring and alerting foundations

Domain 3, Infrastructure Security, finished with Day 5. Now Domain 1, Detection, begins. Today: how to decide what to monitor, health checks with Route 53, ELB and Synthetics, turning CloudTrail logs into metrics with metric filters, smarter alarms with composite alarms and anomaly detection, EventBridge rules and SNS for findings, and bringing events from many accounts into one place.

Skill 1.1.1 monitoring requirementsSkill 1.1.2 health checksSkill 1.1.3 aggregate eventsSkill 1.1.4 metrics, alerts, dashboards~90 min read + 30 min lab
01

Analyzing workloads for monitoring requirements

Domain 1, Detection, is about seeing trouble early. Skill 1.1.1 asks you to look at a workload and decide what to monitor. The exam rarely asks “which service exists?”. It asks “which signal answers this requirement with the least effort?”. So start from the requirement, not from the tool.

Every requirement maps to one of five kinds of signal: metrics (numbers over time), logs (records of what happened), events (something just changed), health checks (is it reachable and working?) and findings (a security service thinks something is wrong). Today covers the first four and how to alert on them. Findings get a full day tomorrow.

Concept profile

Requirement-driven monitoring

often confused with Collecting every log and metric
?What is it?

A way of planning detection: list the assets, threats, compliance rules and response times for a workload, then pick the smallest set of signals, alarms and notifications that covers them.

⚙How does it work?
  • List assets and data sensitivity: public website, API with personal data, admin consoles, keys.
  • List threats: root use, stolen credentials, unauthorized API calls, outages, DDoS, data leaks.
  • Add compliance needs: CIS AWS Foundations controls expect specific metric filters and alarms.
  • Decide who must know and how fast: an email, an on-call page, or an automatic fix.
  • Choose the signal: metric → alarm; log → metric filter → alarm; event → EventBridge rule; reachability → health check or canary.
{ }Structure
Ask first (skill 1.1.1)1. What must we protect? 2. What could go wrong? 3. What does compliance require?4. Who must know, and how fast? 5. Should a person or automation respond?MetricsCloudWatchCPU, 5xx, latencycustom metricsnumbers over timeLogsCloudTrailVPC Flow Logsapp and OS logsmetric filtersEventsEventBridgeAPI callsstate changesfindingsHealthRoute 53 checksELB target checksSyntheticscanariesFindingsGuardDutySecurity HubMacie, Inspector(Day 2)Then choose for each signal: static threshold or anomaly band, who is told, and what runs automatically.
Requirements first, then the five kinds of signal.
⇄Requirement-driven monitoring vs Collecting every log and metric
Requirement-drivenCollect everything
Starting pointThreats, assets, complianceEvery service’s logs
AlertsFew, meaningful, ownedMany, noisy, ignored
CostControlledHigh ingestion and storage
GapsVisible and decidedHidden in the noise
Exam hint“most operationally efficient”Rarely the best answer
!Common mistakes the exam tests
  • Choosing a log source when the requirement is near real time: an EventBridge rule reacts in seconds; a daily Athena query does not.
  • Monitoring only CPU and memory: a security workload also needs API activity (CloudTrail) and network signals.
  • Alerting with no owner: every alarm needs an SNS target or an automated action.
  • Forgetting that many AWS metrics exist for free, but OS-level memory and disk need the CloudWatch agent.
  • Building custom scripts when a managed feature exists (health checks, canaries, anomaly detection).
✓Benefits and use cases
  • Write a monitoring plan before go-live.
  • Prove compliance with CIS alarm requirements.
  • Cut alert fatigue so real attacks are noticed.
Think of it like · a shop’s security plan

A shop owner doesn’t put cameras everywhere. They decide what matters first.

AWS conceptFamiliar thing
Assets≈The till, the safe, the expensive shelf
Metrics≈The visitor counter at the door
Logs≈The CCTV recording you can rewind
Events≈The door sensor that beeps the moment it opens
Health checks≈Calling the shop every morning to check someone answers
SNS notification≈The text message to the owner’s phone
Real AWS example · find the metrics a service already publishes

Before building anything, check which metrics exist for free. Here: target 5xx errors on an ALB.

$ aws cloudwatch list-metrics --namespace AWS/ApplicationELB \
    --metric-name HTTPCode_Target_5XX_Count
{ "Metrics": [ {
    "Namespace": "AWS/ApplicationELB",
    "MetricName": "HTTPCode_Target_5XX_Count",
    "Dimensions": [
      { "Name": "LoadBalancer", "Value": "app/shop-alb/50dc6c495c0c9188" } ] } ] }

Memory and disk use inside an EC2 instance are not in this list by default: install the CloudWatch agent for those.

Exam-style scenario

A company runs an API that stores customer data. The security team must be told within minutes whenever the root user signs in or calls any API, and the solution must meet the CIS AWS Foundations Benchmark. What should the team build?

  1. A. A daily Athena query over CloudTrail logs in S3.
  2. B. A CloudTrail trail that sends to CloudWatch Logs, a metric filter with the CIS root-usage pattern, an alarm with threshold 1, and an SNS topic.
  3. C. A CloudWatch dashboard that the team checks each morning.
  4. D. An ELB health check on the API.
Show the worked answer

Answer: B

This is exactly the CIS pattern that Security Hub CSPM control CloudWatch.1 checks, and it alerts within minutes.

Why not the others

  • A: Daily is not “within minutes”.
  • C: Dashboards don’t notify anyone.
  • D: Health checks test reachability, not who is calling APIs.
How the exam tests this
  • “Least effort to see an existing AWS metric”→ Use the built-in CloudWatch metric.
  • “Memory or disk use on EC2”→ CloudWatch agent.
  • “Alert on a pattern in logs”→ Metric filter → alarm.
  • “React within seconds to a change”→ EventBridge rule.
  • “Prove CIS alerting”→ Exact CIS metric filter patterns + alarms + SNS.
Must remember
  • Start from threats and requirements, not tools.
  • Five signals: metrics, logs, events, health, findings.
  • Every alarm needs an owner (SNS or automation).
  • Memory/disk on EC2 → CloudWatch agent.
  • “Near real time” rules out daily queries.
02

Health checks and synthetic monitoring

Skill 1.1.2 gives one example by name: resource health checks. AWS has three kinds, and the exam tests which one fits. Route 53 health checks test endpoints from outside and can drive DNS failover. ELB health checks decide which targets get traffic. CloudWatch Synthetics canaries run a script that behaves like a real user.

Concept profile

Route 53 health check

often confused with ELB health check
?What is it?

A check run by Route 53 health checkers in many locations around the world. It can test an endpoint, combine other health checks, or follow a CloudWatch alarm’s data. Its status can drive DNS failover and its own CloudWatch metric and alarm.

⚙How does it work?
  • Endpoint check: HTTP, HTTPS or TCP to an IP or domain name, every 10 or 30 seconds. HTTP(S) needs a 2xx or 3xx status; optional string matching in the first 5,120 bytes of the body.
  • The endpoint is healthy if more than 18% of health checkers report it healthy.
  • Calculated check: healthy when enough of its child checks are healthy (up to 255 children).
  • CloudWatch alarm check: follows the alarm’s data stream. This is how you check resources that health checkers on the internet can’t reach, such as private instances.
  • HTTPS checks don’t validate the TLS certificate, so an expired certificate doesn’t fail them.
{ }Structure
Route 53 health checkCheckers around the worldHTTP, HTTPS or TCPEvery 10 or 30 secondsHealthy if more than 18%of checkers say healthyCalculated: up to 255 childrenAlarm type for private targetsELB health checkLoad balancer checks targetsDefault every 30 s, 5 s timeout2 failures: out of service5 passes: back in serviceSuccess code 200 by defaultAll unhealthy: fails openAuto Scaling can replaceSynthetics canaryScript that acts like a userRuns as a Lambda functionNode.js, Python or JavaPlaywright, Puppeteer,Selenium (browser canaries)As often as once a minuteScreenshots and logs in S3“Fail over DNS to another Region” → Route 53 · “Stop sending traffic to a bad instance” → ELB“Is the login page working for real users, even at night?” → Synthetics canary
Three kinds of health check, three different questions.
⇄Route 53 health check vs ELB health check
Route 53 health checkELB health check
Who checksGlobal health checkers on the internetThe load balancer, inside the VPC
ChecksPublic endpoints, other checks, alarmsEach registered target
Result used forDNS failover, alarms, notificationsRouting traffic only to healthy targets
Private targetsOnly via a CloudWatch alarm checkYes
Exam hint“fail over to another Region”“stop sending traffic to a failed instance”
!Common mistakes the exam tests
  • Pointing an endpoint check at a private IP: health checkers on the internet can’t reach it. Use a CloudWatch alarm health check.
  • Using a CloudWatch alarm from another account in a Route 53 health check: not supported.
  • Expecting an HTTPS health check to catch an expired certificate: it doesn’t validate certificates. Use a canary or ACM expiry events.
  • Thinking an ALB stops all traffic when every target fails: it fails open and sends traffic to all targets.
  • Leaving an Auto Scaling group on EC2 status checks only: turn on ELB health checks so it replaces instances the load balancer marks unhealthy.
✓Benefits and use cases
  • Active-passive failover between Regions with Route 53.
  • Alerting when a public site stops answering.
  • Removing failed instances from service automatically.

ELB health checks and CloudWatch Synthetics

An ALB target group checks each target with HTTP or HTTPS. By default it checks every 30 seconds with a 5-second timeout, takes a target out after 2 failures, puts it back after 5 successes, and expects status 200. A CloudWatch Synthetics canary is a script (Node.js, Python or Java) that runs as a Lambda function on a schedule, as often as once per minute. Browser canaries use Playwright, Puppeteer or Selenium to click through pages, take screenshots and check content, so they also catch defacement or injected scripts. Canaries publish metrics such as SuccessPercent in the CloudWatchSynthetics namespace, and they can run inside a VPC to test internal endpoints.

Think of it like · checking on a restaurant

Three ways to know if a restaurant is working.

AWS conceptFamiliar thing
Route 53 endpoint check≈Friends in many cities phone the restaurant; if most can’t get through, it’s closed
18% rule≈It counts as open if more than a small share of friends get an answer
Calculated check≈The chain is “open” if at least 3 of its 5 branches are open
ELB health check≈The head waiter checks each cook; a sick cook gets no new orders
Synthetics canary≈A mystery shopper who orders a meal every minute and reports the experience
Fail open≈If every cook looks sick, the waiter still sends orders to all of them
Real AWS example · Route 53 HTTPS health check with string matching

Check /health every 10 seconds from outside and look for the word OK.

$ aws route53 create-health-check --caller-reference shop-2026-10-10 \
  --health-check-config '{
    "Type": "HTTPS_STR_MATCH",
    "FullyQualifiedDomainName": "shop.example.com",
    "ResourcePath": "/health",
    "SearchString": "OK",
    "RequestInterval": 10,
    "FailureThreshold": 3 }'
{ "HealthCheck": { "Id": "abcd1234-...", "HealthCheckConfig": { ... } } }

Route 53 publishes a HealthCheckStatus metric in AWS/Route53 (us-east-1). Put an alarm on it to get notified.

Exam-style scenario

A company’s web app runs on EC2 instances in private subnets behind an internal ALB. Users reach it through a VPN. The company wants Route 53 DNS failover to a standby Region when the primary app is unhealthy. What should it configure?

  1. A. A Route 53 HTTP endpoint health check on the private IP of the ALB.
  2. B. A CloudWatch alarm on the ALB HealthyHostCount metric, and a Route 53 health check that monitors that alarm.
  3. C. An ELB health check only.
  4. D. A Synthetics canary in another account with a Route 53 health check on its cross-account alarm.
Show the worked answer

Answer: B

Route 53 health checkers can’t reach private endpoints; a CloudWatch alarm health check follows the alarm’s data instead.

Why not the others

  • A: Health checkers are on the internet and can’t reach private IPs.
  • C: ELB checks don’t drive DNS failover.
  • D: Alarms in another account aren’t supported for Route 53 health checks.
How the exam tests this
  • “DNS failover between Regions”→ Route 53 health check + failover records.
  • “Health of a private resource for failover”→ CloudWatch alarm health check.
  • “Healthy only if 2 of 3 web tiers are up”→ Calculated health check.
  • “Test the checkout flow every minute”→ Synthetics canary.
  • “Replace instances that fail the load balancer’s check”→ ASG with ELB health checks.
Must remember
  • Route 53: 10 or 30 s; healthy if > 18% agree.
  • Calculated: up to 255 children.
  • Private target → alarm-based health check.
  • ALB defaults: 30 s, 5 s, 2 out, 5 back, 200; fails open.
  • Canary: Lambda script, down to 1 minute.
03

CloudWatch metrics and metric filters on CloudTrail

Many security signals start as log lines, not numbers. A metric filter turns matching log events into a CloudWatch metric, so you can put an alarm on it. The classic exam case: send CloudTrail to CloudWatch Logs and alert on root user activity, unauthorized API calls and console sign-in without MFA.

Concept profile

CloudWatch Logs metric filter

often confused with Subscription filter / Logs Insights
?What is it?

A pattern on a log group. Each time a new log event matches, CloudWatch Logs publishes a value (usually 1) to a custom metric that alarms and dashboards can use.

⚙How does it work?
  • The CloudTrail trail must deliver to a CloudWatch Logs log group (with an IAM role for CloudTrail). A trail that writes only to S3 can’t feed a metric filter.
  • The filter pattern matches JSON fields, for example $.errorCode or $.userIdentity.type.
  • Set metric value 1 and default value 0, then alarm on Sum ≥ 1.
  • Metric filters work only on log groups in the Standard log class.
  • They are not retroactive: only events after the filter is created are counted.
{ }Structure
CloudTrailtrail sendsto CW LogsLog groupStandardlog classMetric filterpattern matchvalue 1MetricLogMetrics/RootUsageAlarmSum ≥ 1in 5 minSNS topicemail, chat,on-call toolCIS filter pattern for root user activity (Security Hub CSPM control CloudWatch.1){$.userIdentity.type="Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType !="AwsServiceEvent"}Metric filters count only events that arrive after you create them. They are not retroactive.Set default value 0 so the metric has data in every period (not allowed if the metric has dimensions).
From an API call to a phone notification.
⇄Metric filter vs Subscription filter / Logs Insights
Metric filterSubscription filter / Logs Insights
OutputA number (metric)Stream of log events / query results
Typical next stepAlarm → SNSLambda, Firehose, OpenSearch / a person reading
TimingContinuousContinuous / on demand
Past dataNo, new events onlyInsights can query history
Exam hint“alarm when X appears in logs”“stream logs to another system” / “investigate”
!Common mistakes the exam tests
  • Creating the filter and expecting it to count last week’s root logins: it starts from now.
  • Changing the CIS pattern: Security Hub CSPM fails controls CloudWatch.1 to CloudWatch.3 unless the exact CIS patterns are used.
  • Trail is single-Region or writes only to S3: use a multi-Region trail that sends to CloudWatch Logs.
  • In member accounts of an organization trail, these controls can show NO_DATA: check them in the delegated administrator account.
  • Adding dimensions and also a default value: you can’t set a default value when the metric has dimensions.
✓Benefits and use cases
  • CIS alarms: root use, unauthorized calls, no-MFA sign-in, IAM policy changes, security group changes.
  • Counting application errors from logs.
  • Turning any log text into an alarm.

Metrics basics the exam expects

A metric belongs to a namespace (for example AWS/EC2), has a name and up to several dimensions, and is read with a statistic (Sum, Average, Maximum, percentiles) over a period. AWS services publish many metrics for free; your own app or a metric filter publishes custom metrics (one example is LogMetrics, the namespace the CIS remediation steps use). The two other CIS patterns to recognise are {($.errorCode="*UnauthorizedOperation") || ($.errorCode="AccessDenied*")} for unauthorized API calls, and a ConsoleLogin pattern with $.additionalEventData.MFAUsed != "Yes" for sign-in without MFA.

Think of it like · a school attendance book

Turning written records into numbers someone watches.

AWS conceptFamiliar thing
CloudTrail log≈The diary where every visit to the office is written
Metric filter≈A teacher who puts a tally mark each time “headteacher’s key used” appears
Default value 0≈Writing “0” on days with no visits, so the page is never blank
Not retroactive≈The teacher only counts from the day they started, not old pages
Alarm Sum ≥ 1≈One tally mark is enough to call the parents
SNS≈The phone call to the parents
Real AWS example · CIS unauthorized API calls filter and alarm

Create the metric filter on the CloudTrail log group, then an alarm that notifies the security topic.

$ aws logs put-metric-filter --log-group-name aws-cloudtrail-logs \
  --filter-name UnauthorizedAPICalls \
  --filter-pattern '{($.errorCode="*UnauthorizedOperation") || ($.errorCode="AccessDenied*")}' \
  --metric-transformations metricName=UnauthorizedAPICalls,metricNamespace=LogMetrics,metricValue=1,defaultValue=0

$ aws cloudwatch put-metric-alarm --alarm-name cis-unauthorized-api \
  --namespace LogMetrics --metric-name UnauthorizedAPICalls \
  --statistic Sum --period 300 --evaluation-periods 1 \
  --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:security-alerts

Real accounts produce some AccessDenied noise. CIS still expects this alarm; teams often route it to a low-priority channel.

Exam-style scenario

A security engineer created a metric filter for root user activity on the CloudTrail log group yesterday. The auditor asks for the number of root logins in the past 30 days. The metric shows only data from yesterday onward. What should the engineer do to answer the auditor?

  1. A. Delete and recreate the metric filter so it reprocesses old logs.
  2. B. Run a CloudWatch Logs Insights query (or CloudTrail event history / Athena) over the past 30 days; the metric filter only counts new events.
  3. C. Change the default value to 1.
  4. D. Add a dimension to the metric.
Show the worked answer

Answer: B

Metric filters are not retroactive; querying the stored logs answers history questions.

Why not the others

  • A: Recreating doesn’t reprocess old events.
  • C: The default value only fills periods with no matches.
  • D: Dimensions don’t add history.
How the exam tests this
  • “Alarm on root user activity”→ CloudTrail → CW Logs → metric filter → alarm → SNS.
  • “Metric filter shows no old data”→ Not retroactive; query the logs.
  • “CIS control fails though alarm exists”→ Use the exact CIS pattern.
  • “Stream matching logs to Lambda”→ Subscription filter, not metric filter.
  • “Gaps in the metric”→ Set default value 0.
Must remember
  • Trail must send to CloudWatch Logs.
  • Metric filters: new events only, Standard log class.
  • Value 1, default 0, alarm Sum ≥ 1.
  • CIS: exact patterns or the control fails.
  • Root, AccessDenied*, ConsoleLogin without MFA.
04

Alarms, composite alarms and anomaly detection

An alarm watches one metric (or a metric math expression) and changes state. For skill 1.1.4 you need to tune alarms so they catch real problems and stay quiet otherwise. The tools are M out of N evaluation, missing data handling, composite alarms that combine several alarms, and anomaly detection bands that learn what normal looks like.

Concept profile

Composite alarm

often confused with Metric alarm
?What is it?

An alarm whose state comes from a rule over other alarms’ states, using ALARM(), OK(), INSUFFICIENT_DATA(), TRUE, FALSE and the operators AND, OR and NOT.

⚙How does it work?
  • Create the child metric alarms first, often without actions, so they don’t page anyone on their own.
  • The composite alarm rule can reference up to 100 child alarms.
  • Actions: SNS, Lambda, Systems Manager OpsItems or Incident Manager incidents, and CloudWatch investigations. OK and INSUFFICIENT_DATA actions: SNS and Lambda.
  • ActionsSuppressor: name an alarm (for example “deployment running”). While it is in ALARM, the composite alarm’s actions are muted, with a wait period and an extension period around it.
{ }Structure
cpu-highmetric alarmapi-5xx-highmetric alarmdeploy-runningsuppressor alarmComposite alarm rule(ALARM("cpu-high") OR ALARM("api-5xx-high"))AND NOT ALARM("deploy-running")Functions: ALARM, OK, INSUFFICIENT_DATAActionsSNS topicLambda functionSSM OpsItem /Incident ManagerInvestigationUp to 100 child alarms. No EC2 or Auto Scaling actions on a composite alarm.ActionsSuppressor: while the suppressor alarm is in ALARM, actions are muted,with a wait period and an extension period around it.
Several weak signals combined into one strong alert.
⇄Composite alarm vs Metric alarm
Composite alarmMetric alarm
WatchesOther alarms’ statesOne metric or math expression
LogicAND / OR / NOTThreshold or anomaly band
EC2 / Auto Scaling actionsNoYes
Best forReducing alert noiseA single measurable condition
Exam hint“only when both…”, “reduce alarm fatigue”“when CPU exceeds 80%”
!Common mistakes the exam tests
  • Choosing a composite alarm to stop an EC2 instance: composite alarms can’t do EC2 or Auto Scaling actions.
  • Leaving actions on every child alarm: the team still gets every page. Put actions on the composite.
  • Creating composite alarms that reference each other in a cycle: evaluation stops; set one rule to FALSE to break it.
  • Using a static threshold on a metric with strong daily and weekly patterns: use anomaly detection.
  • Ignoring missing data: an error metric that only reports when errors happen should treat missing data as notBreaching.
✓Benefits and use cases
  • Page only when errors AND latency are high.
  • Mute alerts during planned deployments.
  • One “service health” alarm built from many signals.

Anomaly detection and missing data

Anomaly detection trains on up to two weeks of a metric’s history and learns hourly, daily and weekly patterns and trends. It draws a band of expected values; a higher threshold value makes the band wider. An anomaly detection alarm has no static threshold: it fires when the metric goes above the band, below it, or either. You can exclude time periods such as deployments from training, and use it on metric math expressions. Every alarm has three states: OK, ALARM, INSUFFICIENT_DATA. Datapoints to alarm gives “M out of N” (for example 3 out of 5 periods). TreatMissingData can be missing (the default), notBreaching, breaching or ignore.

Think of it like · a home alarm system

How a smart home decides when to wake you.

AWS conceptFamiliar thing
Metric alarm≈One sensor: the kitchen smoke detector
Composite alarm≈Wake me only if smoke AND heat sensors both trigger
Actions suppressor≈Silence alarms while I’m cooking dinner
Anomaly detection≈The system learned the door opens at 8 am daily; it alerts at 3 am
M out of N≈Only ring if the sensor trips 3 times in 5 minutes, not once
Treat missing as breaching≈If a sensor goes silent, assume the worst
Real AWS example · composite alarm muted during deployments

Page the on-call team only if CPU or errors are high, and not while a deployment runs.

$ aws cloudwatch put-composite-alarm --alarm-name shop-health \
  --alarm-rule '(ALARM("cpu-high") OR ALARM("api-5xx-high")) AND NOT ALARM("deploy-running")' \
  --actions-suppressor deploy-running \
  --actions-suppressor-wait-period 120 \
  --actions-suppressor-extension-period 300 \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:oncall

The child alarms cpu-high and api-5xx-high have no actions of their own.

Exam-style scenario

An e-commerce site’s login traffic is high every weekday morning and low at night. A static alarm on failed logins either pages every morning or misses a credential-stuffing attack at 2 am. What is the most operationally efficient fix?

  1. A. Create a separate static alarm for each hour of the day.
  2. B. Use a CloudWatch anomaly detection alarm on the failed-login metric that fires when the value is above the band.
  3. C. Lower the static threshold.
  4. D. Use a composite alarm with one child alarm.
Show the worked answer

Answer: B

Anomaly detection learns daily and weekly patterns and alerts on unusual values at any hour.

Why not the others

  • A: Works, but heavy to maintain; not efficient.
  • C: More false alarms every morning.
  • D: A composite alarm with one child adds nothing.
How the exam tests this
  • “Alert only if two conditions are both true”→ Composite alarm with AND.
  • “Silence alerts during maintenance”→ ActionsSuppressor.
  • “Normal changes by hour and weekday”→ Anomaly detection alarm.
  • “Avoid alerts on one short spike”→ M out of N datapoints.
  • “Metric only reports on errors”→ TreatMissingData notBreaching.
Must remember
  • Composite: AND/OR/NOT, up to 100 children.
  • Composite actions: SNS, Lambda, SSM; no EC2/ASG.
  • Anomaly band: two weeks of training; above/below/both.
  • States: OK, ALARM, INSUFFICIENT_DATA.
  • Missing data default: missing.
05

EventBridge rules, SNS notifications and dashboards

Alarms watch numbers over time. Many security signals are single events: a GuardDuty finding, a Security Hub finding, a security group change, a Config rule turning NON_COMPLIANT. An EventBridge rule matches these events by pattern the moment they arrive and sends them to a target, often an SNS topic for people or a Lambda function for automatic response.

Concept profile

EventBridge rule

often confused with CloudWatch alarm
?What is it?

A rule on an event bus with an event pattern (source, detail-type and detail fields) and up to five targets. AWS services send events to the default event bus in the same account and Region.

⚙How does it work?
  • GuardDuty: source aws.guardduty, detail-type GuardDuty Finding. New findings arrive in near real time; repeat occurrences are grouped, every 6 hours by default (the administrator can set 15 minutes or 1 hour). Suppressed findings are not sent.
  • Security Hub CSPM: detail-type Security Hub Findings - Imported for every new finding and every update.
  • In a multi-account setup, the administrator account receives events for member findings too.
  • CloudTrail API calls appear as AWS API Call via CloudTrail events (a trail is needed for most of them).
  • Targets: SNS, Lambda, Step Functions, SSM Automation, SQS, an event bus in another account, and more.
{ }Structure
GuardDuty findingSecurity Hub findingCloudTrail API callConfig rule changeAWS Health eventEventBridge ruleon the default event bus{ "source": ["aws.guardduty"], "detail-type": ["GuardDuty Finding"], "detail": { "severity": [{"numeric": [">=", 7]}] } }match, then send to up to 5 targetsSNS topicLambda functionStep FunctionsSSM AutomationBus in other accountAlarms watch numbers over time. Rules react to one event at a time, the moment it happens.
One rule, many sources, many targets.
⇄EventBridge rule vs CloudWatch alarm
EventBridge ruleCloudWatch alarm
InputSingle eventsMetric data over periods
DecisionPattern matchThreshold or anomaly band
SpeedSeconds after the eventAfter the evaluation periods
Typical sourceFindings, API calls, state changesMetrics, metric filters
Exam hint“when a finding is created”“when the count exceeds”
!Common mistakes the exam tests
  • Building a Lambda that polls GuardDuty every minute: use an EventBridge rule.
  • Creating the rule in a member account to catch all accounts: put it in the administrator account (or forward events).
  • Encrypting the SNS topic with the AWS managed key aws/sns: CloudWatch and EventBridge can’t publish. Use a customer managed key whose policy allows cloudwatch.amazonaws.com / events.amazonaws.com.
  • Forgetting the SNS topic policy must allow the publishing service.
  • Expecting rules in one Region to see findings from other Regions without aggregation.
✓Benefits and use cases
  • Email the team for high-severity findings.
  • Auto-remediate a public S3 bucket with Lambda.
  • Open a ticket in a third-party tool.

SNS notifications and dashboards

Amazon SNS fans one message out to email, SMS, HTTPS endpoints, Lambda, SQS and chat tools. For an encrypted topic, the KMS key must be customer managed and its key policy must give the publishing service kms:GenerateDataKey* and kms:Decrypt. CloudWatch dashboards show metrics, alarms and log query results on one screen; one dashboard can include metrics from several Regions, and with cross-account sharing, from several accounts. A dashboard is for people looking; it never notifies anyone by itself.

Think of it like · an airport control room

Different tools for different kinds of news.

AWS conceptFamiliar thing
Event bus≈The radio channel every department speaks on
Rule pattern≈A controller listening only for “emergency” calls from runway 2
Target≈The person or team the call is forwarded to
SNS topic≈The public address system: one message, many speakers
Dashboard≈The big wall of screens; useful only if someone looks
Customer managed KMS key≈A key to the PA room that you can lend to the radio team
Real AWS example · email high-severity GuardDuty findings

Rule on the default bus with numeric matching; target is an SNS topic.

$ aws events put-rule --name gd-high \
  --event-pattern '{"source":["aws.guardduty"],
    "detail-type":["GuardDuty Finding"],
    "detail":{"severity":[{"numeric":[">=",7]}]}}'

$ aws events put-targets --rule gd-high \
  --targets Id=sns1,Arn=arn:aws:sns:eu-west-1:111122223333:security-alerts

The topic policy must allow events.amazonaws.com to sns:Publish. The console adds this for you; the CLI does not.

Exam-style scenario

A company encrypts its security-alerts SNS topic with the AWS managed key aws/sns. A new EventBridge rule for Security Hub CSPM findings targets the topic, but no emails arrive. The rule shows matched events and failed invocations. What should the engineer do?

  1. A. Turn off the rule and use a dashboard.
  2. B. Re-encrypt the topic with a customer managed KMS key whose key policy allows events.amazonaws.com kms:GenerateDataKey* and kms:Decrypt.
  3. C. Add the GuardDuty service principal to the topic policy.
  4. D. Change the detail-type to Security Hub Insight Results.
Show the worked answer

Answer: B

EventBridge can’t use the aws/sns key because its policy can’t be edited; a customer managed key with the right key policy fixes delivery.

Why not the others

  • A: Dashboards don’t notify.
  • C: The publisher is EventBridge, not GuardDuty.
  • D: Insight Results is for custom actions; the pattern already matches.
How the exam tests this
  • “Notify on new GuardDuty findings”→ EventBridge rule → SNS.
  • “Faster updates for repeat findings”→ Admin sets frequency to 15 minutes.
  • “All Security Hub findings and updates”→ Security Hub Findings - Imported.
  • “Encrypted topic gets nothing”→ Customer managed key + key policy.
  • “One screen for many Regions”→ CloudWatch dashboard.
Must remember
  • Events → rules; numbers → alarms.
  • GuardDuty updates: 6 h default; 15 min / 1 h possible.
  • Admin account gets member findings events.
  • Encrypted SNS: customer managed key, not aws/sns.
  • Dashboards don’t notify.
06

Aggregating events across accounts and Regions

Real companies have dozens or hundreds of accounts in many Regions. Skill 1.1.3 asks you to aggregate security and monitoring events so one team can see and alert on everything from one place. Three features do most of the work: CloudWatch cross-account observability, cross-account EventBridge event buses and the Security Hub home Region.

Concept profile

CloudWatch cross-account observability

often confused with Cross-account cross-Region console
?What is it?

A feature that links source accounts to a monitoring account in a Region, so the monitoring account can search, graph and alarm on their metrics, logs and traces as if they were its own.

⚙How does it work?
  • The monitoring account creates a sink (one per Region). Each source account creates a link to it. This is the Observability Access Manager (OAM).
  • Shared types: CloudWatch metrics, log groups, X-Ray traces, Application Signals, Application Insights and Internet Monitor monitors.
  • One monitoring account can have up to 100,000 source accounts; one source account can share with up to five monitoring accounts.
  • Use AWS Organizations so new accounts are onboarded automatically.
  • You can create alarms and anomaly detectors in the monitoring account on source account metrics.
{ }Structure
Account A (prod)eu-west-1, us-east-1OAM link · forward rule · memberAccount B (dev)eu-west-1OAM link · forward rule · memberAccount C (data)eu-west-1, ap-south-1OAM link · forward rule · memberCentral monitoring / security accountCloudWatch cross-account observabilitySink in each Region; sources create linksMetrics, logs, traces; alarms on source metricsCentral EventBridge busBus policy allows the organizationSender rule targets bus ARN with an IAM roleSecurity Hub CSPM home RegionLinked Regions replicate findings,insights, control status and scoresOne place to look, one place to alert. Use AWS Organizations so new accounts join automatically.
Three ways to bring many accounts into one view.
⇄Cross-account observability vs Cross-account cross-Region console
Cross-account observabilityCross-account cross-Region console
SetupOAM sink + linksCloudWatch-CrossAccountSharingRole in each account
LogsYesNo
Alarms on other accounts’ metricsYesNo
RegionsPer Region (sink in each)Across Regions
Exam hint“central account, metrics, logs and traces”“cross-Region dashboard”
!Common mistakes the exam tests
  • Expecting one sink to cover all Regions: a sink is per Region.
  • Choosing the older cross-account console when the question needs logs or alarms on source metrics.
  • Thinking a monitoring account re-shares its sources’ data onward: an account shares only its own data.
  • Selecting more data types in the source link than the sink allows: link creation fails.
  • Linking accounts one by one when the company uses Organizations: link the organization or OU.
✓Benefits and use cases
  • A central operations or security account for all workloads.
  • Alarms in one place for metrics from many accounts.
  • Searching logs across accounts during an incident.

Cross-account EventBridge buses and the Security Hub home Region

To send events to another account, the receiving account adds a resource-based policy to its event bus that allows specific accounts or the whole organization (for example with aws:PrincipalOrgID). The sending account creates a rule whose target is that bus ARN; new cross-account bus targets need an IAM role in the sender. The sender pays for the events. Events that arrive from another account are not forwarded again to a third account. For findings, Security Hub CSPM cross-Region aggregation (the aggregation Region is now called the home Region) replicates findings, insights, control statuses and security scores from linked Regions to one home Region, both ways, at no extra cost. It only collects from Regions where Security Hub CSPM is already enabled. Combined with a delegated administrator, one account and one Region see the whole organization. Day 2 goes deeper into Security Hub.

Think of it like · a school district office

Many schools, one office that sees everything.

AWS conceptFamiliar thing
Monitoring account≈The district office
Source account link≈Each school agrees to send its attendance sheets to the office
Sink per Region≈Each city has its own district office
Event bus policy≈The office’s mailbox only accepts letters from district schools
Security Hub home Region≈The head office that gets copies of every city’s incident reports
No re-forwarding≈The office doesn’t pass your letters on to another district
Real AWS example · central security event bus for the organization

Resource policy on the receiving bus in the security account, then a forwarding rule in each member account.

# security account (444455556666): bus policy
{ "Version": "2012-10-17", "Statement": [ {
    "Sid": "AllowOrgPutEvents", "Effect": "Allow", "Principal": "*",
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:eu-west-1:444455556666:event-bus/security",
    "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5" } } } ] }

# member account: forward GuardDuty findings
$ aws events put-targets --rule fwd-guardduty --targets \
  Id=central,Arn=arn:aws:events:eu-west-1:444455556666:event-bus/security,\
RoleArn=arn:aws:iam::111122223333:role/EventBridgeForwardRole

On the receiving bus, a rule without an account field matches events from every authorized account.

Exam-style scenario

A company has 80 accounts in AWS Organizations. The operations team wants to search application logs and create CloudWatch alarms on metrics from all accounts in eu-west-1 from one central account. New accounts must be included automatically. What is the most operationally efficient solution?

  1. A. Enable the CloudWatch cross-account cross-Region console with a sharing role in each account.
  2. B. Set up CloudWatch cross-account observability: create a sink in the central account in eu-west-1 and link the organization as source accounts.
  3. C. Export all logs to S3 and query with Athena.
  4. D. Create an EventBridge rule in each account that sends metrics to a central bus.
Show the worked answer

Answer: B

Cross-account observability shares logs and metrics, supports alarms on source metrics, and onboards new organization accounts automatically.

Why not the others

  • A: That console doesn’t support logs or alarms on other accounts’ metrics.
  • C: Works for history, but no alarms and more effort.
  • D: EventBridge carries events, not metric streams for alarms.
How the exam tests this
  • “Central account: metrics, logs, traces”→ Cross-account observability (OAM).
  • “Dashboard across Regions and accounts”→ Cross-account cross-Region console.
  • “Send events from all accounts to one bus”→ Bus resource policy + forwarding rules.
  • “Restrict the bus to our org”→ aws:PrincipalOrgID.
  • “All Regions’ findings in one Region”→ Security Hub CSPM home Region.
Must remember
  • OAM: sink in monitoring account, link in source.
  • Sink is per Region; up to 100,000 sources.
  • Bus policy on receiver; IAM role on sender; sender pays.
  • No forwarding to a third account.
  • Security Hub: aggregation Region is now the home Region.
07

Cheatsheet extras: target permissions, monitoring intervals and alert recipes

Your cheat sheet spends a whole page on troubleshooting alerts that “don’t fire”. The top cause is permissions on the target, especially the difference between a Lambda function’s function policy and its execution role. It also lists a few classic CloudTrail events every security team should alert on, and the EC2 monitoring intervals.

Concept profile

Lambda function policy

often confused with Lambda execution role
?What is it?

A resource-based policy attached to a Lambda function. It lists which AWS services or accounts may call lambda:InvokeFunction on it, for example an EventBridge rule, an S3 bucket or an SNS topic.

⚙How does it work?
  • When you add a trigger in the console, Lambda writes the statement for you. With the CLI, CloudFormation or Terraform you must add it yourself (aws lambda add-permission or an AWS::Lambda::Permission resource).
  • The statement names the service principal (for example events.amazonaws.com) and should limit it with aws:SourceArn (the rule ARN) or aws:SourceAccount.
  • EventBridge uses resource-based policies for Lambda, SNS, SQS and CloudWatch Logs targets. For other targets (Kinesis, Step Functions, SSM Run Command or Automation, ECS tasks) it assumes an IAM role you give it.
  • If delivery fails, EventBridge retries for up to 24 hours (up to 185 attempts) and increases the FailedInvocations metric. Add an SQS dead-letter queue to the target to keep failed events.
  • Older material calls EventBridge “CloudWatch Events”. It is the same service and API; the default event bus is the old CloudWatch Events bus.
{ }Structure
Event sourceEventBridge rule,S3 event notification,SNS topic, API Gateway…needs permission toINVOKE the functionLambda functionFunction policy (resource-based): who may invokeExecution role (IAM):what the code may doWhat the code touchesec2:TerminateInstanceslogs:PutLogEventss3:GetObjectkms:Decryptneeds permission in the ROLERule matched but function never ran → function policy. Function ran but its action failed → execution role.
Two different doors: one lets callers in, the other lets the function act.
⇄Lambda function policy vs Lambda execution role
Lambda function policyLambda execution role
TypeResource-based policy on the functionIAM role the function assumes
Answers“Who may invoke this function?”“What may this function do?”
Typical contentevents.amazonaws.com, s3.amazonaws.com, sns.amazonaws.com, another accountlogs:*Log*, ec2:TerminateInstances, s3:GetObject, kms:Decrypt
Symptom when missingRule matches, but the function is never invoked (FailedInvocations rises)Function runs but gets AccessDenied, or writes no logs
Exam hint“the event never reached the function”“the function could not terminate / read / log”
!Common mistakes the exam tests
  • Fixing the execution role when the rule never invokes the function. Invocation is controlled by the function policy.
  • Adding lambda:InvokeFunction to the execution role: the role is what the function does, not who calls it.
  • Creating the rule with the CLI or IaC and forgetting add-permission; the console did it automatically in the tutorial.
  • Leaving out aws:SourceArn: then any rule in any account using that service principal could try to invoke the function.
  • For a Kinesis or Step Functions target, looking for a resource policy: EventBridge needs an IAM role there.
✓Benefits and use cases
  • Automatic response: EventBridge rule → Lambda that stops, isolates or tags a resource.
  • Cross-account invocation by naming another account in the function policy.
  • Quick troubleshooting: decide in seconds which of the two policies to check.
Think of it like · a contractor with a building pass

A security guard (Lambda) is called by the front desk and then walks around the building.

AWS conceptFamiliar thing
Function policy≈The list at the front desk of who is allowed to phone the guard
Execution role≈The key ring the guard carries once on duty
aws:SourceArn≈Only calls from extension 2104 (this exact rule) are accepted
FailedInvocations≈The receptionist’s note: “I called, nobody was allowed to pick up”
Dead-letter queue≈The tray where messages go when the guard could not be reached
IAM role for Kinesis / Step Functions targets≈A courier badge the front desk itself uses to deliver parcels
Real AWS example · allow one EventBridge rule to invoke a function

The rule was created with the CLI, so the permission must be added by hand.

$ aws lambda add-permission --function-name terminate-unapproved \
    --statement-id allow-eb-rule --action lambda:InvokeFunction \
    --principal events.amazonaws.com \
    --source-arn arn:aws:events:eu-west-1:111122223333:rule/unapproved-ec2

# Resulting statement in the function policy
{ "Effect": "Allow",
  "Principal": { "Service": "events.amazonaws.com" },
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:eu-west-1:111122223333:function:terminate-unapproved",
  "Condition": { "ArnLike": { "AWS:SourceArn":
      "arn:aws:events:eu-west-1:111122223333:rule/unapproved-ec2" } } }

The execution role still needs ec2:TerminateInstances and the logs permissions; this statement only lets the rule call the function.

Exam-style scenario

A security engineer used CloudFormation to create an EventBridge rule that matches RunInstances calls without an approved tag and targets a Lambda function that terminates the instance. CloudWatch shows TriggeredRules and FailedInvocations increasing, but the function has no log streams. What should the engineer fix?

  1. A. Add ec2:TerminateInstances to the function’s execution role.
  2. B. Add a statement to the function’s resource-based policy that allows events.amazonaws.com to invoke it, limited by the rule ARN.
  3. C. Turn on CloudTrail data events for EC2.
  4. D. Give EventBridge an IAM role with lambda:InvokeFunction and attach it to the rule.
Show the worked answer

Answer: B

The rule matches but cannot invoke the function, and the function never ran (no logs). For Lambda targets, EventBridge relies on the function’s resource-based policy.

Why not the others

  • A: Needed later for the action, but the function never started.
  • C: RunInstances is a management event; the rule already matches.
  • D: EventBridge uses roles for targets such as Kinesis or Step Functions, not for Lambda.

Monitoring intervals and what CloudWatch can’t see

EC2 sends metrics to CloudWatch every 5 minutes for free (basic monitoring). Detailed monitoring sends them every 1 minute for an extra charge, and custom high-resolution metrics can go down to 1 second. Faster data means alarms can react sooner. The hypervisor can’t see inside the guest, so memory, disk space and running processes need the CloudWatch agent (the procstat plugin tracks processes). Older material says “CloudWatch can’t record processes”; today the agent can.

Classic alert recipes from the cheat sheet

Watch forCloudTrail event (source · name)Why it matters
KMS key scheduled for deletion or disabledkms.amazonaws.com · ScheduleKeyDeletion, DisableKeyYou have the 7–30 day waiting period to run CancelKeyDeletion before data becomes unreadable
Logging turned offcloudtrail.amazonaws.com · StopLogging, DeleteTrail, UpdateTrailAttackers blind you first
Config recording stoppedconfig.amazonaws.com · StopConfigurationRecorder, DeleteDeliveryChannelNo more configuration history or rule results
Bucket policy changeds3.amazonaws.com · PutBucketPolicy, DeleteBucketPolicyPossible data exposure
Root user activityuserIdentity.type = Root (pattern in section 03)Root should almost never be used

Each one works as an EventBridge rule on “AWS API Call via CloudTrail” (fast, per event, needs a trail) or as a metric filter plus alarm on the CloudTrail log group (counts and thresholds). People who only need to look at dashboards and alarms get CloudWatchReadOnlyAccess, not admin rights.

“The EventBridge rule fires but nothing happens” is a permissions question about the target. Lambda, SNS and SQS targets need a resource-based policy (function policy, topic policy, queue policy); an encrypted SNS topic or SQS queue also needs a customer managed KMS key that lets events.amazonaws.com use it.

How the exam tests this
  • “Rule matched, function never invoked”→ Add lambda:InvokeFunction for events.amazonaws.com to the function policy.
  • “Function ran, could not terminate the instance”→ Fix the execution role.
  • “Lambda produces no logs”→ Execution role lacks CreateLogGroup / CreateLogStream / PutLogEvents.
  • “Alarm must react within 1–2 minutes on EC2 metrics”→ Turn on detailed monitoring (1-minute).
  • “Alert before an accidental KMS key deletion destroys data”→ EventBridge rule on ScheduleKeyDeletion, then CancelKeyDeletion.
Must remember
  • Function policy = who may invoke; execution role = what it may do.
  • EventBridge → Lambda/SNS/SQS uses resource-based policies; → Kinesis/Step Functions uses an IAM role.
  • Failed delivery: retries up to 24 h; add an SQS DLQ.
  • EC2 basic monitoring 5 min, detailed 1 min.
  • CloudWatch Events = EventBridge (same API).
08

Lecture summary map

Day 1 of Detection on one screen.

1. Mind map

① RequirementsThreats first5 kinds of signalEvery alarm has owner② Health checksR53: 10/30 s, > 18%ELB: fails openCanary: user script③ Metric filtersTrail → CW LogsNot retroactiveExact CIS patterns④ AlarmsComposite AND/OR/NOTAnomaly bandMissing data⑤ EventBridge + SNSFindings → ruleCMK for SNSDashboards look only⑥ AggregationOAM sink + linkCentral event busSH home RegionDetection 1monitoring + alerting
Tap a branch to jump back to that part of the lecture. Try redrawing this map from memory on paper.

2. Match the requirement to the answer

“Alert when the root user is used”→Metric filter + alarm + SNS“Fail over DNS when the site is down”→Route 53 health check“Check a private endpoint’s health”→Route 53 CloudWatch alarm check“Test the user journey every minute”→CloudWatch Synthetics canary“Alert only if CPU AND errors are high”→Composite alarm“Traffic pattern changes by day/hour”→Anomaly detection alarm“Email on high-severity findings”→EventBridge rule → SNS“One account sees all accounts’ metrics”→Cross-account observability
The left column is the exam wording; the right column is the answer.

3. “If the question says… pick…”

Alert within minutes on root useMetric filter + alarm + SNS
Unauthorized API calls, CISExact CIS pattern, Sum ≥ 1
Metric filter misses old eventsNot retroactive: query logs
DNS failover between RegionsRoute 53 health check
Private endpoint, Route 53 failoverCloudWatch alarm health check
Real user journey, every minuteSynthetics canary
Page only if A and B both happenComposite alarm
Mute alerts during deploymentsActionsSuppressor
Normal traffic changes by hourAnomaly detection alarm
Act on each new finding at onceEventBridge rule
Encrypted SNS topic gets nothingCustomer managed KMS key
All accounts’ logs and metrics, one placeCross-account observability
Day 1 in one sentence

Start from the requirement, turn logs into metrics, combine them into smart alarms, route events to people or automation, and see it all from one account.

09

Must-remember cheat sheet

1. Requirement first; five signals: metrics, logs, events, health, findings.
2. EC2 memory and disk need the CloudWatch agent.
3. Route 53 checks: 10 or 30 s; healthy if > 18% agree.
4. Calculated health check: up to 255 children.
5. Private resource → alarm-based Route 53 health check.
6. HTTPS health checks don’t validate certificates.
7. ALB: all targets unhealthy → fails open.
8. Canary = Lambda script, as often as every minute.
9. Metric filters: new events only; value 1, default 0.
10. CIS controls need the exact filter patterns.
11. Composite alarm: up to 100 children; no EC2/ASG actions.
12. Anomaly detection: two weeks training; above/below band.
13. Missing data default: missing; error-only metrics: notBreaching.
14. GuardDuty repeat findings: 6 h default (15 min / 1 h).
15. Encrypted SNS: customer managed key, not aws/sns.
16. OAM sink is per Region; SH aggregation Region = home Region.
17. Function policy = who invokes; execution role = what it does.
18. EventBridge retries 24 h; keep failures in an SQS DLQ.
19. EC2 metrics: 5 min basic, 1 min detailed.
10

Core quiz

Check the basics first. Pick an answer, then press Check.

11

Hard quiz

Harder than most real exam questions on purpose, with one “choose two” and one matching question. Aim for 9 out of 12 before Day 2.

12

Practice test questions (from your mock exams)

These 9 questions come from your own SCS-C03 mock exams, matched to today’s topics. Wording was modernized where services were renamed (for example CloudWatch Events is now Amazon EventBridge), and each answer was checked against current AWS behavior; where the mock’s answer key was wrong, the explanation says so. The source (mock and question number) is at the end of each explanation.

13

Hands-on lab (30 minutes, low cost)

  1. Create an SNS topic security-alerts with an email subscription and confirm the email.
  2. Edit (or create) a CloudTrail trail so it also sends to a CloudWatch Logs log group. Let the console create the IAM role.
  3. Add the CIS unauthorized API calls metric filter from section 03 (namespace LogMetrics, value 1, default 0) and an alarm with Sum ≥ 1 over 5 minutes that notifies the topic.
  4. Trigger it: as an IAM user with no EC2 permissions, run aws ec2 describe-instances. CloudTrail can take several minutes to deliver; watch the metric, the alarm going to ALARM, and the email.
  5. Create an EventBridge rule with pattern {"source":["aws.guardduty"]} targeting the topic. If GuardDuty is on, use Generate sample findings in its console and watch the emails arrive.
  6. Optional: create a Route 53 health check on a public URL and look at its HealthCheckStatus metric in us-east-1.
  7. Clean up: delete the alarm, metric filter, EventBridge rule, health check and topic. Remove the CloudWatch Logs delivery from the trail or set a short log retention: CloudWatch Logs charges for ingestion and storage, Route 53 health checks bill monthly, and GuardDuty bills after its free trial.