継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

DuckDB で ALB のアクセスログにクエリしてみる

タダです.

前回 DuckDB で CloudTrail ログを分析してみました.今回は ALB のアクセスログを分析してみます.

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

ALB アクセスログのテーブルを作る

こちらの記事を参照させていただいてテーブルを作ってみました.

CREATE TABLE alb_log AS
SELECT *
FROM read_csv(
    '[ログファイルパス]',
    columns={
        'type': 'VARCHAR',
        'timestamp': 'TIMESTAMP',
        'elb': 'VARCHAR',
        'client_ip_port': 'VARCHAR',
        'target_ip_port': 'VARCHAR',
        'request_processing_time': 'DOUBLE',
        'target_processing_time': 'DOUBLE',
        'response_processing_time': 'DOUBLE',
        'elb_status_code': 'INTEGER',
        'target_status_code': 'VARCHAR',
        'received_bytes': 'BIGINT',
        'sent_bytes': 'BIGINT',
        'request': 'VARCHAR',
        'user_agent': 'VARCHAR',
        'ssl_cipher': 'VARCHAR',
        'ssl_protocol': 'VARCHAR',
        'target_group_arn': 'VARCHAR',
        'trace_id': 'VARCHAR',
        'domain_name': 'VARCHAR',
        'chosen_cert_arn': 'VARCHAR',
        'matched_rule_priority': 'VARCHAR',
        'request_creation_time': 'TIMESTAMP',
        'actions_executed': 'VARCHAR',
        'redirect_url': 'VARCHAR',
        'error_reason': 'VARCHAR',
        'target_port_list': 'VARCHAR',
        'target_status_code_list': 'VARCHAR',
        'classification': 'VARCHAR',
        'classification_reason': 'VARCHAR',
        'conn_trace_id': 'VARCHAR'
    },
    delim=' ',
    quote='"',
    escape='"',
    header=False,
    auto_detect=False
);
D show tables;
┌─────────┐
│  name   │
│ varchar │
├─────────┤
│ alb_log │
└─────────┘

参考記事

swfz.hatenablog.com

ALB アクセスログの分析クエリを実行する

AWSドキュメントを参考にクエリをいくつか実行してみます.

クライアント IP アドレス別にグループ分けした HTTP リクエストの数を集計

D SELECT COUNT(request) AS
   count,
   request,
   SPLIT_PART(client_ip_port, ':', 1) as client_ip
  FROM alb_log
  GROUP BY request, client_ip
  ;
┌───────┬──────────────────────────────────────────┬───────────────┐
│ count │                 request                  │   client_ip   │
│ int64 │                 varcharvarchar    │
├───────┼──────────────────────────────────────────┼───────────────┤
│     2 │ GET https://12.34.56.78:443/ HTTP/1.1123.45.657.89 │
│     1 │ GET https://12.34.56.78:443/xxx HTTP/1.145.657.89.110 │
└───────┴──────────────────────────────────────────┴───────────────┘

ELB ステータスコードの値が200以外のリクエストを抽出

SELECT
      type,
      timestamp,
      client_ip_port,
      elb_status_code,
      target_status_code,
      request,
      error_reason
  FROM
      alb_log
  WHERE
      elb_status_code != 200;
┌─────────┬────────────────────────────┬─────────────────────┬─────────────────┬────────────────────┬──────────────────────────────────────────┬──────────────┐
│  typetimestamp          │   client_ip_port    │ elb_status_code │ target_status_code │                 request                  │ error_reason │
│ varchartimestampvarchar       │      int32      │      varcharvarcharvarchar    │
├─────────┼────────────────────────────┼─────────────────────┼─────────────────┼────────────────────┼──────────────────────────────────────────┼──────────────┤
│ https   │ 2024-12-22 00:35:22.50771123.45.657.89:12345403 │ -                  │ GET https://12.34.56.78:443/ HTTP/1.1     │ -            │
│ https   │ 2024-12-22 00:35:33.942067123.45.657.89:53456403 │ -                  │ GET https://12.34.56.78:443/ HTTP/1.1     │ -            │
│ https   │ 2024-12-22 00:36:08.71726845.657.89.110:32134403 │ -                  │ GET https://12.34.56.78:443/xxx HTTP/1.1 │ -            │
└─────────┴────────────────────────────┴─────────────────────┴─────────────────┴────────────────────┴──────────────────────────────────────────┴──────────────┘

まとめ

DuckDB で ALB のアクセスログを分析するのを試してみました.