ALBの新機能、CloudWatch Logsに統合されたログ記録を試してみた
はじめに
2026年7月23日、従来はS3バケットへの配信のみだったALBのアクセスログ・接続ログ・ヘルスチェックログを、Vended Logs APIによりCloudWatch Logsロググループへ直接配信できるようになりました。
| 項目 | S3レガシー | CloudWatch Logs (Vended Logs) |
|---|---|---|
| 配信先 | S3バケット | CloudWatch Logs ロググループ |
| 設定箇所 | Attributes タブ / modify-load-balancer-attributes | Integrations タブ / Vended Logs API |
| フォーマット | スペース区切り固定 | JSON / plain (タブ / スペース / カンマ) |
| フィールド選択 | 不可(全項目固定) | 不可(全項目固定) |
| 配信遅延 | 5分/ファイル | ベストエフォート |
| 配信課金 | 無料 | Vended Logs 料金 ($0.50/GB〜$0.05/GB)※ |
| 保存課金 | S3保存費 | CWL保存費 |
※東京リージョン、2026年7月時点の料金
検証内容
検証環境
| 項目 | 値 |
|---|---|
| リージョン | ap-northeast-1(東京) |
| ALB | alb-cwlogs-test(internet-facing) |
| リスナー | HTTP 80 → fixed-response 200 |
| AWS CLI | 2.36.7 |
配信設定
配信設定は次の3ステップです。
put-delivery-source— ALBをログの配信元として登録するput-delivery-destination— CloudWatch Logsロググループを配信先として登録するcreate-delivery— 配信元と配信先を紐付け、フォーマットを指定して配信を作成する
対応するログタイプは次の3種類です。
ALB_ACCESS_LOGSALB_CONNECTION_LOGSALB_HEALTH_CHECK_LOGS
出力フォーマットと区切り文字の選択肢を表にまとめました。
| フォーマット | 区切り文字 | 備考 |
|---|---|---|
| json | - | JSON形式 |
| plain | \t(タブ) |
プレーンテキスト |
| plain | (スペース) |
レガシー互換 |
| plain | ,(カンマ) |
CSV |
フィールドの取捨選択はできず、Access Logs 34項目・Connection Logs 15項目・Health Check Logs 10項目がすべて出力されます。
Access Logs フィールド一覧(34項目)
- 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
コンソールでは、新機能はIntegrationsタブから設定します。

従来のS3配信(レガシー)はAttributesタブから設定でき、引き続き利用可能です。

同一のdelivery sourceから、異なるフォーマット・異なるロググループへ複数のdeliveryを並行して作成できます。今回は次の3配信が同時に稼働することを確認しました。
| # | ロググループ | フォーマット | 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 | (スペース) |
ログ確認
JSON形式で配信したアクセスログを、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
検証で送信した6リクエストがすべて配信されていることを確認しました。JSON形式ではCloudWatch Logs Insightsがフィールドを自動解析するため、typeやelb_status_codeといったフィールドを直接参照できます。
JSON形式のアクセスログ出力例
{
"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"
}
フォーマット比較
同じリクエストを3フォーマットで出力して容量を比べました。なお、plain形式ではフィールドが自動解析されず、Logs Insightsでは@messageの1行テキストとして扱われます。parseコマンドで手動パースは可能です。
CSV形式(カンマ区切り)の出力例です。
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
レガシー互換形式(スペース区切り)の出力例です。
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
同一リクエスト5レコードでの容量比較です。
| フォーマット | 合計バイト数 | 平均バイト数/レコード | 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とレガシー互換は区切り文字がともに1文字のため同一サイズです。JSONはキー名のオーバーヘッドにより、plain形式の約2.53倍のサイズになります。一方で、JSON形式はLogs Insightsでフィールドが自動解析されるため、クエリの利便性に優れます。
配信タイムラグ
実際どのくらいで届くのか、@timestampと@ingestionTimeの差を見てみました。配信遅延は約2〜3分で、S3レガシーの5分/ファイルよりやや速い結果でした。
※ @timestampはJSON内のtimeフィールドから自動マッピング、@ingestionTimeはCloudWatch Logsへの取り込み時刻
| リクエスト時刻 (time) | 取り込み時刻 (@ingestionTime) | ラグ |
|---|---|---|
| 02:43:09 | 02:45:06 | 約2分 |
| 02:48:03 | 02:50:05 | 約2分 |
| 02:51:51 | 02:55:06 | 約3分 |
| 02:53:00 | 02:55:06 | 約2分 |
料金について
配信課金はVended Logsの料金体系です。東京リージョン、2026年7月時点の単価は以下のとおりです。
| ティア | 料金 |
|---|---|
| 最初の10TB/月 | $0.50/GB |
| 次の20TB/月 | $0.25/GB |
| 次の20TB/月 | $0.10/GB |
| 50TB超/月 | $0.05/GB |
一方、従来のS3レガシーログは配信自体が無料で、S3の保存費のみ発生します。
plain形式はJSONの約40%のデータ量で済むため、Vended Logsの課金を抑えたい場合はplain形式が有利です。
S3 Parquet変換との組み合わせや長期保持を含めた実コスト比較は、続編で検証予定です。
まとめ
ALBのアクセスログ・接続ログ・ヘルスチェックログをCloudWatch Logsへ直接配信できるようになりました。Vended Logs APIはALBのARNを指定するだけで配信が始まるため、Amazon ECS Express ModeやElastic Beanstalk環境など、マネージドに作成されたALBへのログ追加も簡単です。続編ではS3 Parquet変換を含むコストなど、レガシー設定との比較を深堀り予定です。
参考リンク








