DRAFT

AI SIEM — Getting Started Guide

Version: 26h2 | Product: AI SIEM | Perfware.cloud

Prerequisites

Deploy in the same region as Log Processor. AI SIEM resolves the VPC, subnets and OpenSearch domain from Log Processor via SSM parameters, and Lambda requires its deployment package to be in the deployment region. Deploying to a different region will fail.

Optional: AI Monitor Integration (advanced tier and above)

AI 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.

Step 1: Subscribe on AWS Marketplace

  1. Navigate to the AI SIEM listing on AWS Marketplace
  2. Click Continue to Subscribe
  3. Accept terms and wait for subscription activation (~2 minutes)
  4. Click Continue to Configuration
  5. Select your tier and preferred region, then Continue to Launch

Step 2a: Issue the editor certificate (before launch)

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).

Step 2: Deploy the CloudFormation Stack

On the fulfillment page, provide these parameters:

ParameterDescriptionExample
ConfirmStackNameMust match your stack name exactlyAISIEM
LogProcessorStackNameName of your deployed Log Processor stack (required — provides the shared VPC, subnets, and OpenSearch domain)LogProcessor
AiMonitorStackNameName 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
TierPinned to the tier you subscribed to on Marketplace — shown but not selectable (locked to a single allowed value). No action needed.(fixed)
AlertEmailEmail for threat notificationssecurity@company.com
EditorCertificateArnACM certificate ARN from setup-domain cert-only (Step 2a)arn:aws:acm:us-east-1:...
EditorDomainEditor 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
EditorMfaMFA enforcement for editor login: OFF, OPTIONAL (each user enrolls), or ON (required for all). TOTP authenticator apps.OPTIONAL
CrossAccountIdsComma-separated account IDs for cross-account threat detection (advanced+). Use this, OrganizationId, or both.111111111111,222222222222
OrganizationIdAWS 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
Log sources are configured after deploy, in the editor. The launch form has no bucket fields. Once the stack is up, add CloudTrail and VPC Flow Log sources under Configure → Data Sources (or with the 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.
Deployment time: ~10–15 minutes. The stack resolves Log Processor's VPC and OpenSearch parameters via SSM, adds security group ingress, creates the SIEM-specific resources, and initializes the configuration bucket.

Step 3: Confirm SNS Subscription

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.

Step 3a: Point the domain at the editor (after deploy)

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.

Step 4: Create the First User (and Access the Editor)

  1. Create the first admin in AI SIEM's own Cognito pool: scripts\users.cmd <stack> create <email> (e.g. scripts\users.cmd AISIEM create admin@company.com). The user receives a temporary password.
  2. Role-based access (enterprise): a user in no group defaults to admin, so your first user can sign in immediately. Before adding more users with restricted roles, run 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.
  3. Browse to https://<your-domain>/editor (or the editor URL in the CloudFormation Outputs tab), and log in.
  4. The threat dashboard shows connected sources, active threats, and system health.

Step 5: Configure Data Sources

In the editor, go to Configure → Data Sources. Sources arrive by two different mechanisms, which determines what you need to do:

S3-based sources (need a bucket)

CloudTrail and VPC Flow Logs are read from S3. The bucket must send s3:ObjectCreated notifications to the ingestion queue.

CloudTrail

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/).

VPC Flow Logs

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).

Cross-account buckets need four things, not two. wire-log-bucket handles the notification and the queue policy (steps 1–2). The bucket’s owner must also grant: Without these two, notifications arrive but every read fails — the queue drains into the DLQ and nothing is indexed, even though the source shows enabled. If a cross-account source looks connected but no events appear, this is almost always why.
Alternative: replicate the bucket into one the SIEM account owns and wire that; then no cross-account grants are needed.

EventBridge sources (nothing to configure — in this account)

GuardDuty, 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.

Cross-account findings (GuardDuty, Security Hub, Config). EventBridge findings do not cross accounts on their own, so another account’s findings will not appear until you forward them. Two sides: Where to run it — you may not need it in every account:

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.

Reading the health indicators

StatusMeaningAction
IngestingEvents received in the last 24 hoursNone
Enabled but no S3 bucket configuredSource is on but has nowhere to read fromEnter a bucket and save
AWS service not enabledGuardDuty, Security Hub or Config is off in this accountEnable it in that service's console
No events in 24hConfigured correctly but nothing arrivedNormal for EventBridge sources on a quiet account; for S3 sources check the bucket notification
DisabledSwitched off in configurationEnable it if wanted
Baseline learning: ML behavioral models begin learning immediately and become effective after 7–14 days of baseline data. Static detection rules fire from day one and are tunable under Configure → Detection Rules.

Narrowing a built-in rule (exclusions)

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.

Custom detection rules (advanced+)

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:

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.

Context-aware severity (advanced+)

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:

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.

Step 5a: Check Everything Is Working

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:

Only high-scoring events reach OpenSearch. Every event is written to the S3 datalake for Athena queries, but only those scoring above the promotion threshold are indexed into OpenSearch for dashboards. Low OpenSearch counts alongside healthy ingestion counts is expected behavior, not a fault.

Multi-Account Monitoring

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:

Step A — in each remote account

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:

These role names are fixed and must not be changed. AI SIEM refers to them by name, so a renamed role will not be found.

Step B — in the AI SIEM account

Registers 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.

Multi-region coverage

Remote buckets need explicit access. A bucket in another account requires its bucket policy to allow <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.

Helper Scripts

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.

The table below is a summary. The bundle includes 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.
Commands in this guide are written as scripts\name.cmd for clarity. If you run them from inside the unzipped folder, drop the scripts\ prefix.
ScriptRun inPurpose
check-quota.cmdAI SIEM accountVerify service quotas before deploying
setup-domainAI SIEM accountEditor 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-flowlogsAI SIEM accountEnable 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-bucketEitherAttach 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-accessRemote accountCreate the cross-account trust roles (Step A above)
add-accountAI SIEM accountRegister a remote account and its buckets (Step B above)
usersAI SIEM accountCognito users: create, list, delete, reset password, enable/disable
groupsAI SIEM accountCognito groups for role-based access: admin, analyst, viewer
ssoAI SIEM accountConfigure SAML or OIDC identity providers (enterprise)
support-bundleAI SIEM accountCollect diagnostics to attach to a support request
Role-based access: editor permissions come from Cognito group membership. 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.

Data Retention & Compliance

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 dataBasicEssentialAdvancedEnterprise
Events — searchable (OpenSearch)7 d90 d365 d365 d
Events — retained (S3 / Athena)7 d90 d365 d365 d
Threats7 d90 d180 d365 d
Threat timelines7 d90 d180 d365 d
Audit trail (default)30 d90 d365 d365 d
Config bucket — old object versions kept7 d14 d30 d30 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.

How the live threat list is pruned (retention & archive). The live threat list in DynamoDB — the one you triage in the editor — is kept bounded by a daily archive pass, so the dashboard totals stay exact and the list stays fast even after months of activity. A threat leaves the live list when it is handled (resolved / false‑positive / dismissed) and older than a short grace window, when it passes a hard age cap regardless of status, or — as a ceiling — when the live count runs high (oldest / lowest‑severity first). Every removal is recorded in the tamper‑evident audit trail, and the forensic copy in the S3 datalake and the WORM audit store keep their own, longer retention — archiving only prunes the operational store, never the record of what happened. Tune the grace window, hard age cap, and the live‑count high/low‑water marks under Settings → Threat Retention & Archive (all range‑checked); the underlying DynamoDB TTL is only a long backstop, not the primary remover.

Compliance fit. Essential and above keep at least 90 days immediately searchable, meeting PCI DSS’s three-month hot requirement. Advanced and above provide a full 12 months searchable, covering PCI DSS’s 12-month total and typical SOC 2 audit periods. For HIPAA (6 years) or SOX (7 years) audit-log obligations, raise the 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.
Hot vs. cold, and long log-retention. Retention has two layers: a hot window in OpenSearch (immediately searchable, set by your tier) and a longer cold copy of every raw event in the S3 datalake, queryable any time via Athena. If your policy requires keeping the raw logs longer than your tier’s default (for example a 7-year log-retention mandate), raise the 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.

Querying Historical Data

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';

Cost Expectations

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:

Flow log volumeApproximate AWS S3 cost
1 GB/day~$8/month
10 GB/day~$75/month
100 GB/day~$750/month
Capture everything, bound the processing. Because S3 delivery is cheap, the default flow log traffic type is ALL — the full picture always lands in the datalake. The cost control is on the processing side, not by discarding data at capture: CloudTrail, GuardDuty and Config ingestion are on a separate, always-on path and are never affected by the flow-log guardrail. Enable the guardrail under Configure → Settings → Flow-Log Cost Guardrail. If you must minimize even S3 storage, you can still run create-flowlogs with --traffic REJECT, but you then lose ALL-traffic forensics.
Fixed costs are the Editor load balancer, any interface VPC endpoints, and the OpenSearch domain provided by Log Processor, which is usually the largest single line. Verify current rates on the Amazon VPC pricing page.

Step 6: Review Threats

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).

Who appears in the assignee picker: the admin assign box suggests admins and analysts who have signed in at least once. Because the editor runs in an isolated VPC and cannot query Cognito directly, each sign-in leaves a small breadcrumb in the config bucket (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.
Audit trail: every status change, assignment, remediation, and configuration change — plus logins, logouts, and denied access attempts — is recorded with who, when, their role, and origin IP to a tamper-evident, write-once (WORM) store. Review it in the per-threat Audit History section, the scheduled report's Audit Activity table, or with the saved Athena query “Audit activity (who did what)” (database <stack>_siem, table audit).
“Config Tampering” threat: if you see a threat of this type, the SIEM configuration was changed outside the editor (a direct edit of the config object in S3, bypassing the audited path). It carries a field-level diff of what changed. Make configuration changes through the editor so they are audited; a direct edit is flagged by design.

Updating

Troubleshooting

SymptomMost 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.

Teardown (Uninstalling)

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:

  1. Sever sources (dry run first):
    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).

  2. Delete the stack:
    aws cloudformation delete-stack --stack-name <stack>
    aws cloudformation wait stack-delete-complete --stack-name <stack>
  3. OpenSearch artifacts: no action needed. The stack’s custom resources remove AI SIEM’s dashboards, index templates, ISM policy, and seed indices from the shared domain automatically on stack delete. (Your event data lives in the S3 datalake, not the domain.)

  4. Sweep up any orphans (optional): a CloudFormation delete can occasionally leave resources behind — a bucket that still had content, an ENI mid-detach, a VPC endpoint or security group this stack created in the shared VPC. 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.

Cross-account roles survive. 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>.

VPC Flow Logs: Cost vs Detection

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:

PathWhat it detectsCost shape
Duty-cycled push scoringPort scanning, blocked connections, on-port anomaliesBounded by the on-window + concurrency; backlog is free in SQS
Scheduled scan sweep (Athena)Port scanning — backstop when the push path is off/breakeredFixed: one partition-pruned query per hour
On-demand flow query (Athena)Data exfiltration / destination detail around an AI Monitor anomalyPer 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.

Port-scan detection is preserved even with the guardrail on. A scan is a set of REJECT flows over a window; the duty-cycled push path aggregates them when it next runs (queued, not dropped), and the hourly Athena scan-sweep catches anything that occurs entirely during an off or breakered window. So bounding cost never blinds scan detection.
Do not monitor the SIEM's own VPC. The LogProcessor VPC exists because OpenSearch requires it, not because it carries workload traffic worth monitoring. In a real deployment the SIEM monitors customer VPCs, not its own. 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.

AI Monitor correlation (advanced+)

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.

On-demand flow query (advanced+)

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.

Support