AWS CloudTrail Delivery Delays: Reading the DELIVERY_DELAY Indicator Before You Assume Logs Are Lost
Reach 50,000+ security professionals
Sponsor a newsletter slot and put your brand in front of CISOs, engineers, and IT decision-makers.
A CloudTrail event gap during a security incident forces a hard choice: wait for logs to arrive before proceeding, or accept that some actions may be missing from the timeline. The right choice depends on whether the gap is a delivery delay (events will arrive), a misconfiguration (events are being delivered somewhere wrong), or genuine suppression (events were never generated). Most gaps that look like data loss are delivery delays, and the DELIVERY_DELAY status indicator confirms this within seconds of checking. For broader cloud log coverage gaps affecting multiple sources beyond CloudTrail, see this cloud log coverage audit guide.
Understanding CloudTrail Delivery Architecture and Normal Latency
CloudTrail captures API events and delivers them to an S3 bucket (and optionally CloudWatch Logs) on a batch schedule. CloudTrail does not deliver events in real time -- it aggregates events within a region and writes log files every few minutes. The documented delivery SLA is approximately 5-15 minutes for management events under normal conditions.
Several event types are inherently slower:
- IAM and STS events: these are global service events routed through
us-east-1regardless of where the caller was located. If your trail coversus-east-1, IAM events appear. If not, they are absent even though they were generated. - ConsoleLogin events: routed through the global authentication endpoint and can lag 10-20 minutes behind the actual login.
- Data events (S3 object-level, Lambda invocations): written separately from management events and can have higher delivery latency during high-volume periods.
A 20-minute gap in a trail that covers only us-west-2 for IAM events is not a gap -- the events never existed in that trail to begin with.
Diagnostics: What to Check Before Assuming Log Loss
Step 1: Check trail delivery status.
The fastest diagnostic is GetTrailStatus via the AWS CLI:
aws cloudtrail get-trail-status --name <trail-name> --region <region>
Key fields to read:
IsLogging: must betrue. Iffalse, the trail was manually stopped or paused.LatestDeliveryTime: the timestamp of the most recent successful delivery. If this is hours old during a time when you expected activity, delivery has stalled.LatestDeliveryError: present when the most recent delivery attempt failed. The error message tells you why.LatestDeliveryAttemptTime: the most recent delivery attempt, regardless of success. If this is recent butLatestDeliveryTimeis old, all recent delivery attempts are failing.
Step 2: Check for delivery errors.
Common delivery errors:
S3.BucketDoesNotExist: the destination bucket was deleted or renamedS3.InsufficientS3BucketPolicy: the bucket policy was modified and no longer allows CloudTrail to writeInsufficientEncryptionPolicyException: the KMS key policy was modified and CloudTrail can no longer use itInsufficientSnsTopicPolicyException: the SNS notification topic policy no longer permits CloudTrail to publish
Each of these produces a delivery error in GetTrailStatus and prevents ALL events from being delivered until fixed.
Step 3: Verify the trail covers the right regions.
Check whether the trail is multi-region:
aws cloudtrail describe-trails
Look at IsMultiRegionTrail. A single-region trail only captures events from its home region. IAM events only appear in us-east-1. If your trail is not multi-region and not in us-east-1, IAM and STS events are absent by design, not by failure.
Step 4: Check S3 delivery directly.
For events in the gap window, check the S3 bucket directly:
aws s3 ls s3://<bucket>/AWSLogs/<account-id>/CloudTrail/<region>/<year>/<month>/<day>/ --recursive | sort
If log files exist for the gap window and your SIEM simply hasn't ingested them yet, the logs are present and the issue is SIEM-side, not CloudTrail-side.
Briefings like this, every morning before 9am.
Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.
Fixing Common Delivery Failures
Fix: Trail stopped (IsLogging: false).
Restart logging:
aws cloudtrail start-logging --name <trail-name>
Note that events that were generated while the trail was stopped are not retroactively captured. CloudTrail only logs events going forward from when logging is re-enabled.
Fix: Bucket policy rejected delivery.
CloudTrail requires specific bucket policy conditions. The policy must allow cloudtrail.amazonaws.com to PutObject to the specific key prefix pattern. The easiest fix is to use the AWS Console to re-run the trail creation wizard against the existing bucket -- it will offer to update the bucket policy automatically. Alternatively, re-attach the standard CloudTrail bucket policy from the documentation.
Fix: KMS key policy change blocking delivery.
If the trail encrypts log files with a KMS key and the key policy was modified to remove CloudTrail's GenerateDataKey permission, delivery fails with InsufficientEncryptionPolicyException. Re-add the following to the KMS key policy:
{
"Sid": "Allow CloudTrail to encrypt logs",
"Effect": "Allow",
"Principal": {"Service": "cloudtrail.amazonaws.com"},
"Action": ["kms:GenerateDataKey*", "kms:DescribeKey"],
"Resource": "*"
}
Fix: Organization trail with new member account.
For organization trails, new member accounts require the CloudTrail service role to have permission to write to the centralized bucket. If a new account was added to the org and its events are absent, check that the bucket policy includes arn:aws:iam::<new-account-id>:root or uses the organization-aware wildcard condition.
Validating Delivery Health After a Fix
Check GetTrailStatus again.
After applying a fix, re-run GetTrailStatus. Within a few minutes of restoring delivery permissions, LatestDeliveryTime should update to a recent timestamp and LatestDeliveryError should clear.
Generate a test event and time delivery.
Make a simple, harmless API call (e.g., aws sts get-caller-identity) and note the timestamp. Watch the S3 bucket for a new log file containing that event. The time between the API call and the appearance of the log file in S3 is your current delivery latency. This confirms delivery is working and gives you an accurate latency baseline.
Set up a CloudWatch alarm on delivery failures.
CloudTrail publishes delivery status metrics. Configure a CloudWatch alarm on LatestDeliveryError to page when any delivery failure persists for more than 15 minutes. This eliminates the scenario where delivery fails silently for hours before an incident response team notices the gap.
Known Gaps That Are Not Bugs
Global service events in a single-region trail. IAM, STS, AWS Organizations, and Route 53 events are global and only appear in trails covering us-east-1. A trail in any other region misses them by design.
Data events not enabled. CloudTrail does not log S3 object-level operations (GetObject, PutObject, DeleteObject) or Lambda function invocations unless you explicitly enable data events on the trail. Management event trails do not capture these. If your gap covers S3 or Lambda operations, check whether data events are enabled:
aws cloudtrail get-event-selectors --trail-name <trail-name>
Approximately 5-15 minutes of events at trail startup. When a trail is first created or logging is re-enabled, the first delivery batch covers events from the moment logging started, not from earlier. Events from before the trail existed cannot be retroactively captured.
Events in Athena/SIEM but not visible in CloudTrail console. The CloudTrail console's Event History shows only the last 90 days and only management events for the region you are viewing. Events older than 90 days or in other regions require querying S3 directly or via Athena.
When to Open an AWS Support Case
Open a support case when:
IsLoggingistrue, there are no delivery errors, andLatestDeliveryTimeis current, but events you know occurred are absent from both S3 and the CloudTrail Event History after 30+ minutes.- You are using an organization trail and member account events are missing despite the trail and bucket policy being correctly configured.
- Delivery error messages reference an internal AWS service rather than a customer-controllable resource (errors mentioning 'internal failure' or 'AWS service error').
For a support case, provide: the trail ARN, the specific event types and timestamps expected but not found, the GetTrailStatus output, and the GetEventSelectors output. This documentation allows support to distinguish a service-side delivery issue from a customer configuration issue within minutes.
The bottom line
Most CloudTrail event gaps are delivery delays, not log loss -- the DELIVERY_DELAY indicator and GetTrailStatus output confirm this in under a minute. When events are genuinely absent, the cause is almost always a bucket policy rejection, a stopped trail, a KMS key policy change, or a misconfigured single-region trail that never covered the event types you expected. Each is diagnosable in five steps without an AWS Support case. Confirm delivery is working by generating a test event and timing its arrival in S3 before concluding a gap represents missing evidence. For overall AWS security posture across S3 and CloudTrail together, see this AWS S3 security audit checklist.
Frequently asked questions
Why are AWS CloudTrail events delayed or missing?
CloudTrail events can be delayed or missing for several distinct reasons. Normal delivery latency is 5-15 minutes; IAM and ConsoleLogin events routinely take longer because they route through the global endpoint in us-east-1. Delivery failures happen when the destination S3 bucket policy was changed to no longer allow CloudTrail writes, when the KMS encryption key policy was modified, or when the trail was manually stopped. Events can also be absent by design: a single-region trail misses IAM events if it does not cover us-east-1, and data events (S3 object-level, Lambda) must be explicitly enabled and are off by default.
What does CloudTrail DELIVERY_DELAY mean?
DELIVERY_DELAY is a CloudTrail trail status indicator visible in the console and via the GetTrailStatus API. It means that log delivery to the destination S3 bucket is running behind schedule -- events have been captured by CloudTrail but have not yet been written to the bucket. It does not mean events are lost. The events remain queued and will be delivered once the delay clears. DELIVERY_DELAY typically resolves on its own within minutes to an hour. If it persists for more than 2-3 hours, check the LatestDeliveryError field for a specific bucket policy or KMS error that is blocking delivery.
How do I check why CloudTrail is not delivering logs to S3?
Run `aws cloudtrail get-trail-status --name <trail-name>` in the CLI and check four fields: IsLogging (must be true), LatestDeliveryError (shows the specific failure reason if present), LatestDeliveryTime (when the last successful delivery occurred), and LatestDeliveryAttemptTime (when the last attempt was made). Common delivery errors are InsufficientS3BucketPolicy (bucket policy does not allow CloudTrail writes), InsufficientEncryptionPolicyException (KMS key policy blocks CloudTrail from generating data keys), and S3.BucketDoesNotExist (the bucket was deleted or renamed). Each error message directly names the fix needed.
Why are IAM events missing from AWS CloudTrail even though the trail is enabled?
IAM is a global AWS service that generates events through the us-east-1 regional endpoint, regardless of which region the caller is operating from. A trail that covers only one region other than us-east-1 never receives IAM events because those events are only written to trails that include the us-east-1 region. To capture IAM events, enable a multi-region trail (IsMultiRegionTrail: true) or create a separate trail in us-east-1. Also verify that the trail's global service events setting is enabled: check the IncludeGlobalServiceEvents flag via the describe-trails CLI command.
How long does it take for CloudTrail events to appear?
Management events (API calls for resource creation, modification, and deletion) typically appear in the S3 delivery bucket within 5-15 minutes of the action. IAM and ConsoleLogin events frequently take 10-20 minutes due to routing through the global endpoint. Data events (S3 object-level operations, Lambda invocations) can take longer during high-volume periods. The CloudTrail Event History console view may show events faster because it queries a different data path than S3 delivery. If events appear in the console but not in S3, the S3 delivery specifically is delayed or failing, while overall event capture is working.
How do I verify that CloudTrail logs are being delivered correctly without opening an AWS Support case?
Make a test API call (such as `aws sts get-caller-identity` or `aws s3 ls`) and note the exact timestamp. Then watch the S3 delivery bucket for a new log file containing an event from that timestamp: use `aws s3 ls s3://<bucket>/AWSLogs/<account>/CloudTrail/<region>/<year>/<month>/<day>/` and sort by time. When the new file appears, download and decompress it, then search for your test event. The time between your API call and the log file appearing in S3 is your actual delivery latency. If the event appears within 20 minutes, delivery is healthy. If it does not appear after 30 minutes, check GetTrailStatus for delivery errors.
Sources & references
Free resources
Critical CVE Reference Card 2025–2026
25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.
Ransomware Incident Response Playbook
Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.
Daily briefings + Google Top Stories in one step.
Enter your email and we'll subscribe you to the daily briefing and add Decryption Digest to your Google Search feed at the same time.

Founder & Cybersecurity Evangelist, Decryption Digest
Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.
