TL;DR: Turn on GuardDuty and Security Hub and you have threat detection. You also have a firehose of findings, and an alert system that forwards all of them just trains you to ignore it. The alerts module forwards only what is worth interrupting someone for. The interesting part is what it deliberately drops, including a whole class of duplicate it would otherwise send twice.
Detection is the easy half
Switching on threat detection in an AWS account is a few resources. GuardDuty, Security Hub with its standards, IAM Access Analyzer: the security baseline does exactly that. From then on, the account is generating findings.
And it generates a lot of them. Plenty are low-severity, informational, or simply the normal texture of a cloud account. If you wire every finding to an email or a pager, you have not built monitoring. You have built noise. And noise has a specific failure mode: people stop reading it, and the one finding that genuinely mattered scrolls past unread alongside two hundred that did not.
So the valuable work is not detection. It is routing: deciding what is worth interrupting a human for, and letting the rest sit quietly in a console for whenever someone reviews it.
Forward the severe, leave the rest
The alerts module routes findings with EventBridge rules into an SNS topic that emails out. The rules are deliberately picky. GuardDuty findings are forwarded only at severity 7 and above. Security Hub findings are forwarded only at HIGH and CRITICAL.
Everything below those thresholds is not discarded. It is still in GuardDuty and Security Hub, where someone doing a review will see it. It just does not get to interrupt anyone’s day. The threshold is the line between “look at this now” and “look at this sometime.”
The duplicate you would otherwise send twice
Here is the subtle one, and it is the kind of thing you only find by looking closely at where findings come from.
Security Hub is an aggregator. It pulls findings in from other services, GuardDuty among them. So a single GuardDuty finding can show up in two places: in GuardDuty itself, and again in Security Hub as an aggregated copy.
A rule on GuardDuty findings and a rule on Security Hub HIGH/CRITICAL findings would therefore both fire for the same underlying GuardDuty finding. One event, two emails. Do that across an account and a meaningful fraction of your alert volume is just the same findings counted twice, which is its own kind of noise.
So the Security Hub rule explicitly excludes findings whose ProductName is GuardDuty, with an anything-but match. GuardDuty findings come through the GuardDuty rule. The Security Hub rule handles everything Security Hub adds that GuardDuty did not already report. One finding, one alert, regardless of how many services it passed through.
Two tripwires on the root account
Findings are about threats the detectors recognise. The module adds two alarms about something simpler: the root account doing anything at all.
One CloudWatch alarm fires on a root console sign-in. The other fires on any root API call that is not a console login. In a well-run AWS account, the root user does almost nothing after initial setup: day-to-day work happens through roles. So root activity is not a “finding” to be assessed for severity. It is a tripwire. Any of it, in an account that should be silent, is worth an immediate look, and the two alarms say so directly.
Why a quiet alert stream matters here
This is monitoring for the account that is going to hold the release-signing key, and that raises the stakes on getting the routing right.
If a key-bearing account ever does come under attack, the alert that says so has to be seen. An alert stream that is mostly noise and duplicates is, functionally, no alerting at all, because the people who would act on it have long since tuned it out. Routing the stream down to “severe, deduplicated, plus root tripwires” is what keeps it something a human will still read on the day it finally matters.
The short version
GuardDuty and Security Hub make detection easy. The hard, valuable part is routing: forwarding what deserves to interrupt someone and leaving the rest in a console.
The alerts module forwards GuardDuty at severity 7-plus and Security Hub at HIGH/CRITICAL, and it drops the duplicate that aggregation creates by excluding GuardDuty-sourced findings from the Security Hub rule, so one finding is one alert. Two CloudWatch alarms act as tripwires on root-account activity, which should be near-zero. For the account that will hold the signing key, a quiet, trustworthy alert stream is not a nicety. It is the difference between monitoring and theatre.