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

Amazon VPC フローログのクエリ

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

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

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

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

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

Amazon VPC テーブルを作成するには

  1. 次の DDL ステートメントをコピーして Athena コンソールクエリエディタ内に貼り付けます。

    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 ) 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 Big Data Blog の記事「Amazon Kinesis Firehose、Athena、および Amazon QuickSight による VPC フローログの分析」を参照してください。