Amazon Athena で Application Load Balancer のアクセスログを分析する方法を教えてください。

所要時間4分
0

Amazon Athena で Application Load Balancer のアクセスログを分析したい。

Amazon Athena で Application Load Balancer のアクセスログを分析したい。

簡単な説明

Elastic Load Balancing では、デフォルトでアクセスログはアクティブではありません。アクセスログを有効にするには、Amazon Simple Storage Service (Amazon S3) バケットを指定します。すべての Application Load Balancer と Classic Load Balancer のアクセスログは Amazon S3 バケットに保存されます。ロードバランサーのパフォーマンスをトラブルシューティングまたは分析するには、Athena で Amazon S3 のアクセスログを分析します。

注: Athena では、Application Load Balancer と Classic Load Balancer のアクセスログを分析することができますが、この解決方法は Application Load Balancer にのみ適用されます。

解決方法

Application Load Balancer ログのデータベースとテーブルを作成する

Athena でアクセスログを分析するには、以下の手順でデータベースとテーブルを作成します。

1.    Athena コンソールを開きます。

2.    クエリエディタで次のコマンドを実行して、データベースを作成します。S3 バケットと同じ AWS リージョンにデータベースを作成するのがベストプラクティスです。

create database alb_db

3.    ステップ 2 で作成したデータベースで、Application Load Balancer ログ用の alb_logs テーブルを作成します。詳細については、「Application Load Balancer ログのテーブルの作成」を参照してください。

注: クエリのパフォーマンスを向上させるため、パーティションプロジェクションを使用してテーブルを作成できます。パーティションプロジェクションでは、Athena は AWS Glue データカタログなどのリポジトリから読み込むのではなく、設定からパーティション値とロケーションを計算します。詳細については、「Amazon Athena のパーティションプロジェクション」を参照してください。

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
            )
            PARTITIONED BY
            (
             day 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://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2022/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//${day}"
            )

注: 用途に応じて、テーブル名と S3 ロケーションを置き換えてください。

または、以下のクエリを使用して、パーティションを含むテーブルを作成します。

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs_partitioned (
            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 string,
            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
            )
            PARTITIONED BY(day 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://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/'

次に、ALTER TABLE ADD PARTITION コマンドを使用してパーティションをロードします。

ALTER TABLE alb_logs_partitioned ADD
  PARTITION (day = '2022/05/21')
  LOCATION's3://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/2022/05/21/'

注: Application Load Balancer のログに AWS Glue クローラーを使用するのはベストプラクティスではありません。

4.    ナビゲーションペインの [Tables] (テーブル) で、メニューから [Preview table] (テーブルをプレビュー) を選択します。Application Load Balancer のアクセスログのデータが、[Results] (結果) ウィンドウに表示されます。

5.    クエリエディタを使用して、テーブルで SQL ステートメントを実行します。クエリの保存、以前のクエリの表示、クエリ結果の .csv ファイル形式でのダウンロードができます。

クエリの例

次の例では、クエリに合わせてテーブル名、列値、その他の変数を必ず変更してください。

最初の 100 件のアクセスログエントリを時系列で表示する

分析とトラブルシューティングには、次のクエリを使用します。

SELECT *  
FROM alb_logs  
ORDER by time ASC  
LIMIT 100

Application Load Balancer にアクセスしたすべてのクライアント IP アドレスと、Application Load Balancer にアクセスした回数を一覧表示する

分析とトラブルシューティングには、次のクエリを使用します。

SELECT distinct client_ip, count() as count from alb_logs  
GROUP by client_ip  
ORDER by count() DESC;

Application Load Balancer をリクエストペアまたはレスポンスペアで経由するデータの平均量 (キロバイト単位) を一覧表示する

分析とトラブルシューティングには、次のクエリを使用します。

SELECT (avg(sent_bytes)/1000.0 + avg(received_bytes)/1000.0)  
as prewarm_kilobytes from alb_logs;

Application Load Balancer がトラフィックをルーティングするすべてのターゲットと、ターゲットごとにルーティングされるリクエストの数をパーセンテージ分布別に一覧表示する

ターゲットトラフィックの潜在的な不均衡を特定するには、次のクエリを使用します。

SELECT target_ip, (Count(target_ip)* 100.0 / (Select Count(*) From alb_logs))  
as backend_traffic_percentage  
FROM alb_logs  
GROUP by target_ip<  
ORDER By count() DESC;

クライアントが Application Load Balancer にリクエストを送信し、アイドルタイムアウトが経過する前に接続を閉じた (HTTP 460 エラー) 回数を一覧表示する

HTTP 460 エラーのトラブルシューティングを行うには、次のクエリを使用します。

SELECT * from alb_logs where elb_status_code = '460';

リスナールールがリクエストを空のターゲットグループに転送したために、クライアントリクエストがルーティングされなかった (HTTP 503 エラー) 回数を一覧表示する

HTTP 503 エラーのトラブルシューティングを行うには、次のクエリを使用します。

SELECT * from alb_logs where elb_status_code = '503';

各クライアントが指定した URL にアクセスした回数別にクライアントを降順で一覧表示する

トラフィックパターンを分析するには、次のクエリを使用します。

SELECT client_ip, elb, request_url, count(*) as count from alb_logs  
GROUP by client_ip, elb, request_url  
ORDER by count DESC;

Firefox ユーザーが最も頻繁にアクセスした 10 個の URL を降順で一覧表示する

トラフィックの分布とパターンを分析するには、次のクエリを使用します。

SELECT request_url, user_agent, count(*) as count  
FROM alb_logs  
WHERE user_agent LIKE '%Firefox%'  
GROUP by request_url, user_agent  
ORDER by count(*) DESC  
LIMIT 10;

各クライアントがリクエストで Application Load Balancer に送信したデータ量 (MB 単位) に基づいて、クライアントを降順に表示します。

トラフィックの分布とパターンを分析するには、次のクエリを使用します。

SELECT client_ip, sum(received_bytes/1000000.0) as client_datareceived_megabytes  
FROM alb_logs  
GROUP by client_ip  
ORDER by client_datareceived_megabytes DESC;

対象処理時間が 5 秒を超える場合、指定された日付範囲内の各時刻を一覧表示する

指定した時間枠のレイテンシーをトラブルシューティングするには、次のクエリを使用します。

SELECT * from alb_logs  
WHERE (parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')  
    BETWEEN parse_datetime('2018-08-08-00:00:00','yyyy-MM-dd-HH:mm:ss')  
    AND parse_datetime('2018-08-08-02:00:00','yyyy-MM-dd-HH:mm:ss'))  
AND (target_processing_time >= 5.0);

ロードバランサーが受信した HTTP GET リクエストの数を、クライアント IP アドレスでグループ化してカウントする

受信トラフィックの分布を分析するには、次のクエリを使用します。

SELECT COUNT(request_verb)   
AS count, request_verb, client_ip   
FROM alb_logs_partitioned   
WHERE day = '2022/05/21'   
GROUP by request_verb, client_ip;
AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ