こんにちは!ネットワールド西日本技術部の小川です。今回は、AWSのElastic Load Balancing (ELB)アクセスログを AWS Athena を利用してログを見やすく方法を紹介します。
S3バケットの作成
アクセスログを保管するS3バケットを作成します。
S3バケット作成前に、コンソール画面がELB と同じリージョンであることを確認します。(※ELBは同じリージョンのS3バケットにアクセスログを出力します。)
- S3 を検索して、[S3]をクリックします。
- [バケット作成]をクリックします。
- S3バケット名を入力して、後はデフォルトで問題ありません。下にスクロールして、[バケットを作成]をクリックします。
- 作成したS3バケットをクリックします。
- [アクセス許可]タブをクリックして、バケットポリシーの[編集]をクリックします。
- 設定する前に、以下の構文をテキストにコピーします。(※ 太字は環境に合わせて変更します。リージョン番号は AWS のドキュメントを参照下さい。)
Application Load Balancer のアクセスログを有効にする - Elastic Load Balancing
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::383597477331:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::og-s3-alb/*"
}
]
} - 作成した構文をペーストして、[変更の保存]をクリックします。
ELBのアクセスログ設定
- ロードバランサーの[属性]→[編集]をクリックします。
- モニタリングのアクセスログを有効します。[S3を参照]をクリックして、作成済みのS3バケットを選択します。[変更内容の保存]をクリックします。
S3 URI のコピー
- ロードバランサーにトラフィックが流れると S3バケットにログが出力されます。
- 以下のとおり、ディレクトリが作成されます。リージョン名のディレクトリまで進み、[S3 URI をコピー] をクリックします。
- コピーした URI はテキストに貼り付けて、保存します。
AWS Athena 設定
- AWS コンソールから、[Athena] をクリックします。
- [編集ボタン]をクリックします。
- [ワークグループ]をクリックして、[ワークグループを作成]をクリックします。
- 赤枠の箇所のみ設定して、[ワークグループを作成]をクリックします。(※S3バケットを選択して、データ制限を "Megabytes MB" に変更します。)
- ワークグループの作成を確認します。
- [編集ボタン]から、[クエリエディタ]をクリックします。
- 作成した[ワークグループ]を選択します。
- 設定する前に、以下の構文をテキストにコピーします。(※ 太字を S3 URI に変更します。)
CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_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://og-s3-alb/AWSLogs/813446910525/elasticloadbalancing/ap-northeast-3/'
- クエリ1 にコピーした構文をペーストして、[実行]をクリックします。
- クエリ結果が[完了済み]になります。
- テーブルが作成されることを確認します。
- HTTP応答コード 200番以上のアクセスログを抽出する構文です。設定する前に、構文をテキストにコピーします。(※ログを閲覧する日付を変更します。)
SELECT * FROM alb_access_logs
WHERE elb_status_code >= 200
AND parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')
BETWEEN parse_datetime('2024-09-19-00:00:00','yyyy-MM-dd-HH:mm:ss')
AND parse_datetime('2024-09-20-00:00:00','yyyy-MM-dd-HH:mm:ss')
- [+] ボタンをクリックして、クエリ2を作成します。
- クエリ2にコピーした構文をペーストして、[実行]をクリックします。
- アクセスログを抽出して、閲覧することができました。[結果をダウンロード]をクリックしてログを保存できます。
ログのフィルタリング方法
- クエリ1 のテーブルの値から、ログを検索できます。
- 例えば 192.168.2.13 に振り分けたアクセスログのみを検索したい場合は、以下の構文をテキストに保存します。
SELECT * FROM alb_access_logs
WHERE target_ip = '192.168.2.13'
AND parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')
BETWEEN parse_datetime('2024-09-19-00:00:00','yyyy-MM-dd-HH:mm:ss')
AND parse_datetime('2024-09-20-00:00:00','yyyy-MM-dd-HH:mm:ss')
- [+]ボタンをクリックして、新規クエリを作成します。テキストに保存した構文をペーストして、[実行]をクリックします。
- target_ip のみを抽出したログを閲覧することができます。
以上、AWS Athena を使った ELBアクセスログのクエリ方法の紹介でした。
読んで頂き、ありがとうございました。