株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

AWS Athena : ELBアクセスログのクエリ方法

こんにちは!ネットワールド西日本技術部の小川です。今回は、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アクセスログのクエリ方法の紹介でした。
読んで頂き、ありがとうございました。