背景
AWS上にTCPリスナーのNLBを構築した時に、
全て正しく設定されているように見えるのに、なぜかログが出力されない事象に遭遇しました。
ALBと同じようにアクセスログを出力してくれるものだと思っていたのですが、
TCPリスナーの場合はアクスエスログを出力しない仕様でした。
VPCフローログは設定できそう、という情報をもらい
- 存在は認識していたが、触ったことがなかった
- なんらかの方法でトラフィックを確認できるものがあれば、、と思っていた
ので、ドキュメントを読みつつ設定を試してみることにしました。
目的
AWSのドキュメントを読んだり、実際に設定してみてせっかくなのでわかったことをまとめておきます。
VPCフローログとは
VPC内のネットワークインターフェースを行き来するトラフィックのをキャプチャするもので
主に以下のような情報が含まれます。
※詳しくはこちら
フィールド | 概要 |
---|---|
version | ログフォーマットのバージョン |
account-id | AWSアカウントID |
interface-id | ネットワークインターフェイスのID(eni-とつく) |
srcaddr | 受信トラフィックの送信元アドレス |
dstaddr | 送信トラフィックの送信先アドレス |
srcport | 送信元のポート |
dstport | 送信先のポート |
protocol | トラフィックのプロトコル |
packets | 転送されたパケット数 |
bytes | 転送されたバイト数 |
start | 最初のパケットが受信された時間 |
end | 最後のパケットが受信された時間 |
action | セキュリティグループorネットワークACLで許可されているか |
log-status | ロギングのステータス |
ログフォーマット
以下の2パターンです。
- デフォルト形式
- カスタム形式
カスタム形式の場合は各フィールドの出力順や、各フィールドを出力させるかさせないかをカスタマイズすることが可能です。
ログフォーマットのバージョン
2020/5時点では最新バージョンは3、デフォルトバージョンは2になっています。
VPCフローログをデフォルト形式で作成した場合、ログのフィールドに含まれるバージョン2のフィールドですが、カスタム形式だとバージョン3のフィールドも利用可能です。
ログ送信先
選択肢はCloudwatch LogsまたはS3 Bucketの2つで、それぞれの特徴は以下です。
-
Cloudwatch Logs
- デフォルト形式のみ対応
- Cloudwacth アラームとの連携が可能
-
S3 Bucket
- カスタム形式の利用が可能
- Athenaでログの検索が可能
設定方法
今回はNLBのネットワークインターフェイスに対して設定し、送信先はS3(事前に作成済み)、カスタム形式で試してみます。
コンソールでEC2 > ネットワークインターフェイス > NLBにアタッチされているネットワークインターフェースを選択すると画面下にフローログのタブが表示されるので、「フローログの作成」をクリックします。

Filter欄では、Accept、Reject、Allの選択が可能です。
S3バケットの欄はキーを含めることも可能で、1つのS3 Bucketに複数のVPCフローログを含める、ということができそうです。
設定はこれで完了です。
発行されるログ
version account-id instance-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
3 unknown - eni-xxxxxxxxxxx 10.1.1.15 10.1.2.32 1433 57640 6 3 164 1589466553 1589466612 ACCEPT OK
所感
- 設定は簡単
- このログで最も確認できるのは、本当にシンプルにセキュリティグループで許可されたトラフィックか否か
- ヘルスチェックのログがそこそこある
- バイト数は記録されるので、ヘルスチェックのものかサービスのものかはバイト数が唯一の比較材料?
- やはりセキュリティの観点で利用するものの印象。サービスのトラブルシューティングに使うものではなさそう
注意点
- 送信先に関わらず、料金はCloudwatchのログが課金されます。
- ログには最初と最後のパケットを受信した時間が記録されますが、UNIX秒なので読み替えが必要です。
- フローログを作成してから実際に送信先に出力されるまで、多少時間がかかります。