Version: 26h2 | Product: AI SIEM | Perfware.cloud
setup-domain (Step 2a) issues the ACM certificate and manages
the DNS records for you — you do not create the certificate by hand.aws cloudtrail describe-trailsAI Monitor is not required. AI SIEM deploys and runs fully without it. When AI Monitor is deployed on the same shared OpenSearch domain (the Log Processor one), AI SIEM reads its metric anomalies from that domain and correlates them — no extra wiring, no producer changes, no EventBridge. Deploying it alongside unlocks:
These features are advanced tier and above. Set the AiMonitorStackName stack
parameter (same account, alongside LogProcessorStackName) when you launch or
update the stack — that is what lets the editor read AI Monitor's subscription catalog. Then in
the editor (Configure → Data Sources → AI Monitor Correlation) you choose which
subscriptions contribute; selecting one correlates every resource it matches (a wildcard subscription
covers all matching instances). If AiMonitorStackName is not set, the correlation panel
reports the feature as unavailable and nothing else is affected.
Run cert-only first. It requests and DNS-validates an ACM certificate for your
editor domain in your hosted zone — no ALB or stack involved yet — and prints the
certificate ARN to use at launch:
scripts\setup-domain.cmd cert-only siem.company.com Z0123456789ABCDEF us-east-1
It reuses an existing issued certificate if one is already present, otherwise it requests one,
adds the validation CNAME to Route 53, and waits for validation (2–5 minutes). Note the
printed Certificate ARN — that is EditorCertificateArn for the
next step, with EditorDomain set to the same hostname. The DNS record that points the
domain at the editor is created after deploy, in Step 3a (the ALB does not exist yet).
On the fulfillment page, provide these parameters:
| Parameter | Description | Example |
|---|---|---|
| ConfirmStackName | Must match your stack name exactly | AISIEM |
| LogProcessorStackName | Name of your deployed Log Processor stack (required — provides the shared VPC, subnets, and OpenSearch domain) | LogProcessor |
| AiMonitorStackName | Name of your deployed AI Monitor stack, same account (optional, advanced+). Follows the same pattern as LogProcessorStackName. When set, the editor reads AI Monitor's subscription catalog so you can choose which metric anomalies correlate. Leave empty if AI Monitor is not deployed — the correlation feature is then unavailable. | AIMonitor |
| Tier | Pinned to the tier you subscribed to on Marketplace — shown but not selectable (locked to a single allowed value). No action needed. | (fixed) |
| AlertEmail | Email for threat notifications | security@company.com |
| EditorCertificateArn | ACM certificate ARN from setup-domain cert-only (Step 2a) | arn:aws:acm:us-east-1:... |
| EditorDomain | Editor domain (strongly recommended). The hostname you validated in Step 2a. Cognito login uses it as the callback, so set it at launch. | siem.company.com |
| EditorMfa | MFA enforcement for editor login: OFF, OPTIONAL (each user enrolls), or ON (required for all). TOTP authenticator apps. | OPTIONAL |
| CrossAccountIds | Comma-separated account IDs for cross-account threat detection (advanced+). Use this, OrganizationId, or both. | 111111111111,222222222222 |
| OrganizationId | AWS Organization ID for cross-account access (advanced+). Authorizes the whole org instead of listing accounts — used for cross-account reads and shared flow-log delivery. Optional. | o-abc123def4 |
create-flowlogs helper for
Flow Logs). That path both records the bucket and wires its S3 notification — the two steps
ingestion needs. See Step 5.
Check the email address(es) provided in AlertEmail. Click the confirmation link in the AWS SNS email. Threat alerts will not be delivered until confirmed.
Now that the stack exists, run setup-domain again — this time with the
stack name instead of cert-only. It resolves the stack's ALB and
creates the Route 53 alias so your domain resolves to the editor:
scripts\setup-domain.cmd AISIEM siem.company.com Z0123456789ABCDEF us-east-1
This is required for the editor to be reachable by name. (The certificate from Step 2a is reused;
nothing is re-issued.) The stack must already know this domain — which it does, because you
passed EditorDomain at launch — or Cognito login will reject the callback.
scripts\users.cmd <stack> create <email> (e.g.
scripts\users.cmd AISIEM create admin@company.com). The user receives a
temporary password.scripts\groups.cmd <stack> init once to create the admin /
analyst / viewer groups, then scripts\groups.cmd <stack> add-to-group
<email> <group> per user.https://<your-domain>/editor (or the editor URL in the
CloudFormation Outputs tab), and log in.In the editor, go to Configure → Data Sources. Sources arrive by two different mechanisms, which determines what you need to do:
CloudTrail and VPC Flow Logs are read from S3. The bucket
must send s3:ObjectCreated notifications to the ingestion queue.
Enter the bucket in Configure → Data Sources and click Save Sources. AI SIEM configures the notification for you when it can. If it reports it could not (usually a cross-account bucket), use the helper:
scripts\wire-log-bucket.cmd <stack> <bucket> <region> <bucket-profile> # same account scripts\wire-log-bucket.cmd AISIEM my-cloudtrail-logs # bucket owned by a log archive account scripts\wire-log-bucket.cmd AISIEM org-trail-logs us-east-1 logarchive
Merge-safe: existing notifications are preserved. Add --dry-run to preview.
For a shared bucket carrying both CloudTrail and Flow Logs, wire each source with its own
--prefix so the notifications coexist (e.g. --prefix AWSLogs/111/CloudTrail/).
The stack already creates the flow-log bucket (with lifecycle, the delivery
policy for local and cross-account, the ingestion notification, and the Athena Glue table). You do
not create or wire a bucket. The create-flowlogs helper just turns on a flow log for a
workload VPC you name, pointing at that stack bucket, with Hive-compatible per-hour
partitioning so it is directly queryable by Athena:
scripts\create-flowlogs.cmd AISIEM --vpc vpc-0abc123 scripts\create-flowlogs.cmd AISIEM --vpc-from-stack vpcsample --traffic ALL
A target VPC is required (--vpc or --vpc-from-stack). The tool
never targets the shared Log Processor / AI Monitor VPC and refuses to run if
the target resolves to it. Re-running is harmless.
One or more VPCs, one bucket: point as many VPCs as you like at the stack bucket
— AWS partitions deliveries by aws-account-id= / aws-region= under
the key path, so they coexist and Athena can query across all of them.
Cross-account (remote VPCs): run create-flowlogs from the remote
account with --bucket <stack-flow-bucket> (the FlowLogsBucket stack
output). The stack’s bucket policy already permits delivery from other accounts when it was
launched with OrganizationId (any account in the org) or CrossAccountIds
(the listed accounts). No per-account bucket-policy edits.
Traffic type: default ALL — S3 delivery is cheap, and
capturing everything is what feeds on-demand forensics. The cost of processing flow logs
is bounded by the duty-cycle + circuit breaker (see the Cost section), not by discarding data at
capture. Use --traffic REJECT only to minimize S3 storage. Two things read the bucket:
Athena (on-demand flow queries + the hourly scan-sweep, via the
flowlogs_raw table) and the duty-cycled ingestion path (continuous
port-scan detection).
wire-log-bucket
handles the notification and the queue policy (steps 1–2). The bucket’s owner must
also grant:
<stack>-IngestionRole → s3:GetObject in the bucket policykms:Decrypt in the key policyGuardDuty, Security Hub and AWS Config are delivered by EventBridge rules the stack creates. In the SIEM’s own account there is no bucket and no setup. They only produce data when something happens, so zero events is normal on a quiet account.
OrganizationId
(any account in the org may forward) or CrossAccountIds (only the listed accounts).
This opens the SIEM’s event bus to events:PutEvents for all three sources at
once. Set neither and the bus stays closed — single-account deployments need nothing.scripts\wire-events.cmd setup <central-account-id> [region] [--source LIST]
creates one forwarder role and one rule per source, sending that account’s findings to
the central bus. --source is a comma list of guardduty,securityhub,config
(default: all). remove/status manage it.These only work if the underlying AWS service is enabled. AI SIEM checks this for you and the panel will say AWS service not enabled rather than leaving you guessing. To verify yourself:
aws guardduty list-detectors aws securityhub describe-hub aws configservice describe-config-rules --query "ConfigRules[].ConfigRuleName"
Empty results mean the service is off and those rules will never fire. Enabling GuardDuty is the highest-value one; it begins producing findings on its own within a few hours.
| Status | Meaning | Action |
|---|---|---|
| Ingesting | Events received in the last 24 hours | None |
| Enabled but no S3 bucket configured | Source is on but has nowhere to read from | Enter a bucket and save |
| AWS service not enabled | GuardDuty, Security Hub or Config is off in this account | Enable it in that service's console |
| No events in 24h | Configured correctly but nothing arrived | Normal for EventBridge sources on a quiet account; for S3 sources check the bucket notification |
| Disabled | Switched off in configuration | Enable it if wanted |
Each built-in rule can carry exclusions so a known-good pattern stops tripping it — for example, excluding your deploy pipeline's office CIDR from Root Account Usage, or a specific service principal from a rule. Under Configure → Detection Rules, each built-in has an Exclusions section: add a condition (field, operator, value) and Save. If any exclusion matches an event, that rule does not fire for it. The fastest way is from the threat itself: open a threat fired by a built-in rule and click “(exclude this)” next to the rule name — it pre-fills an exclusion drawn from that threat (its source IP as a /24, or its principal) for you to review and Save. Exclusions suppress only: they can make a rule fire less, never hide a real anomaly (the behavioral baseline still scores every event on its own), and every change is audited. Available on all tiers.
Beyond the built-in rules, you can author your own under Configure → Detection Rules → Custom rules. A custom rule fires when all its conditions match and raises the threat score to at least its severity (it never lowers a higher score), then rides the same timeline, alerts, reports, and audit trail as any built-in detection. Three ways to create one:
cidr / exists, plus level, log source, and attack.* tags. An
OR condition (selA or selB, or 1 of …) is
imported as several rules, one per branch (AI SIEM rules already fire
independently) — review each before saving. Not translated: regular expressions (excluded
by design — use contains/starts-with/ends-with or an in-list), |all/base64
modifiers, and nested/AND-across-selection or negated conditions. For anything beyond that,
describe the detection in plain English and let AI draft it.Whatever the source, the rule opens in the builder for review — nothing is saved until you click Apply, then Save Rules. Custom rules can carry an ATT&CK tactic and technique, so they extend your MITRE coverage. Every save is recorded in the audit trail with a per-rule diff of what was added, changed, or removed.
On advanced tiers and above, a matched rule can score higher in riskier context. Two fixed modifiers apply on top of a rule's severity, and both only ever raise a score — never lower one below the rule's stated severity, and never override a higher ML score:
severityModifiers.trustedIps (a list of exact IP
strings). With no list configured, the IP modifier does nothing, so turning the tier on never
silently inflates your scores.The modifiers deliberately key only on identity and network facts — not on whether the activity is anomalous, which the ML baseline already measures — so a finding is never double-counted. A root action from an unknown IP can reach maximum severity; the same action from a trusted network scores at the rule's base.
Open FAQ in the editor. Every answer is a live check against the real dependency rather than a configuration readback, so it reflects what your deployment can actually do:
AI SIEM is deployed once, in one account, and reads security data from any number of other accounts using cross-account IAM roles. Available on advanced tier and above.
There are two steps, run in two different accounts and in this order:
Creates the trust roles AI SIEM assumes. Run with credentials for the account you want to monitor, passing the account ID of the account where AI SIEM is deployed:
scripts\setup-remote-access.cmd setup <central-account-id>
This creates two roles:
AISIEM-remote-read — read CloudTrail and VPC Flow Log objects from S3AISIEM-remote-respond — remediation actions, enterprise tier onlyRegisters the remote account and the bucket to read from, so ingestion begins:
scripts\add-account.cmd <stack> <remote-account-id> --trail-bucket <bucket>
You can also list the account IDs in the CrossAccountIds stack parameter, or set
OrganizationId to authorize an entire AWS Organization. Either may be used, or both.
<stack>-IngestionRole to s3:GetObject, and if SSE-KMS
encrypted, its key policy to allow kms:Decrypt, plus the notification wiring from Step 5.
This is the same four-part requirement described under Data Sources; see that section for the full
explanation and the replication alternative.
Download the helper scripts
(aisiem-scripts.zip). Unzip anywhere and run from that folder. Windows
.cmd and Linux/macOS .sh versions are provided for most; a few use
Python and need boto3 (pip install boto3). Run them with AWS
credentials for the account named in the table below.
readme.txt with the full
walkthrough — cross-account setup, shared-bucket prefixes, flow-log delivery, teardown
ordering, and the exact options for each script. Every script also prints its own usage when run
with no arguments (or --help). Review readme.txt and each
script's usage for the authoritative detail before running against a production account.
scripts\name.cmd for clarity. If you run them
from inside the unzipped folder, drop the scripts\ prefix.
| Script | Run in | Purpose |
|---|---|---|
check-quota.cmd | AI SIEM account | Verify service quotas before deploying |
setup-domain | AI SIEM account | Editor custom domain. cert-only mode issues + validates the ACM certificate before launch (Step 2a); <stack> mode creates the Route 53 alias to the ALB after deploy (Step 3a). |
create-flowlogs | AI SIEM account | Enable VPC Flow Logs on a workload VPC, delivered to the stack-owned flow bucket (the stack already provides the bucket, policy, notification, and Glue table). Never targets the shared Log Processor VPC. |
wire-log-bucket | Either | Attach any log bucket (CloudTrail or Flow Logs) to ingestion when the editor cannot do it itself, including cross-account. Supports --prefix for shared buckets. |
setup-remote-access | Remote account | Create the cross-account trust roles (Step A above) |
add-account | AI SIEM account | Register a remote account and its buckets (Step B above) |
users | AI SIEM account | Cognito users: create, list, delete, reset password, enable/disable |
groups | AI SIEM account | Cognito groups for role-based access: admin, analyst, viewer |
sso | AI SIEM account | Configure SAML or OIDC identity providers (enterprise) |
support-bundle | AI SIEM account | Collect diagnostics to attach to a support request |
admin can change configuration and approve remediation, analyst can
investigate and update threats, viewer is read-only. Run
groups.cmd <stack> init once to create them, then assign users with
groups.cmd <stack> add-to-group <user> <group>. Users in no group
default to admin, so create the groups before granting access more widely.
Retention follows the same hot-vs-total split compliance frameworks are written around: a searchable (hot) window in OpenSearch for fast triage, and a longer retained (cold) copy in the S3 datalake, queryable any time via Athena. Threat records live in DynamoDB; the audit trail lives in a tamper-evident (WORM) store. Retention is set by tier — longer history is part of what you get moving up.
| Retained data | Basic | Essential | Advanced | Enterprise |
|---|---|---|---|---|
| Events — searchable (OpenSearch) | 7 d | 90 d | 365 d | 365 d |
| Events — retained (S3 / Athena) | 7 d | 90 d | 365 d | 365 d |
| Threats | 7 d | 90 d | 180 d | 365 d |
| Threat timelines | 7 d | 90 d | 180 d | 365 d |
| Audit trail (default) | 30 d | 90 d | 365 d | 365 d |
| Config bucket — old object versions kept | 7 d | 14 d | 30 d | 30 d |
Threat, timeline, and audit retention are set per tier and applied
automatically; the config bucket keeps prior versions of siem-config.json for the
window above (a safety net for rollback) before expiring them. Audit retention can also be raised
independently at deploy — see the note below.
AuditRetentionDays stack parameter at deploy (up to 36500 days) —
the audit trail is the record those regimes govern, and it can be extended independently of the
tier without changing anything else. Choose COMPLIANCE Object-Lock mode if records
must be immutable until retention elapses.
DatalakeRetentionDays stack parameter at deploy (up to 36500 days, e.g.
2555 for 7 years). It extends the cold S3/Athena retention of raw events and the
threat forensic copy without a tier change; the immediately-searchable OpenSearch window
stays governed by your tier, so you add cold-storage cost, not hot-index cost. In short: a 7-year
buyer sets AuditRetentionDays=2555 (plus COMPLIANCE lock if required) for
the audit record and DatalakeRetentionDays=2555 for the raw logs and threat evidence.
Every event is written to an S3 datalake in Parquet, partitioned for efficient Athena queries, regardless of whether it was promoted to OpenSearch. Use this for investigations reaching further back than the OpenSearch retention window:
s3://<stack>-siem-datalake-<account>-<region>/
cloudtrail/account_id=.../region=.../year=.../month=.../day=.../*.parquet
flowlogs/account_id=.../region=.../year=.../month=.../day=.../*.parquet
guardduty/ securityhub/ config-changes/ threats/
A Glue database named <stack>_siem is created with tables over these prefixes.
Filter on the partition columns so Athena scans only what it needs:
SELECT * FROM cloudtrail WHERE account_id = '111111111111' AND region = 'us-east-1' AND year = '2026' AND month = '08';
AI SIEM's own resources are modest and mostly usage-based. With VPC Flow Logs the cost splits into two very different parts, and AI SIEM is built around that distinction:
ALL traffic at tens of GB/day
is a modest, storage-class-manageable line.| Flow log volume | Approximate AWS S3 cost |
|---|---|
| 1 GB/day | ~$8/month |
| 10 GB/day | ~$75/month |
| 100 GB/day | ~$750/month |
ALL — the full picture always lands in the datalake.
The cost control is on the processing side, not by discarding data at capture:
create-flowlogs with --traffic REJECT, but you then lose ALL-traffic
forensics.
As threats are detected, they appear in the Threats panel with:
The detail view opens inline below the list with two tabs. Summary is the at-a-glance triage view — key facts, the description, current assignment, and a quick overview — so you can decide what to do without scrolling. Details holds the full breakdown: evidence, event timeline, correlated identities, audit history, and the response playbook. The rule that fired the threat is shown on the Summary tab and in Evidence as a link: a custom rule opens that rule under Configure → Detection Rules; a built-in rule (shown with a readable name) opens the built-in rules section, and offers an “(exclude this)” action that pre-fills an exclusion for that rule from the threat. A “Back to threat” link returns you where you were. Any role can follow the link to view; editing the rule still requires an admin or analyst.
Tuning a noisy group (advanced+): when a rule fires repeatedly and fills a group with similar threats, expand the group and click ✨ Analyze. AI assesses whether they look like false positives and proposes an exclusion to add to the firing rule (shown alongside the facts the threats share). You then choose two separate actions: Apply rule change opens the rule in the builder with the exclusion added for your review — nothing is saved until you Apply and Save Rules, and the change is audited — and Mark these N as false positive clears the existing pile. The suggestion can only ever narrow a rule, never broaden it, and custom rules are floors-only, so a tuning can't hide a real anomaly the behavioural baseline would still catch. Requires custom rules and the AI (Bedrock) feature.
Assessing a rule (advanced+): in the custom-rule builder, click ✨ Assess to have AI sanity-check the rule you're editing — whether it does what its name says, is too broad, has redundant conditions, or is trying to express something the event fields can't (for example a cross-account comparison, which the data doesn't carry). The critique is grounded in a field-capability contract (each field's type, legal values, and the comparisons that aren't possible) plus deterministic checks, so the structural facts don't rely on the model. It's advisory only: nothing changes, you decide what to edit. Requires custom rules and the AI (Bedrock) feature.
Notes: as you work a threat, add free-text notes in the Audit History section. Notes are append-only and appear in the threat's history (and the audit trail) alongside status changes and remediations, so the investigation reads as a running record.
Download a report: the detail header has a Download button that exports a self-contained HTML incident report — facts, evidence, timeline, correlated identities, the full audit trail, and the playbook — with live links back to the threat and to any custom rule that fired. Hand it to a ticket, an email, or an auditor; the links open the live record for anyone who can sign in.
Filtering & assigning work: the Threats toolbar filters by status, severity,
type, and a time window (last 24h, 48h, week, month, 2 months, or older —
handy for clearing an older backlog). Select a threat to open its detail, then use the assignment
control: an admin can assign to any user or claim it; an analyst can claim
it for themselves. Tick Assigned to me to work only your own queue, and (admins)
use the Assigned to dropdown to filter by owner or find unassigned threats. Every
assignment is recorded in the audit trail (who assigned what to whom, and when).
users/), and the picker lists those — so it works in any region with no extra
setup, and reflects each user's current role. A user you just created (or one whose role changed)
appears after their next login. This is only about the autocomplete suggestions — the box
accepts free text, so you can always type a user's full email address and click Assign
even if they are not yet listed. Viewers are never shown as assignees. The admin
Assigned to filter can additionally show anyone a threat is already assigned to,
even if they have not signed in recently.
<stack>_siem, table audit).
| Symptom | Most likely cause |
|---|---|
| Sign-in shows “User does not exist.” but the user really exists | Almost always a browser cookie issue, not a missing account. Sign-in
redirects between the editor and the Cognito hosted login, which needs cookies on both;
a private/incognito window or strict tracking-prevention that blocks
third-party cookies breaks that handoff, and Cognito reports it as the misleading
“User does not exist.” Fix: use a normal window, or allow cookies for the
editor domain and the *.auth.<region>.amazoncognito.com sign-in domain.
Confirm the account exists with scripts\users.cmd <stack> list. |
| A source shows Enabled but no S3 bucket configured | Enter the bucket under Configure → Data Sources and save. |
| Bucket is set, files are in it, but no events arrive | The bucket has no s3:ObjectCreated notification to the ingestion queue.
Save again in Data Sources, and if that reports a failure run
scripts\wire-log-bucket.cmd. Verify with
aws s3api get-bucket-notification-configuration --bucket <name>. |
| GuardDuty, Security Hub or Config show no events | Normal on a quiet account. If the panel says AWS service not enabled, that service is off in your account and its rule can never fire. |
| No threat alert emails | The SNS subscription is unconfirmed. The FAQ panel lists pending subscribers. Unconfirmed addresses receive nothing and produce no error. |
| Playbook generation fails | Check the FAQ Bedrock row. Access denied usually means model access is not granted or the Anthropic use case form has not been submitted in the Bedrock console. |
| Editor shows an authentication error after login | If you use a custom domain, it must be set in the EditorDomain
parameter, not only in DNS, so the hostname is registered as a valid Cognito callback. |
| Ingestion counts look healthy but dashboards are empty | Expected. Only events above the promotion threshold are indexed into OpenSearch; everything else is queryable in the S3 datalake via Athena. |
When contacting support, include the Version line from the FAQ panel — it identifies your stack, tier, release and build.
Deleting the CloudFormation stack does not detach the data sources that feed it. Bucket notifications and any VPC Flow Logs created for AI SIEM live outside CloudFormation and survive the delete. Left in place, notifications fire at a queue that no longer exists, and flow logs keep writing to S3 while you continue paying for storage.
Run teardown in this order:
python scripts\sever_sources.py <stack> python scripts\sever_sources.py <stack> --apply
Deletes VPC flow logs, removes this stack's bucket notifications (merge-safe: other
tools' notifications are preserved), and stops the CloudTrail trail. Each action is
confirmed individually. Add --delete-trail to delete rather than stop the
trail. Add --delete-buckets to also destroy the log buckets AI SIEM created
(irreversible — requires typing each bucket name to confirm).
aws cloudformation delete-stack --stack-name <stack> aws cloudformation wait stack-delete-complete --stack-name <stack>
cleanup.py
(in the helper-scripts bundle) finds and removes only what this stack owns and
never touches the shared Log Processor / AI Monitor VPC or OpenSearch domain.
It is dry-run by default — run it once to see what remains, then again
with -confirm (prompt per resource) or -force:
python scripts\cleanup.py <stack> <region> python scripts\cleanup.py <stack> <region> -confirm
Log/threat buckets are only reported unless you pass -delete-buckets, and the
WORM audit bucket is never touched without its own separate opt-in. Run it after the stack
delete completes.
AISIEM-remote-read and
AISIEM-remote-respond in each remote account remain. Remove them in those accounts
with scripts\setup-remote-access.cmd remove <central-account-id>.
Flow-log processing is the single largest cost variable — not delivery to S3,
which is cheap. AI SIEM therefore captures ALL traffic to S3 by default and bounds the
processing, rather than logging less. Detection comes from three complementary paths:
| Path | What it detects | Cost shape |
|---|---|---|
| Duty-cycled push scoring | Port scanning, blocked connections, on-port anomalies | Bounded by the on-window + concurrency; backlog is free in SQS |
| Scheduled scan sweep (Athena) | Port scanning — backstop when the push path is off/breakered | Fixed: one partition-pruned query per hour |
| On-demand flow query (Athena) | Data exfiltration / destination detail around an AI Monitor anomaly | Per incident: cents, pruned to one resource + hour |
When flow processing runs, AI SIEM's ingestion filter drops routine noise before scoring: internal VPC-to-VPC ACCEPT traffic, ACCEPT on safe ports (443, 80, 53) to private destinations, and broken records. Only REJECT flows, large transfers, and ACCEPT to external addresses on unusual ports reach the scoring pipeline — and everything, filtered or not, remains in the S3 datalake for Athena.
create-flowlogs refuses to target the shared
infrastructure VPC for exactly this reason — monitoring the VPC the SIEM runs in creates an
amplification loop where its own API calls generate flow records — and the same principle
applies to any flow logging you configure manually.
With AiMonitorStackName set (see Step 2), AI Monitor's metric anomalies are
correlated into threat timelines automatically — no wiring, no producer change. Under
Configure → Data Sources, the AI Monitor Correlation panel
lists the subscriptions AI Monitor marks for SIEM correlation (read from its
subscription catalog) and lets you choose which contribute to the SIEM. Correlation is
opt-in: check each subscription you want correlated — nothing is correlated
until you select it. Selecting a subscription correlates all resources it matches. Log Processor
pattern detections reach the SIEM the same way: subscribe AI Monitor to a Log Processor pattern
metric, and a spike surfaces here as a correlated event. If AiMonitorStackName was not
set at launch, the panel reports the feature as unavailable.
Flow logs are delivered to S3 continuously (ALL traffic; delivery is cheap), so the
detail is always there when an incident happens — there is nothing to turn on. When AI Monitor
flags an anomalous network-egress spike on a resource, AI SIEM resolves that resource to its network
interfaces and IPs and runs a scoped Athena query against the flow datalake, pruned
to that resource and the anomaly's time window. It reads back the top destinations, ports and byte
volumes and raises a threat with that evidence, correlated into the timeline like any detection. You
pay per-incident query cost (cents), not the cost of scoring all traffic — and no VPC flow-log
configuration is changed on your resources.