【AWS_35】VPC フローログをCloud Watchから見る

VPC フローログは、VPC 内のENI(Elastic Network Interface)に対してのトラフィック情報を CloudWatch LogsやS3に出力できる機能です。
VPC全体、サブネット、ENI単体で有効にできます。
今回は、VPC全体、ENI単体の2パターンを設定して、CloudWatchからログを確認してみます。
設定してみてわかったことは、VPC全体で設定するとVPCで利用しているENIをいっきに登録できて便利ですが、設定したくないENIまで登録されるのでそのような場合は、ENI単体で設定したほうがよいと感じました。今回は、以下の記事を参考にさせていただきました、ありがとうございました。
VPCフローログを設定して、EC2へアクセスした際のログをCloudWatch Logsに保存してみる
https://dev.classmethod.jp/articles/try-vpc-flow-logs/
VPCフローログの取得方法(CloudWatch Logsに保存)
https://qiita.com/kerorinfather/items/64c3ca83017e521d9917
目次
ロググループの作成
CloudWatchコンソールよりロググループを作成します。
ログの容量によって費用がかかるため、注意が必要です。
ロググループ単位で宛先を指定します。
AWSマネジメントコンソールで「cloudwatch」を検索します。
左ペインのロググループをクリックし、画面右上の「ロググループを作成」をクリックします。

ロググループを作成画面で以下を設定し、「作成」をクリックします。
ロググループ名:任意の名前
保持期間の設定:1日(デフォルトは「失効しない」だが永久に保存されるそうなので今回は1日へ変更)

ロググループが作成できました。

IAMロールの作成
IAMロールの作成
AWSマネジメントコンソールで「IAM」を検索します。
左ペインのロールをクリックし、画面右上の「ロールを作成」をクリックします。

信頼されたエンティティを選択 画面で以下を選択して、「次へ」をクリックします。
信頼されたエンティティタイプ:AWSのサービス
ユースケース:EC2

許可を追加画面では、何も選択せずに「次へ」をクリックします。

名前、確認、および作成画面で以下を入力し、「ロールを作成」をクリックします。
ロール名:任意の名前

以下はデフォルトのままで「ロールを作成」をクリックします。

ロールが作成されました。

IAMロールへインラインポリシーを追加
作成したロールをクリックします。
「許可」タブ > 「許可を追加」 > 「インラインポリシーを作成」をクリックします。

ポリシーエディタのJSONタブを選択し、以下のように記述して「次へ」をクリックします。(私の場合、もともと記載されていたものを上書きしました)
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams"
],
"Effect": "Allow",
"Resource": "*"
}
]
}

ポリシー名を入力し、「ポリシーの作成」をクリックします。

インラインポリシーが追加されました。

IAMロールの信頼されたエンティティの変更
「信頼関係」タブ > 「信頼ポリシーを編集」をクリックします。

信頼ポリシーを編集画面で表示されているポリシーを以下のとおりに書き換えて「ポリシーを更新」をクリックします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "vpc-flow-logs.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

フローログの設定(ネットワークインターフェース単位)
ENI(Elastic Network Interface)単位で設定します。
EC2コンソールの左ペインのネットワークインターフェイス > 該当のネットワークインターフェイスにチェック > アクション > フローログの作成をクリックします。

フローログの作成画面でフローログを以下のとおり設定して、「フローログの作成」をクリックします。
フローログの作成をクリックすると、フローログの取得が始まります。
Name:任意の名前
フィルタ:すべて
最大集約間隔:1分
送信先:CloudWatch Logsに送信
送信先ロググループ:先ほど作成したロググループ
IAMロール:先ほど作成したIAMロール
ログレコード形式:AWSのデフォルト形式



ネットワークインターフェースに対するフローログが作成されました。


取得したフローログの確認
フローログを確認する際は、先ほど作成したロググループにアクセスします。ネットワークインターフェース単位で表示が分かれます。
複数設定した場合は、事前にネットワークインターフェースIDを確認する必要があります。
AWSマネジメントコンソールで「cloudwatch」を検索します。
左ペインのロググループをクリックし、該当のロググループをクリックします。
「ログストリーム」タブに表示されたインターフェースIDをクリックします。

いろいろとログが出力されていることがわかります。
プライベートIPアドレスに対してのやり取りがいろいろと出力されています。

自身のWindowsクライアントからEC2インスタンスへSSHで接続してみます。
接続できました。

あらためて自身のWindowsクライアントのグローバルIPアドレスで検索すると2件イベントが見つかりました。
現時点ログの見方まではわかりませんが、WindowsクライアントのグローバルIPアドレス(マスクしています)とEC2インスタンスのプライベートIPアドレス(10.0.1.20)が記載されているので時刻からもSSH接続した際のログを思われます。

フローログの取得を停止
フローログの取得を停止する場合は、フローログの作成した画面からアクションをクリックし、フローログを削除をクリックします。

フローログの設定(VPC単位)
次はVPC単位で設定してみます。
検証のため、VPC、ALB、EC2インスタンス(パブリックサブネットのWordpressサーバ)を作成しました。
ENI単体と違いがわかるようにするため、パブリックサブネットにまたがるALB(ロードバランサー)を作成しました。
この場合、ENIは3つ(EC2インスタンスが1つ、ALBが2つ)となります。

VPCコンソールより、フローログを設定したいVPCを選択して設定してみます。
VPCコンソールの左ペインのお使いのVPC > 該当のVPCにチェック > アクション > フローログを作成をクリックします。

フローログの作成画面でフローログを以下のとおり設定して、「フローログの作成」をクリックします。
フローログの作成をクリックすると、フローログの取得が始まります。
Name:任意の名前
フィルタ:すべて
最大集約間隔:1分
送信先:CloudWatch Logsに送信
送信先ロググループ:先ほど作成したロググループ
IAMロール:先ほど作成したIAMロール
ログレコード形式:AWSのデフォルト形式



ネットワークインターフェースに対するフローログが作成されました。

取得したフローログの確認
フローログを確認する際は、先ほど作成したロググループにアクセスします。ネットワークインターフェース単位で表示が分かれます。
VPC単位で設定したのでENIは3つ登録されています。EC2インスタンス、ロードバランサーのネットワークインターフェースIDを事前に確認しておく必要があります。
(今回は3つのENIが登録されているため色分けしています)
ネットワークインターフェース(ec2インスタンス)のプライベートIPアドレス⇒10.0.2.122

ネットワークインターフェース(ロードバランサー)のプライベートIPアドレス⇒10.0.2.181

ネットワークインターフェース(ロードバランサー)のプライベートIPアドレス⇒10.0.1.49

EC2インスタンスにはWordpressをインストールしてますのでログ確認のためHTTPでアクセスしておきます。
AWSマネジメントコンソールで「cloudwatch」を検索します。
左ペインのロググループをクリックし、該当のロググループをクリックします。
「ログストリーム」タブに表示されるインターフェースIDのうち、ログを確認したいインターフェースIDをクリックします。
(今回は3つのENIが登録されているため色分けしています)

ネットワークインターフェース(ec2インスタンス)のログです。ネットワークインターフェース(ec2インスタンス)のプライベートIPアドレス(10.0.2.122)が表示されています。

ネットワークインターフェース(ロードバランサー)のログです。ネットワークインターフェース(ロードバランサー)のプライベートIPアドレス(10.0.2.181)が表示されています。

ネットワークインターフェース(ロードバランサー)のログです。ネットワークインターフェース(ロードバランサー)のプライベートIPアドレス(10.0.1.49)が表示されています。

まとめ
今回は、VPC フローログをCloud Watchから見る検証をしてみました。もっとCloudWatchの見方にも慣れていきたいので他の検証でも取り入れれたらと思います。
以下、他の記事をまとめた一覧です。AWSもまとめています。