Amazon VPC フローログのクエリ - Amazon Athena

Amazon VPC フローログのクエリ

Amazon Virtual Private Cloud フローログは、VPC 内のネットワークインターフェイス間で送受信される IP トラフィックに関する情報をキャプチャします。このログを使用してネットワークトラフィックのパターンを調査し、VPC ネットワーク全体の脅威やリスクを特定します。

Athena でログのクエリを開始する前に、VPC フローログを有効化し、それらが Amazon S3 バケットに保存されるように設定します。ログを作成したら、それを数分間実行していくらかのデータを収集します。ログは、Athena で直接クエリできる GZIP 圧縮形式で作成されます。

VPC フローログを作成するときは、デフォルトの形式を使用するか、カスタム形式を指定できます。カスタム形式では、フローログで返すフィールドと、フィールドが表示される順序を指定します。詳細については、Amazon VPC ユーザーガイドの「VPC フローログ」を参照してください。

VPC フローログのテーブルの作成

以下の手順は、VPC フローログ用の Amazon VPC テーブルを作成します。カスタム形式でフローログを作成する場合は、フローログの作成時に指定したフィールドと一致するフィールドを、それらに指定したものと同じ順序で使用してテーブルを作成する必要があります。

Amazon VPC テーブルを作成する

  1. 以下のような DDL ステートメントをコピーして Athena コンソールクエリエディタに貼り付けます。以下のサンプルステートメントは、「フローログレコード」に記載されているように、VPC フローログバージョン 2 から 5 の列を持つテーブルを作成します。異なる列のセットまたは列の順序を使用する場合は、必要に応じてサンプル CREATE TABLE ステートメントを変更します。

    CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs ( version int, account string, interfaceid string, sourceaddress string, destinationaddress string, sourceport int, destinationport int, protocol int, numpackets int, numbytes bigint, starttime int, endtime int, action string, logstatus string, vpcid string, subnetid string, instanceid string, tcpflags int, type string, pktsrcaddr string, pktdstaddr string, region string, azid string, sublocationtype string, sublocationid string, pktsrcawsservice string, pktdstawsservice string, flowdirection string, trafficpath string ) PARTITIONED BY (`date` date) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/' TBLPROPERTIES ("skip.header.line.count"="1");

    以下の点に注意してください。

    • このクエリは ROW FORMAT DELIMITED を指定し、SerDe の指定が省略されます。これは、クエリが CSV、TSV、およびカスタム区切りファイルの LazySimpleSerDe を使用しているということです。このクエリでは、フィールドはスペースで終了します。

    • PARTITIONED BY 句は、date 型を使用します。これにより、クエリで数学演算子を使用して、特定の日付より古いものまたは新しいものを選択できます。

      注記

      date は DDL ステートメントの予約済みキーワードであるため、バックティック文字でエスケープされます。詳細については、「」を参照してください予約キーワード

    • カスタム形式の VPC フローログの場合、フローログの作成時に指定したフィールドと一致するようにフィールドを変更します。

  2. ログデータが含まれる Amazon S3 バケットをポイントするように LOCATION 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/' を変更します。

  3. Athena コンソールでクエリを実行します。クエリが完了すると、Athena が vpc_flow_logs テーブルを登録し、そのデータに対してクエリを発行できるように準備します。

  4. 次のサンプルクエリのように、パーティションを作成してデータを読み取れるようにします。このクエリは、指定日の 1 つのパーティションを作成します。必要に応じて、日付と場所のプレースホルダーを置き換えます。

    注記

    このクエリは、指定日に対して単一のパーティションのみを作成します。プロセスを自動化するには、このクエリを実行し、この方法で year/month/day にパーティションを作成するスクリプトを使用します。

    ALTER TABLE vpc_flow_logs ADD PARTITION (`date`='YYYY-MM-dd') location 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';

Amazon VPC フローログのクエリ例

次のクエリ例では、指定された日付に対して最大 100 のフローログを一覧表示します。

SELECT * FROM vpc_flow_logs WHERE date = DATE('2020-05-04') LIMIT 100;

次のクエリは、すべての拒否された TCP 接続を一覧表示します。新しく作成した日付パーティション列 date を使用して、該当イベントが発生した週の曜日を抽出します。

SELECT day_of_week(date) AS day, date, interfaceid, sourceaddress, action, protocol FROM vpc_flow_logs WHERE action = 'REJECT' AND protocol = 6 LIMIT 100;

最大数の HTTPS リクエストを受信しているサーバーを確認するには、次のクエリを使用します。HTTPS ポート 443 で受信したパケット数をカウントし、送信先 IP アドレス別にグループ分けして、過去 1 週間の上位 10 のサーバーを返します。

SELECT SUM(numpackets) AS packetcount, destinationaddress FROM vpc_flow_logs WHERE destinationport = 443 AND date > current_date - interval '7' day GROUP BY destinationaddress ORDER BY packetcount DESC LIMIT 10;

詳細については、AWS ビッグデータブログの記事「Amazon Kinesis Firehose、Athena、および Amazon QuickSight による VPC フローログの分析」を参照してください。このブログ記事では、VPC フローログのバージョン 2 を使用します。