How Wazuh AWS security monitoring reads logs from your S3 buckets
Wazuh AWS security monitoring uses the aws-s3 module to pull log objects from S3 buckets that AWS services write to, so CloudTrail, GuardDuty, VPC flow logs and Config records reach a system you run. The Wazuh server reads each object, applies decoders to parse its fields and rules to flag events worth attention, then sends the resulting alerts to the Wazuh indexer, where they are stored and searched, and to the Wazuh dashboard, where your team reviews them. For a security or platform lead, the practical point is that the log path runs from your AWS accounts to infrastructure you control, without a hosted log collector in between.
Each stage has a distinct job, and naming them helps when you plan. The bucket holds the raw log files. The aws-s3 module needs read access to those objects and finds them through configuration on the Wazuh server, which you define for each bucket and log type. Decoders depend on the format each AWS service produces, so a log type that decodes poorly will still be stored but will yield weaker alerts. Rules then classify the decoded events. Before you commit to a service list, confirm in the Wazuh documentation which log types the module supports and which decoders and rules ship with your Wazuh release, because coverage differs by service and by version.
The self-hosted Wazuh software is open source and carries no license fee, so the recurring costs to plan for are infrastructure and AWS charges. AWS bills for the S3 storage that holds the log objects, for the requests the module makes when it lists and reads them, and for any data transfer the pipeline creates. Retention length and the volume each service writes are the main drivers. Ask for a pilot period with a measured estimate, and ask any implementation partner to price storage, request volume and transfer as separate lines in the written scope, so you can see which cost grows as you add services.
Decide the bucket layout and the first services before you enable anything. Start with the logs that answer your most urgent questions, usually control plane audit records and threat findings, and add flow logs or configuration history once you have measured their volume. Confirm the IAM permissions the module requires in the Wazuh documentation, and scope them to the specific buckets and prefixes you use. Then test the path end to end: generate a known API call, confirm the matching object appears in the bucket, and check that a related alert shows in the dashboard. Treat ingestion lag as something to measure during the pilot, not something to assume.
What your AWS account and Wazuh server need before ingestion
These four groups decide whether ingestion can start on schedule. Each needs a named owner on your side, and a gap in any one of them stops the aws-s3 module from reading logs. Confirm the aws-s3 module's current requirements in Wazuh's AWS documentation before you schedule work, then close the items below in order.
Wazuh server version
Wazuh 4.14 is the current release line, so start there unless your environment has a reason to stay on an older branch. Confirm that the aws-s3 module supports the exact version you run by checking the release notes for that version, since module support is recorded per release. Record the versions of the Wazuh server, indexer and dashboard, because the AWS integration runs on the server and every test and upgrade decision depends on that version.
AWS accounts and regions
List every AWS account and region whose logs should reach Wazuh before anyone drafts an IAM policy. Note whether the accounts sit in an AWS Organizations structure, and whether CloudTrail or Config aggregation is set up in a management or delegated account. Identify the region and bucket where each log source is written, because those details shape the configuration you will need. Choose the first services to enable, such as CloudTrail, GuardDuty or VPC flow logs, so the initial scope stays small and testable.
Network path to AWS
The Wazuh server must reach the AWS endpoints that the aws-s3 module calls, and the route depends on where the server runs. Map the path from the server to those endpoints in each region, including any proxy, egress firewall or DNS resolver along the way. If the server sits in a private subnet, confirm whether it reaches AWS through a NAT gateway, an interface endpoint or a proxy. Test connectivity from the Wazuh server itself, because a workstation test does not show what the server can reach.
IAM and bucket approvers
IAM roles, policies and bucket permissions usually belong to a security or cloud platform team, and ingestion waits on their sign-off. Identify who approves a new read-only role, who owns the bucket policy, and who controls the KMS key if the log objects are encrypted. Agree the change path and the evidence they need, such as the proposed policy document and a test run. Ask for these names during scoping so approval time is included in the plan from the start.
Which AWS logs to enable first in Wazuh AWS monitoring
Start with CloudTrail, add GuardDuty findings second, and bring in AWS Config and VPC flow logs only after the first two have named owners and a tested triage path. The ranking weighs three things: the detection value of each log type on its own, how much data it produces, and which team will read the resulting alerts. For a first phase, the best choice is usually the log that someone will act on during the first week of alerts, not the one that looks most comprehensive on paper.
CloudTrail records API activity across the account, including console sign-ins, role assumptions, IAM policy changes and changes to logging itself. Those events cover many of the behaviors a cloud security team needs to see first, such as a trail being stopped or new access keys being created. Its volume is moderate for most accounts, and the people who act on it are usually the cloud security or platform engineers who already administer IAM. Before enabling it, confirm with your AWS administrators whether an organization trail already exists, because a second trail can duplicate events and add storage cost.
GuardDuty comes second because its findings are already triaged by AWS, which keeps volume low and gives a small response group a quick signal. AWS Config comes third. It provides configuration history and evidence for compliance baselines, and the platform team that owns those baselines is the natural reader. VPC flow logs rank last for the first phase. They produce the largest volume of the four, their value depends on whether a network or SOC team has rules to read them, and storage and ingestion cost grow with traffic. For each of these, check whether the data is already collected by another tool so that Wazuh does not become a second copy.
Starting with one account and one region narrows the first phase to a small set of log streams. That makes it possible to measure daily event counts, check which events match decoders and rules, and confirm that alerts reach the right people before scope grows. The cost is that activity moving across accounts or regions may go unseen until expansion, so plan the expansion as a separate change with its own review. Before any of this, confirm the exact log types the aws-s3 module parses against Wazuh's current documentation for your release, then test each one on a sample bucket with representative log files before enabling it in production.
Wazuh AWS monitoring setup, from IAM role to first alert
This sequence takes a Wazuh server from version check to a confirmed AWS event in the dashboard. Each step ends with a check you can repeat, so the team knows which part of the pipeline is working before it moves on. The result is a read-only AWS identity, defined log paths in S3, a configured aws-s3 module, and a counted, decoded event in the indexer.
Confirm the server and module versions
The engineer running the setup checks the Wazuh server version against the release notes for the 4.14 line and confirms that the aws-s3 module is available in that version before any AWS work begins. Record the exact version in the change ticket, because module options and behavior can change between patch releases. Done when the server reports its version from the command line and the module documentation for that version matches what the server is running. Ask your implementation partner or Wazuh support to confirm any module behavior that differs on your build.
Create a dedicated read-only IAM identity
The AWS administrator creates an IAM user or role used only by the aws-s3 module. Its policy allows listing and reading objects under the bucket prefixes that hold each log source, and it grants no write or delete actions. Scope the policy to the bucket and the prefixes in use, not to the whole account, so a credential leak exposes as little as possible. Test the identity with the AWS CLI using the same credentials: listing the target prefix should return objects, and a write attempt should be denied. Done when both checks return the expected result.
Enable log sources to a defined bucket path
For each service you chose to start with, such as CloudTrail, GuardDuty, VPC flow logs or AWS Config, the AWS administrator turns on delivery to an S3 path that follows one layout across all sources. Keep each source under its own prefix so the module can read each path with its own configuration. Done when the first objects appear under the expected prefixes in the bucket listing. Delivery to S3 does not always start at once, so confirm the object listing before moving to the next step.
Configure the aws-s3 module with those paths
On the Wazuh server, add an aws-s3 wodle block to the server configuration with one entry per bucket path. Each entry names the bucket, its region, the credentials profile or role from the earlier identity step, and the log source type that matches the path. Run the server's configuration test before any restart to catch syntax errors. Done when the configuration test passes and each entry points to a prefix you already confirmed in the bucket listing.
Restart or reload the server as documented
Restart the Wazuh server using the method the documentation gives for your installation type, then check the service status. Review the server log for messages showing the aws-s3 module starting and completing its first poll without errors. In a cluster, follow the documented node order and do not restart nodes in parallel unless the documentation for your version says that is safe. Done when the service reports as active and the log shows the module running without errors.
Confirm the first decoded AWS event
Open the Wazuh dashboard and search alerts or archived events for the AWS source, filtering on the source type you configured. Open one event and check that decoded fields, such as the event source, region and account, are populated. If the event shows only raw text, check the decoder for that log type against your version's documentation before adding more sources. Done when at least one event from each enabled source shows populated fields.
Count ingested events in the indexer
Run a count query against the Wazuh indexer for the AWS rule group or the module's index pattern over a short, defined time window. Compare the result with the objects the module reports processing in the server log for the same window. Record the baseline count and the window used so later growth and gaps can be measured against it. Done when the count is above zero and the objects in the window match the prefixes you listed in the bucket.
Mapping each AWS log source to its bucket path and Wazuh rules
This table maps each AWS log source to what it records, the bucket path it lands in, the Wazuh decoder or rule group that should handle it, and what to confirm before ingestion. Read each row as a checklist, because the bucket path must match the module configuration and the decoder must match the format your account actually produces. Confirm exact decoder and rule names in the Wazuh ruleset for your version before relying on them.
| AWS log source | What it records and where it lands | Wazuh decoder or rule group | What the team must confirm |
|---|---|---|---|
| CloudTrail | API and console activity for the account. Lands in the trail's bucket under the prefix set when the trail was created. | Take the CloudTrail decoder and rule group names from the Wazuh ruleset for your version. | The trail covers all regions, the prefix matches the module setting, and log file validation is enabled. |
| GuardDuty | Threat findings for the account and region. Findings export to the bucket at the path set in the export configuration. | Take the GuardDuty decoder and rule group names from the Wazuh ruleset for your version. | The export path and bucket key policy, and which finding types are enabled and in scope for alerting. |
| VPC flow logs | Network connection metadata for each VPC, subnet or network interface. Lands in the bucket at the path set by the flow log destination. | Take the flow log decoder and rule group names from the Wazuh ruleset for your version. | The log format and fields match what the decoder expects, and the fields your rules depend on are included. |
| AWS Config | Configuration items and changes for supported resource types. Lands in the bucket under the delivery channel prefix. | Take the Config decoder and rule group names from the Wazuh ruleset for your version. | Which recorder and resource types are on, and whether configuration history and snapshots both deliver to the bucket. |
| Other services in scope | Load balancer, WAF, DNS or other service logs, each with its own bucket path and record format. | Check the current Wazuh ruleset for a decoder and rule group for each service before enabling it. | Each service's log format, delivery path and whether the aws-s3 module supports that log type in your version. |
What drives ingestion volume in Wazuh AWS security monitoring
The main driver of ingestion volume is what you connect, not how long the integration runs. Each AWS account and region you include adds its own set of log sources, and each log type you enable adds a stream with its own volume profile. CloudTrail, GuardDuty, AWS Config and VPC flow logs differ sharply in how much they produce, so enabling a service because it sounds useful can change the indexer footprint more than adding a second account. Start by listing every account, region and log type in scope, then mark which streams the security team will actually query. That list is the input to every other estimate in this section.
Two AWS-side factors decide how much data reaches the bucket and how hard the aws-s3 module works to read it. VPC flow logs are often the largest stream because they record traffic at the network interface level, so busy subnets, NAT gateways and chatty workloads push volume up quickly. Bucket layout matters too. The number of objects a bucket accumulates, and how many of them are new since the last run, shapes listing and read work even when total bytes look modest. The polling interval and the number of buckets each module instance watches set how often that work recurs. Ask the team to report object counts per prefix, not only total storage size.
Keep two budgets separate in planning. AWS-side charges cover what AWS bills for: log delivery, S3 storage and requests, data transfer, and the charges for the services that generate the logs. Wazuh-side sizing covers the infrastructure you run: the indexer storage that holds alerts and archived data, the retention period you set, the Wazuh server cluster needed to decode and analyze events, and the hosts that run the integration. A saving on one side can add cost on the other. Filtering a noisy stream at the Wazuh side reduces indexer load, but the AWS bill for writing and storing those logs stays the same unless you change what AWS delivers. Confirm both budgets against AWS pricing for your regions and Wazuh sizing guidance for the release you deploy.
Do not size from generic guidance. Measure a sample period that covers normal business activity and at least one known peak, then extrapolate. For each enabled stream, record bytes and object count per day from bucket metrics or AWS billing data, and the events indexed on the Wazuh side over the same window. Compare indexed size against raw size to learn how much decoding expands each stream. Apply the retention period you intend to set, then add headroom for growth in accounts, regions and traffic. Repeat the measurement after the first month, because early numbers often reflect a new environment that has not yet grown.
When you request a quote, ask the implementation partner to state these assumptions in writing: accounts, regions, enabled log types, measured daily volume per stream, retention period, polling settings and the cluster size the design depends on. Ask which items are one-time work, such as the initial sizing and build, and which recur, such as storage growth, AWS charges and capacity reviews as sources change. A quote that does not name its volume assumptions cannot be checked later. Agree on a re-measurement point, for example after the first full retention cycle, and decide who owns the response if actual volume moves outside the sized range.
Securing the IAM role and buckets that feed Wazuh AWS monitoring
These four controls decide whether Wazuh can read your AWS logs and whether anyone can alter them afterward. Each one covers a separate part of the path: the IAM role Wazuh uses, the buckets that store the logs, the identities that write and read them, and the Wazuh server that holds the credentials. Log retention follows your own policy, and you should confirm each control against your compliance requirements.
Least-privilege read access
Grant the Wazuh role read-only permissions on the object prefixes that hold each service's logs, such as the CloudTrail or GuardDuty paths, and nothing else. Avoid wildcard resource ARNs and broad list permissions across whole buckets, because they let the role read data Wazuh does not need. Check the policy with IAM policy simulation and confirm that the role cannot write, delete or change bucket settings. Ask your AWS administrator to review the policy against the access model you document for auditors.
Bucket encryption and blocked public access
Turn on default server-side encryption for every log bucket and record which key type each bucket uses. If you use a customer managed KMS key, the Wazuh role also needs permission to decrypt with that key, so add the grant to the key policy explicitly. Enable block public access at both the account and bucket level, and check that no bucket policy or object ACL allows public reads. Test the result by attempting an anonymous request from outside your account.
Separate writer and reader identities
The log sources write into the bucket under one identity, and Wazuh reads with a different one. Keep these identities apart so the monitored account cannot edit or delete its own evidence through the same role Wazuh uses. If your retention policy requires immutability, consider enabling bucket versioning and object lock, and deny delete actions to the reader. Confirm that no single principal can both write and purge the records.
Wazuh server credentials and dashboard access
Find where the aws-s3 module stores its AWS credentials on the Wazuh server, then restrict file permissions to the service account that runs it and keep keys out of shared configuration. If your deployment supports an instance role on the host, compare that option with stored keys and confirm the choice with your platform team. Limit dashboard access through SAML single sign-on or the internal user database, apply role-based permissions, and keep the number of administrator accounts small.
Proving each AWS log source reaches the Wazuh indexer
Each AWS log source should pass its own end-to-end test before the team treats it as collected. A module that starts without errors or an empty bucket that receives files does not prove that events reach the Wazuh indexer. The test follows one known event through five checkpoints: the event is generated in AWS, the object lands in the expected prefix of the bucket, the Wazuh server reads it through the aws-s3 module, the decoded event appears in the indexer and dashboard with the expected fields, and a test alert fires for a rule the team chose.
Design the trigger for each source so it is harmless and easy to find. For CloudTrail, a tagged change to a disposable test resource, made by a known IAM role, gives a unique identifier to search for. For GuardDuty, confirm whether the service offers sample findings in your account and which findings type you will use. VPC flow logs and AWS Config deliver on their own schedules, so confirm the expected delivery interval for each service in its AWS documentation and build the wait into the test plan. Record the trigger time, the account, the Region, the expected object key and the fields you expect to see in a test sheet before you start.
The alert checkpoint should use a rule the team already intends to act on, such as a sign-in by the root user or a change to an IAM policy, so the test also checks the path a real detection would take. Confirm the rule ID, the alert level and where the alert appears in the dashboard. When the event is in the indexer but a field is missing or has the wrong value, the cause is usually in decoding or field mapping rather than in the bucket or IAM permissions. Note that discrepancy in the test record and fix it before you move to the next source.
Store each test result as dated evidence. Keep the test sheet, the exported query results or screenshots, the test identifiers, the Wazuh server and indexer versions, and the bucket policy and IAM role version in use. Repeat the affected tests after any IAM policy change, any bucket change such as its name, Region, encryption or lifecycle rules, any Wazuh upgrade such as moving between 4.14 patch releases, and any change to a log source setting. Evidence from these runs helps your internal reviewers and external auditors see how collection was checked, though the auditors decide what evidence is sufficient for an assessment.
Common failures in Wazuh AWS monitoring and where to look
This table lists the failures teams most often meet when the aws-s3 module reads AWS logs into Wazuh, with the likely cause and the first check for each. Read it from left to right: the symptom is what you see, and the last column is where to look first. Confirm every fix against the current Wazuh server logs and the AWS service documentation for the services you have enabled before you change production settings.
| Symptom | Likely cause | Fix or check |
|---|---|---|
| No objects read | IAM policy does not grant read on the bucket, or the configured prefix does not match the log key layout | Compare the bucket and prefix in the module configuration with the object keys in S3. Confirm the policy covers both the bucket and its objects. |
| Access denied errors | Missing list or get permission for the bucket, or the module points at a bucket in a different region | Find the denied action in the Wazuh server log. Add the missing permission and confirm the region setting matches the bucket. |
| Events arrive but are not decoded | Decoder or rule files do not match the aws-s3 module version on the Wazuh server | Confirm the module and ruleset versions match the installed Wazuh server release. Test a sample log line with the log test tooling in the Wazuh documentation. |
| Duplicate events | The same objects are read twice, for example through overlapping prefixes or two module instances reading one bucket | List every configured bucket and prefix and look for overlap. Confirm that only one instance reads each prefix and review how the module tracks processed objects. |
| Delayed events | The polling interval on the server adds to the delay AWS takes to deliver log objects to the bucket | Compare the event time with the time it appears in the indexer. Check the polling setting, then review the delivery timing in the AWS documentation for each service. |
| Indexer disk growth | High-volume sources such as VPC flow logs ingested without filtering or retention limits | Estimate volume from a sample period in your own account. Enable only the services you need first, and set retention and lifecycle policies on the indexer. |
What buyers ask about Wazuh AWS security monitoring cost and effort
How much does Wazuh AWS security monitoring cost to set up?
The Wazuh software has no license fee because it is open source under the GNU General Public License version 2. Your cost comes from three places: AWS usage for the services you enable and the S3 storage and requests that hold the logs, the infrastructure that runs the Wazuh server, indexer and dashboard, and the people time to design, configure and test the collection. AWS charges depend on your volumes and the services you turn on, so model them with your own account data. One-time work covers design, IAM setup, bucket layout and testing. Recurring costs are AWS usage, hosting and upgrade effort. Ask any partner for a quote built on a written scope.
How long does it take to connect AWS logs to Wazuh?
The duration depends on the drivers below, so there is no fixed timeline to quote from. The main factors are the number of AWS accounts and regions, the log types you collect (such as CloudTrail, GuardDuty, VPC flow logs and Config), and whether your existing SIEM has rules to port, tune or retire. Sizing work also takes time, because ingestion volume determines the host capacity and the retention plan. Each additional account adds IAM roles, bucket paths and test cases. A short discovery that inventories accounts, services and volumes gives you the most reliable basis for a schedule.
What must our team provide for an AWS monitoring project?
Your team needs to provide four things. First, AWS administrator access, or an administrator who can act for the project, to create IAM roles and policies, create or select S3 buckets and enable log delivery for each service. Second, access to the Wazuh hosts so the aws-s3 module can be installed and configured. Third, a named log owner for each source who confirms what is logged, where it lands and who needs the alerts. Fourth, a test plan that defines the events to generate, the expected alerts and the acceptance checks. Change windows and approval routes should also be agreed before work starts.
Can our own engineers set up Wazuh AWS monitoring without a partner?
Yes, if your engineers already have working knowledge of AWS IAM, S3 and the logging services, and have installed and operated Wazuh. The Wazuh documentation is the reference for the aws-s3 module, and the work follows a clear sequence: IAM, bucket layout, service enablement, module configuration and testing. The areas that usually need the most care are least-privilege IAM policies, a bucket layout that keeps accounts and services separate, avoiding duplicate ingestion, and tuning rules so alerts are useful. Consider a partner when the timeline is tight, when skills are missing or when you want an independent review of the design.
When is Wazuh Cloud worth comparing with self-hosting?
Compare Wazuh Cloud when you would rather the vendor operate the platform than your own team. Wazuh Cloud is the vendor's managed, cloud-delivered XDR and SIEM service. It offers a 14-day free trial that needs no credit card, and its paid plans come in Small, Medium, Large and Custom tiers, with every paid plan including at least Standard support. Compare the two options on operational ownership, where your data is stored, how much customization you need, and the cost model. Self-hosting has no license fee but carries infrastructure and staff time. Cloud is a subscription. Confirm that the managed service fits your AWS account layout and your data requirements before you decide.
What should a quote for AWS security monitoring include?
A quote should follow from a written scope. The scope should list each AWS account with its purpose, the regions in use, and the log sources to collect, such as CloudTrail, GuardDuty, VPC flow logs and Config. It should give estimated log volumes per source, the existing SIEM and alerting integrations involved, and where the Wazuh components will run. Ask the quote to state the deliverables, the acceptance tests, each party's responsibilities and the assumptions behind them. Confirm whether AWS usage charges are included or excluded, and how upgrades and ongoing support are handled. DeployOpen works on fixed scope agreed in writing before work starts.
How DeployOpen scopes and delivers Wazuh AWS monitoring
DeployOpen plans, builds, documents and supports Wazuh AWS security monitoring inside your own AWS accounts and the Wazuh environment you control. Engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts. Ongoing support, upgrades and continuous testing are available as a retainer.
How we scope
- Inventory the AWS accounts, regions and log sources you want Wazuh to collect from.
- Agree in writing which services come first, such as CloudTrail, GuardDuty and VPC flow logs.
- Document the IAM roles, bucket layout and expected ingestion volume each source will produce.
How we build
- Configure the aws-s3 module with least-privilege IAM access to each log bucket.
- Set up bucket layout and prefixes so each service's logs are parsed and indexed consistently.
- Test alert and decoder behavior against sample log events before enabling each source in production.
How we hand over
- Deliver configuration files, IAM policy definitions and bucket layout documentation for your team.
- Provide a runbook covering onboarding of new AWS accounts, log sources and ingestion checks.
- Walk your operators through the dashboards, alert review and troubleshooting steps for the collector.
How we support
- Offer a retainer for ongoing support, Wazuh upgrades and continuous review of collection health.
- Review ingestion volume and storage growth with your team as new services are enabled.
- Confirm with your team which support scope, response expectations and upgrade cadence the retainer covers.

