I tried out the new ALB feature: logging integrated with CloudWatch Logs
This page has been translated by machine translation. View original
Introduction
On July 23, 2026, ALB access logs, connection logs, and health check logs — which previously could only be delivered to S3 buckets — became deliverable directly to CloudWatch Logs log groups via the Vended Logs API.
| Item | S3 Legacy | CloudWatch Logs (Vended Logs) |
|---|---|---|
| Destination | S3 bucket | CloudWatch Logs log group |
| Configuration | Attributes tab / modify-load-balancer-attributes | Integrations tab / Vended Logs API |
| Format | Fixed space-delimited | JSON / plain (tab / space / comma) |
| Field selection | Not available (all fields fixed) | Not available (all fields fixed) |
| Delivery delay | 5 min/file | Best effort |
| Delivery cost | Free | Vended Logs pricing ($0.50/GB–$0.05/GB)※ |
| Storage cost | S3 storage fees | CWL storage fees |
※ Tokyo region, pricing as of July 2026
Verification Details
Test Environment
| Item | Value |
|---|---|
| Region | ap-northeast-1 (Tokyo) |
| ALB | alb-cwlogs-test (internet-facing) |
| Listener | HTTP 80 → fixed-response 200 |
| AWS CLI | 2.36.7 |
Delivery Configuration
The delivery configuration consists of the following 3 steps.
put-delivery-source— Register the ALB as the log delivery sourceput-delivery-destination— Register the CloudWatch Logs log group as the delivery destinationcreate-delivery— Link the source and destination, specify the format, and create the delivery
The supported log types are the following 3 types.
ALB_ACCESS_LOGSALB_CONNECTION_LOGSALB_HEALTH_CHECK_LOGS
The output format and delimiter options are summarized in the table below.
| Format | Delimiter | Notes |
|---|---|---|
| json | - | JSON format |
| plain | \t (tab) |
Plain text |
| plain | (space) |
Legacy compatible |
| plain | , (comma) |
CSV |
Field selection is not available, and all fields are output: 34 fields for Access Logs, 15 fields for Connection Logs, and 10 fields for Health Check Logs.
Access Logs field list (34 fields)
- type
- time
- elb
- client_port
- target_port
- request_processing_time
- target_processing_time
- response_processing_time
- elb_status_code
- target_status_code
- received_bytes
- sent_bytes
- request_line
- user_agent
- ssl_cipher
- ssl_protocol
- target_group_arn
- trace_id
- domain_name
- chosen_cert_arn
- matched_rule_priority
- request_creation_time
- actions_executed
- redirect_url
- error_reason
- target_port_list
- target_status_code_list
- classification
- classification_reason
- conn_trace_id
- transformed_host
- transformed_uri
- request_transform_status
- ip_address
In the console, the new feature is configured from the Integrations tab.

The traditional S3 delivery (legacy) can still be configured from the Attributes tab and remains available.

Multiple deliveries can be created in parallel from the same delivery source, with different formats and different log groups. In this verification, we confirmed that the following 3 deliveries operated simultaneously.
| # | Log Group | Format | delimiter |
|---|---|---|---|
| 1 | /aws/alb/alb-cwlogs-test/access | JSON | - |
| 2 | /aws/alb/alb-cwlogs-test/access-csv | plain | , (CSV) |
| 3 | /aws/alb/alb-cwlogs-test/access-legacy | plain | (space) |
Log Verification
We queried the access logs delivered in JSON format using CloudWatch Logs Insights.
fields @timestamp, type, elb_status_code, client_port, request_line, user_agent, actions_executed, conn_trace_id, ip_address
| sort @timestamp desc
| limit 10
We confirmed that all 6 requests sent during the verification were delivered. In JSON format, CloudWatch Logs Insights automatically parses the fields, allowing direct reference to fields such as type and elb_status_code.
Access log output example in JSON format
{
"type": "http",
"time": "2026-07-24T02:43:09.548878Z",
"elb": "app/alb-cwlogs-test/xxxxxxxxxxxxxxxx",
"client_port": "203.0.113.1:4979",
"target_port": "-",
"request_processing_time": "-1",
"target_processing_time": "-1",
"response_processing_time": "-1",
"elb_status_code": "200",
"target_status_code": "-",
"received_bytes": "128",
"sent_bytes": "197",
"request_line": "GET http://alb-cwlogs-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com:80/path5 HTTP/1.1",
"user_agent": "curl/8.18.0",
"ssl_cipher": "-",
"ssl_protocol": "-",
"target_group_arn": "-",
"trace_id": "Root=1-6a62d13d-447a49680bbf5e3336d518b3",
"domain_name": "-",
"chosen_cert_arn": "-",
"matched_rule_priority": "0",
"request_creation_time": "2026-07-24T02:43:09.548000Z",
"actions_executed": "fixed-response",
"redirect_url": "-",
"error_reason": "-",
"target_port_list": "-",
"target_status_code_list": "-",
"classification": "-",
"classification_reason": "-",
"conn_trace_id": "TID_ea38a7ed01f3f64b9375d9926c5f7020",
"transformed_host": "-",
"transformed_uri": "-",
"request_transform_status": "-",
"ip_address": "203.0.113.2"
}
Format Comparison
We output the same request in 3 formats and compared the data size. Note that in plain format, fields are not automatically parsed, and Logs Insights treats them as a single line of text under @message. Manual parsing is possible using the parse command.
CSV format (comma-delimited) output example:
http,2026-07-24T02:48:03.663959Z,app/alb-cwlogs-test/xxxxxxxxxxxxxxxx,203.0.113.1:4985,-,-1,-1,-1,200,-,132,197,"GET http://alb-cwlogs-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com:80/csv-test5 HTTP/1.1","curl/8.18.0",-,-,-,"Root=1-6a62d263-2f7e4aff1e45ff8f0ecb663e","-","-",0,2026-07-24T02:48:03.663000Z,"fixed-response","-","-","-","-","-","-",TID_7e837b9425ba30419301a6a9ba62062f,"-","-","-",203.0.113.3
Legacy compatible format (space-delimited) output example:
http 2026-07-24T02:48:03.663959Z app/alb-cwlogs-test/xxxxxxxxxxxxxxxx 203.0.113.1:4985 - -1 -1 -1 200 - 132 197 "GET http://alb-cwlogs-test-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com:80/csv-test5 HTTP/1.1" "curl/8.18.0" - - - "Root=1-6a62d263-2f7e4aff1e45ff8f0ecb663e" "-" "-" 0 2026-07-24T02:48:03.663000Z "fixed-response" "-" "-" "-" "-" "-" "-" TID_7e837b9425ba30419301a6a9ba62062f "-" "-" "-" 203.0.113.3
Size comparison for 5 records of the same request:
| Format | Total bytes | Average bytes/record | vs JSON |
|---|---|---|---|
| JSON | 5,203 bytes | 1,041 bytes | 100% |
| CSV (plain, comma) | 2,058 bytes | 412 bytes | 39.6% |
| Legacy (plain, space) | 2,058 bytes | 412 bytes | 39.6% |
CSV and legacy compatible formats are the same size since both use a single-character delimiter. JSON is approximately 2.53 times larger than plain format due to key name overhead. On the other hand, JSON format offers superior query convenience because Logs Insights automatically parses the fields.
Delivery Time Lag
To check how quickly logs arrive, we examined the difference between @timestamp and @ingestionTime. The delivery delay was approximately 2–3 minutes, slightly faster than the S3 legacy 5 minutes/file.
※ @timestamp is automatically mapped from the time field in JSON; @ingestionTime is the ingestion time into CloudWatch Logs
| Request time (time) | Ingestion time (@ingestionTime) | Lag |
|---|---|---|
| 02:43:09 | 02:45:06 | ~2 min |
| 02:48:03 | 02:50:05 | ~2 min |
| 02:51:51 | 02:55:06 | ~3 min |
| 02:53:00 | 02:55:06 | ~2 min |
Pricing
Delivery charges follow the Vended Logs pricing structure. Unit prices for the Tokyo region as of July 2026 are as follows:
| Tier | Price |
|---|---|
| First 10TB/month | $0.50/GB |
| Next 20TB/month | $0.25/GB |
| Next 20TB/month | $0.10/GB |
| Over 50TB/month | $0.05/GB |
On the other hand, traditional S3 legacy logs are free to deliver, with only S3 storage fees incurred.
Since plain format uses approximately 40% of the data volume of JSON, plain format is advantageous when looking to reduce Vended Logs charges.
A real cost comparison including combination with S3 Parquet conversion and long-term retention is planned for a follow-up verification.
Summary
ALB access logs, connection logs, and health check logs can now be delivered directly to CloudWatch Logs. The Vended Logs API starts delivery simply by specifying the ALB ARN, making it easy to add logging to managed ALBs such as those in Amazon ECS Express Mode or Elastic Beanstalk environments. A follow-up is planned to dive deeper into costs including S3 Parquet conversion and comparisons with legacy configuration.
Reference Links
