This article examines the cost impact when delivering ALB logs to S3 using the CloudWatch Logs integration.
Note that in this article, the conventional S3 output configured via ALB attributes (such as access_logs.s3.*) is referred to as the "legacy configuration."
Verification Details
This time, we targeted ALB health check logs. We chose these because they are less affected by actual access traffic and output logs at regular intervals, making it easier to compare file sizes and output counts across formats.
We delivered the same health check logs in parallel to S3 in three formats — JSON, plain, and Parquet — and verified the file sizes and cost impact of S3 delivery via the CloudWatch Logs integration.
Verification Environment
Item
Value
Region
ap-northeast-1
Load Balancer
1 Application Load Balancer (<ALB_NAME>)
Target Log Type
ALB_HEALTH_CHECK_LOGS
Number of Log Fields
10
Health Check Interval
30 seconds
Log File Output Interval
5 minutes (per ALB node)
Output Formats
JSON / plain (space-delimited) / Parquet
Measurement Period
2026-07-22 to 2026-07-27 (S3 delivery configuration implemented on 07-24)
In this comparison, to avoid the impact of differences in destination, all three formats were delivered to the same S3 bucket <LOG_BUCKET>, with only the prefix differing per format.
All size and cost figures that follow are based solely on health check logs.
Comparison by Format
File Size
We extracted one set of files containing 10 records output from the same timestamp and the same ALB node for comparison.
Format
File Size
Per-Record Equivalent
Ratio to plain (%)
plain (gz)
283 B
28.3 B
100%
JSON (gz)
393 B
39.3 B
139%
Parquet (internal GZIP)
4,042 B
404.2 B
1,429%
The "per-record equivalent" is a reference value obtained by dividing the compressed file size by 10 records. Compression efficiency varies with the number of records, so it does not scale proportionally when the record count increases.
plain (space-delimited)
The plain format, like the legacy configuration, lists values separated by spaces.
The ratio changes with differing field counts (in the previous article's access log measurements, JSON was 2.53 times the size of plain).
Since JSON pairs keys with values, it can be handled without relying on positional values as in plain format. If you anticipate field additions, JSON is easier to work with.
Parquet
Reading a Parquet file with pyarrow allowed us to check the proportion of metadata.
rows=10, row_groups=1, columns=10
Compression format is GZIP
Row group data section is 1,070 B
Footer and schema metadata is approximately 2,972 B (approximately 73% of the entire file)
For output at 5-minute intervals with 10 records as in this case, Parquet is not suitable. Metadata accounts for approximately 73% of the total, and the large file size was more prominent than the advantages of columnar format compression and scan range narrowing. In addition, the official announcement states that Parquet conversion incurs a separate charge, with the official blog showing a unit price for Northern Virginia of $0.035/GB. There is no reason to choose this format at this scale for S3 storage, even in the Tokyo region.
While outside the scope of this verification, if you want to accumulate data in Parquet, another approach is to batch-convert logs delivered in JSON or plain format using Athena CTAS or Glue ETL. Since you can increase the number of records per file, this keeps the metadata ratio lower than saving small files directly as Parquet.
Actual Cost Measurement
We checked daily usage by usage type for ap-northeast-1 in Cost Explorer. We compare 2026-07-22 and 07-23 (before configuration) with 2026-07-25 (the day after configuration).
Date
S3 Recording
APN1-VendedLog-Bytes Usage (MB equivalent)
2026-07-22
None
10.57
2026-07-23
None
10.75
2026-07-25
Yes
10.73
We converted APN1-VendedLog-Bytes from Cost Explorer to MB units for comparison. Even after configuring the CloudWatch Logs integration, this usage type remained within the 10.57–10.75 MB range observed before configuration.
Note that the approximately 10 MB being recorded even before configuration is attributable to VPC flow logs running in the same account. We set cost allocation tags on the flow log log group and confirmed that this usage type was occurring only from flow logs. No Vended Logs delivery other than the ALB logs in this verification was configured.
The official announcement states that delivering ALB logs to Amazon S3 is free of charge. Delivery to CloudWatch Logs and Amazon Data Firehose is billed as Vended Logs. The comparison results for APN1-VendedLog-Bytes this time are also consistent with this pricing model.
Configuration Procedure (Reference)
Here we summarize the configuration for delivering the same logs in parallel in multiple formats to S3 as done in this verification.
Parallel delivery in 3 formats via CLI
Create one Delivery Source, then create a Delivery Destination and Delivery for each of JSON, plain, and Parquet.
When switching formats in production, use separate S3 buckets per format if possible to avoid mixing with existing logs. If using the same bucket, at minimum separate the prefixes.
First, create the Delivery Source from which logs originate.
In this verification, to simplify testing, both statements use only aws:SourceAccount as the condition and do not specify aws:SourceArn. In production, we recommend also specifying aws:SourceArn to restrict the delivery source.
Reasons to Migrate from the Legacy Configuration to CloudWatch Logs Integration
As mentioned above, when delivering ALB logs to S3 via the CloudWatch Logs integration, no Vended Logs delivery charges apply. S3 storage fees and request fees continue to apply as before. Note that when delivering in parallel in multiple formats as in this verification, the number of PutObject requests increases proportionally with the number of formats.
Log delivery definitions can be separated from ALB attributes. In this verification as well, all ALB log-related attributes remained disabled, yet logs could be delivered to S3 through the Delivery defined on the CloudWatch Logs side.
Even in a configuration that prioritizes cost and restricts log storage to S3, the new method allows you to add delivery to a CloudWatch Logs log group as needed. Since you can use Logs Insights for searching and near-real-time review, this is useful during events or incident investigations.
Adding delivery to a log group incurs CloudWatch Logs charges. You can also keep logs stored only in S3 at all times and add log group delivery only before an event or during an incident reproduction period. Please consider this as needed.
Summary
For new builds storing ALB logs to S3, we consider CloudWatch Logs integration to be the first choice. Delivering to S3 incurs no Vended Logs delivery charges, you can choose the output format, and when needed, you can add delivery to a log group to investigate with Logs Insights.
For format, plain is preferable if storage size is the priority, while JSON is easier to handle if you anticipate field additions or programmatic processing.
For environments already using the legacy configuration, we recommend reviewing it when you have a maintenance window for your log analysis environment. Configure new log delivery to a separate output destination while keeping the legacy configuration enabled. Once you have verified the operation of your log analysis and log processing pipelines, you can safely switch by disabling the legacy configuration.