【AWSのログ管理】ALBのアクセスログをAthenaを使って調査してみる

ALBアクセスログについて

ALB(Application Load Balancer)のアクセスログとは、ALBが受信したリクエストとその処理に関する情報を記録したログファイルです。これらのログには、リクエストの日時、送信元のIPアドレス、宛先のIPアドレス、リクエストのURL、レスポンスのステータスコードなど、さまざまな情報が含まれています。

これらのログは取得するだけではなく、分析することで、トラフィックのパターンやボトルネックの特定、エラーのトラブルシューティング、セキュリティ上の問題の発見などが可能になります。

今回は、ALBアクセスログをAthenaを使って分析をしてみたいと思います。
わかりやすく図にすると以下のような構成になります。

それでは設定を行っていきます。

前提

ALBがすでに作成されている、かつ、アクセスログが無効化である前提ですすめます。

ログの保存先設定(S3バケット)

S3バケットの作成と注意点
まずは、アクセスログを保存するためのS3バケットを作成します。
S3バケット作成の手順は割愛しますが、ALBと同じリージョンにバケットを作成する必要があります。

ログの有効化(ALB)

※ALBアクセスログの設定が済んでいる場合は、この作業は必要ありません。

1.AWS コンソールにログインし、EC2を選択します。

2.EC2画面の左メニューからロードバランサーを選択します。

3.有効化する対象のALBをクリックします。

4.「属性」タブを選択し、「編集」をクリックします。

5.設定画面の編集
設定画面下部にあるMonitoring欄の「アクセスログ」を有効化します。
「S3 URI」欄に先程作成したS3バケットを選択します。

設定は以上となります。「変更内容の保存」をクリックするとアクセスログが取得されるようになります。
※しばらく待つとログが指定したS3バケットに出力し始めます。

ログの形式について

ログは以下のような形で出力されます。

http 2023-05-14T05:58:44.867219Z app/AlbSt-ALBAE-1R41 ***.***.***.***:56427 172.16.3.1:80 0.001 0.010 0.000 302 302 499 336 "GET http://albst-albae-1r.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1" "Mozilla/5.0 (Macintosh) Chrome/112.0.0.0 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/AlbSta-ALBLi-RCFTa24 "Root=1-64607894-400" "-" "-" 0 2023-05-14T05:58:44.856000Z "forward" "-" "-" "172.16.3.1:80" "302" "-" "-"

ログ形式について詳細を確認したい場合は、こちらを参考にしてください。
参考:AWSドキュメント

Athenaの設定

ALBアクセスログの調査ができるように、Athenaを設定していきます。

1.AWS コンソールにログインし、Athenaを選択します。

2.「クエリエディタを起動」をクリック。

3.クエリ結果の保存設定
初めてAthenaを利用する場合、画像にあるような注意事項が表示され、クエリエディタからクエリを実行することができません。
Athenaのクエリ結果を保存するためのS3バケット設定が必要になります。

予めS3バケットの用意がある場合はそのまま「設定を編集」をクリックして設定にすすみます。
S3バケットの用意が無い場合は、S3バケットを新たに作成してから画像にある「設定を編集」にすすみます。

「設定を編集」をクリック後、いくつか入力項目があります。
「クエリ」結果の場所
にS3バケット名を指定します。
他の設定は適宜指定をしてください。後で変更することもできます。
「保存」をクリックするとクエリが実行できるようになります。

4.データベースの設定
Athena内にアクセスログを分析するためのデータベースを作成します。
データベース名はわかりやすいように「alblogs」としてます。
クエリエディタ画面に下記のコードをペーストして「実行」します。

CREATE DATABASE alblogs;

コマンドが正常に実行できれば、データベース欄のプルダウンメニューに作成したデータベース「alblogs」が表示されます。

5.テーブル作成
続いてテーブル作成をします。
テーブル作成用のコマンドはAWSドキュメントに記載のコマンドを参考にして実行します。
参考:AWSドキュメント
下部にある、「LOCATION」部分の編集が必要です。ALBアクセスログ用に作成したS3バケットを指定します。

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://<アクセスログ用のS3バケットを指定>/AWSLogs/<ACCOUNT-IDを指定>/elasticloadbalancing/<REGIONを指定>/'
            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://<作成したS3バケット名を指定>/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<REGION>/${day}"
            )

コマンドが成功すると、左側の画面のテーブル欄に「alb_logs」テーブルが表示されるようになります。

これでAthenaの準備は終了です。

ログ調査をする

ログにたいしてクエリを実行できるようになりました。まずはデータが入っているか確認します。
クエリエディタ画面に下記のコマンドをペーストして「実行」します。
うまくいけば、10件のログが出力されます。

SELECT * FROM "alb_logs" limit 10;

参考までにいくつかクエリを紹介します。

日付を指定し、ログを抽出するコマンド。

SELECT * 
FROM alb_logs 
WHERE day = '2023/05/15'

上位5件のリクエストがあったIPアドレスとHTTPメソッドを表示するコマンド。

SELECT COUNT(request_verb) AS
 count,
 request_verb,
 client_ip
FROM alb_logs
GROUP BY request_verb, client_ip
LIMIT 5;

エラーコード500番以上のログを抽出するコマンド。

SELECT * FROM alb_logs
WHERE elb_status_code >= 500

このようにAthenaを使えば簡単にログの分析をすることができるようになります。

まとめ

ALBのアクセスログを有効にすることで、アクセスに関する情報を収集することができます。万が一ネットワーク攻撃を受けた際の分析、ネットワーク疎通に関する問題解析などに利用することができます。
ぜひ有効化したいものですね。


参考


この記事が気に入ったらサポートをしてみませんか?