ELBのログを見る（障害調査等でよくやるやつ）

## はじめに

何かあった時には、ログを見れば大丈夫でしょ！
というものの、何もしないでも見れると思っていて、実際やってみるとうまく見れないのはよくあることです。
ELB（ALB）のログもすぐ見るにはどうしたら。。。


## ELBのログ

ELBを構築する際にアクセスログの出力先としてS3のバケットを設定します。
ELBのログはS3へ出力されますので、その中身を見れば良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/65b00c09-139a-77d7-aa6c-0640ffb29e70.png)

## ELB出力状況

アクセスがあった後にELB出力先S3バケットを見ると、ログが出力されています。
何も考えず、ログを見るために各ファイルをダウンロードし、中身を見ていくことになりますが、これはきつい。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/5a04ad19-8ffe-a450-30b7-3be72ccfe6f3.png)

## S3のログファイルを見る方法

そんな時使えるのが、[Amazon Athena](https://aws.amazon.com/jp/athena/)になります！

### Amazon AthenaでELBログを見る

Amazon Athenaは、SQLを用いてS3に格納されたファイルを横断的に検索することができるサービスになります。
しかも、ALBのログをみるためのテーブル定義が公式ドキュメントに掲載されています。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer-logs.html

```
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
            )
            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/<ACCOUNT-ID>/elasticloadbalancing/<REGION>/';

```

では、実際にやってみます。

１. Amazon Athenaでワークグループを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/34023caa-ab17-a33c-bb7f-9a933d51a4bb.png)

ワークグループ名、クエリ結果の出力先（S3バケット）等を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/b1a5edcf-7503-00a7-f541-6b69b69d9bc4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/908f8d60-760f-cb90-692f-1ab6498348ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/301e0290-0a2d-8aaf-e11c-d6166e781399.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/a36d53c5-baed-4fc8-0b9b-ac359415f6dc.png)

２. 左メニューにあるクエリエディタを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/7dadefed-0d34-144b-9e5a-4a30bf42b611.png)

３. 公式ドキュメントにありましたCREATE文を利用してテーブルを作成します。

LOCATIONの部分のみ、自分の環境に合わせて修正する必要があります。
```
LOCATION 's3://your-alb-logs-directory/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<REGION>/';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/c78f0368-9a28-a179-6f5d-50bd4ddf7eaf.png)

実行すると、以下のように成功と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/f4543189-1041-4235-e677-3016e2c5c814.png)
非表示にしていた箇所にもテーブルが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/37b81ef3-585c-265f-e433-2476464c59d4.png)

これで準備完了です！
実際にログを見てみます。

４. 右上の「＋」ボタンから新規クエリフィールドを表示させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/9f16bbf5-cc48-cd46-d785-c51260927d0a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/3028808d-e7b3-e988-5d78-0b5e0d1083c1.png)

５. 発行するクエリを入力し、実行します。

今回は、ある特定の時間帯の5XXエラーのログを抽出します。

↓↓ クエリ内容
```
SELECT * FROM alb_logs
WHERE elb_status_code >= 500
    AND parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z') 
    BETWEEN parse_datetime('2022-03-03-00:00:00','yyyy-MM-dd-HH:mm:ss') 
     AND parse_datetime('2022-03-04-00:00:00','yyyy-MM-dd-HH:mm:ss') 
```
↓↓ 実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/dc7fd034-5a71-a01a-918e-cb1fa515db6b.png)

すると、結果が下に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/9435abe0-0636-7c9f-3264-c39468301dd8.png)

503で返却されていることもわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129814/3595d396-6770-9b39-282b-eb13532fb570.png)

時系列で並べることもできますし、「結果をダウンロード」をクリックすると、結果をCSVファイルでダウンロードすることができます。あとは、Excelなど好きなもので見ていただいてOKです。

## ELBのログの中身

ログの内容については、以下に記載がありますので、照らし合わせて確認すると良いです。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-syntax


## まとめ
今回は、ELB（ALB）のログをAmazon Athenaで表示させて確認しました。使い方がわかると調査がグッと楽になるので、ぜひ活用していただければと思います。個人の備忘録的な記事ですが、誰かの役に立てば幸いです。

他にもAWSサービスで出力されるログについては、ログのクエリについて情報が公式ドキュメントに載っていますので活用できます。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/querying-AWS-service-logs.html

Athenaはスキャンされたデータ量で料金が発生しますので、ご注意を。
では。