VPCフローログをS3/CloudWatch Logsに配信する

目次

VPCフローログを取得する構成

VPCフローログを確認します。

VPCフローログはVPC内のトラフィック情報を取得することができるサービスです。

VPC フローログは、VPC のネットワークインターフェイスとの間で行き来する IP トラフィックに関する情報をキャプチャできるようにする機能です。フローログデータは Amazon CloudWatch Logs または Amazon S3 に発行できます。

VPC フローログ

上記の通り、VPCフローログの出力先はCloudWatch LogsかS3が選択可能ですが、今回は両方に同様の内容を出力します。

構築する環境

Diagram of delivering VPC Flow Logs to S3 or CloudWatch Logs.

VPCフローログを2つ用意します。それぞれ上記のサブネット内のトラフィック情報を取得するように設定し、その出力先をS3バケットと、CloudWatch Logsのロググループを指定します。

VPCフローログの検証方法ですが、一方のインスタンスからもう一方のインスタンスにPingを実行し、そのトラフィックをサブネットレベルでキャプチャします。

環境構築用のCloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。

以下のURLにCloudFormationテンプレートを配置します。

https://github.com/awstut-an-r/awstut-fa/tree/main/014

テンプレートファイルのポイント解説

今回の環境を構成するための、各テンプレートファイルのポイントを取り上げます。

VPCフローログを設定する – S3バケット

fa-014-flowlog.yamlでVPCフローログ関係のリソースを定義します。

まずS3バケットにVPCフローログを保存する方法を確認します。

Resources:
  FlowLogBucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: Private
      BucketName: !Ref Prefix

  FlowLogToS3:
    Type: AWS::EC2::FlowLog
    DependsOn:
      - FlowLogBucket
    Properties:
      LogDestination: !GetAtt FlowLogBucket.Arn
      LogDestinationType: s3
      ResourceId: !Ref PrivateSubnet
      ResourceType: Subnet
      TrafficType: ALL
Code language: YAML (yaml)

S3バケットの作成に関しては、特別な設定は不要です。今回はバケット名およびACLに関する設定のみ実施します。

次にS3バケットにログを配信する場合の、VPCフローログの設定を確認します。

LogDestinationTypeおよびLogDestinationプロパティで、ログの保存先を指定します。こちらのVPCフローログは先述のS3バケットに保存しますので、前者に「s3」を、後者にバケットのARNを指定します。

ResourceTypeおよびResourceIdプロパティ、VPCフローログを取得する対象を指定します。前者はVPCフローログを取得する対象のタイプを指定します。

The type of resource for which to create the flow log. For example, if you specified a VPC ID for the ResourceId property, specify VPC for this property.

Allowed values: NetworkInterface | Subnet | VPC

AWS::EC2::FlowLog

今回はインスタンスが設置されているサブネットのログを取得しますので、「Subnet」を指定します。

後者は取得する対象のリソースIDを指定します。

The ID of the subnet, network interface, or VPC for which you want to create a flow log.

AWS::EC2::FlowLog

今回はインスタンスが設置されているサブネットのログを取得しますので、組み込み関数Fn::Refを使用して、サブネットのIDを指定します。

TrafficTypeプロパティは取得するトラフィックの種類を指定します。

The type of traffic to log. You can log traffic that the resource accepts or rejects, or all traffic.

Allowed values: ACCEPT | ALL | REJECT

AWS::EC2::FlowLog

今回はVPCフローログの検証ということで、全てのログを取得することとし、「ALL」を指定します。

VPCフローログを設定する – CloudWatch Logs

続いてCloudWatch LogsにVPCフローログを保存する方法を確認します。

Resources:
  FlowLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "${Prefix}-FlowLogGroup"

  FlowLogToCloudWatchLogs:
    Type: AWS::EC2::FlowLog
    DependsOn:
      - FlowLogGroup
    Properties:
      DeliverLogsPermissionArn: !GetAtt DeliverLogRole.Arn
      LogDestinationType: cloud-watch-logs
      LogGroupName: !Sub "${Prefix}-FlowLogGroup"
      ResourceId: !Ref PrivateSubnet
      ResourceType: Subnet
      TrafficType: ALL

  DeliverLogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - vpc-flow-logs.amazonaws.com
      Policies:
        - PolicyName: DeliverToCloudWatchLogPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                  - logs:DescribeLogGroups
                  - logs:DescribeLogStreams
                Resource: "*"
Code language: YAML (yaml)

CloudWatch Logsのロググループ作成に関しても、特別な設定は不要です。今回はロググループの名前のみ設定します。

次にCloudWatch Logsにログを配信する場合の、VPCフローログの設定を確認します。

LogDestinationTypeおよびLogGroupNameプロパティでログの保存先を指定します。こちらのVPCフローログは先述のCloudWatch Logsに保存しますので、前者に「cloud-watch-logs」を、後者にロググループの名前を指定します。

DeliverLogsPermissionArnプロパティに、ロググループに対してVPCフローログを配信するために必要な権限を含むIAMロールを指定します。

VPCフローログを配信するために必要な権限ですが、CloudWatch Logs へのフローログ発行のための IAM ロールを参考にして、IAMロールを作成しました。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。

スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • Instance1のID:i-095751cafaf667e27
  • Instance2のID:i-0a0f8ccf1ddd2eead
  • Instance1のIPアドレス:10.0.1.22
  • Instance2のIPアドレス:10.0.1.25
  • Instance1のENIのID:eni-01d89470fafe7a86b
  • Instance2のENIのID:eni-0e61c483ca317dd54
  • S3バケット名:fa-014
  • CloudWatch Logsロググループ名:fa-014-FlowLogGroup
  • サブネットのID:subnet-0d3d1285e6b822ae1

AWS Management ConsoleでVPCフローログの作成状況を確認します。

Detail of VPC FlowLog 1.

確かにサブネットに2つのVPCフローログが設定されていることがわかります。

事前準備 – SSM Session Manager経由でインスタンスにアクセス

準備が整いましたので、インスタンスにアクセスします。

SSM Session Managerを使用して、Instance1にアクセスします。

$ aws ssm start-session \
--target i-095751cafaf667e27

Starting session with SessionId: root-0ab5acb07686fac90
sh-4.2$
Code language: Bash (bash)

正常にアクセスすることができました。

SSM Session Managerに関しては、以下をご確認ください。

あわせて読みたい
LinuxインスタンスにSSM Session Manager経由でアクセスする 【LinuxインスタンスにSSM Session Manager経由でアクセスする】 EC2インスタンスにSSM Session Manager経由でアクセスする構成を確認します。 Session Manager は完全...

続いてInstance2(10.0.1.25)にPingを実行します。

sh-4.2$ ping 10.0.1.25
PING 10.0.1.25 (10.0.1.25) 56(84) bytes of data.
64 bytes from 10.0.1.25: icmp_seq=1 ttl=255 time=0.124 ms
64 bytes from 10.0.1.25: icmp_seq=2 ttl=255 time=0.157 ms
64 bytes from 10.0.1.25: icmp_seq=3 ttl=255 time=0.134 ms
64 bytes from 10.0.1.25: icmp_seq=4 ttl=255 time=0.160 ms
...
Code language: Bash (bash)

Instance2から応答がありました。これで準備が整いました。

検証1 – S3バケット内のVPCフローログを確認する

S3バケットに配信されたVPCフローログを確認します。

今回では、以下の画像のように、S3バケットにログファイルが設置されました。

VPC FlowLogs delivered to S3 are saved in gzipped format.

このようにVPCフローログファイルはgzipで圧縮されて保管されます。

1つをダウンロードし、中身を確認します。以下がその一例です。

version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
...
2 [account-id] eni-0e61c483ca317dd54 10.0.1.22 10.0.1.25 0 0 1 57 4788 1641597879 1641597903 ACCEPT OK
2 [account-id] eni-0e61c483ca317dd54 10.0.1.25 10.0.1.22 0 0 1 57 4788 1641597879 1641597903 ACCEPT OK
...
Code language: Bash (bash)

VPCフローログの見方はフローログレコードに詳しいですが、「srcaddr」および「dstaddr」の値が2インスタンスのもののレコードがあり、「action」が「ACCEPT」とあります。両インスタンスのPingによるやり取りが、S3バケットに配信されたVPCフローログに正常に記録されていることがわかります。

検証2 – CloudWatch Logs内のVPCフローログを確認する

続いてCloudWatch Logsに配信されたVPCフローログを確認します。

まずロググループの状況を確認します。

VPC FlowLogs delivered to CloudWatch will be streamed for each ENI.

ロググループ内にENI単位でストリームが作成されていることがわかります。

次にInstance1のENI用のストリームの中身を確認します。

VPC Flow Logs are also delivered to CloudWatch Logs.

こちらにも見方は同じです。CloudWatch Logsに配信されたVPCフローログに、正常に記録されていることがわかります。

まとめ

VPCフローログを取得する方法を確認しました。

VPCフローログはS3バケットまたはCloudWatch Logsに配信することが可能で、どちらも同様の内容を取得できることを確認しました。

目次