🐕

[AWS]Application Load BalancerのログがAthenaでクエリできなくなった

2024/10/21に公開

事象

おおよそ2024年6月以降のデータがクエリできなくなっていた。

原因

ALBのアクセスログに「conn_trace_id」というフィールドが追加されたため、input.regex で指定した正規表現と乖離が発生したため。

所感

追加されたのは知っていたが、影響範囲は把握できていなかった。

対処方法

公式ドキュメントに記載のALBアクセスログ用テーブル作成クエリを参考にする。
正規表現でハマるのが嫌なので、テーブル削除して新しいテーブルを作成した。

DROP TABLE IF EXISTS alb_logs;

下記実際のコード(一部改変)

Code
CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code int,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string,
            conn_trace_id string
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' = 
        '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\\s]+?)\" \"([^\\s]+)\" \"([^ ]*)\" \"([^ ]*)\" ?([^ ]*)?( .*)?'
            )
            LOCATION 's3://amzn-s3-demo-bucket/access-log-folder-path/'

これで出力できなかった5月、6月以降のアクセスログをAthenaでクエリ可能となった。

参考

https://dev.classmethod.jp/articles/alb-accesslog-traceabilityid/
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/create-alb-access-logs-table.html

Discussion