AWS VPC Flow Logsのメモ

  • 2019.11.21
  • AWS
AWS VPC Flow Logsのメモ

はじめに

VPC Flow Logsについて調べてみました。

VPC Flow LogsはCloudWatchへの出力とS3への出力ができます。どちらもIAMロールや権限の設定が必要になります。また、CloudWatchに出力した際のログの分析について簡単に触れて見たいと思います。

Cloud Watchへの出力用IAMロール設定

AssumeRole用に次のようなJSONファイルを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

インラインポリシー用にもJSONファイルを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

次のコマンドでロールを作成します。

$ aws iam create-role --role-name vpcflowlog --assume-role-policy-document file://assume-vpcflowlog.json
{
    "Role": {
        "Path": "/",
        "RoleName": "vpcflowlog",
        "RoleId": "AROAUC6VD3XAMT2D7BYDQ",
        "Arn": "arn:aws:iam::281230433728:role/vpcflowlog",
        "CreateDate": "2019-11-21T01:54:10Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "vpc-flow-logs.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}

 次のコマンドでポリシーを作成します。

$ aws iam create-policy --policy-name VPCFlowlogAccess --policy-document file://role-vpcflow.json
{
    "Policy": {
        "PolicyName": "VPCFlowlogAccess",
        "PolicyId": "ANPAUC6VD3XAPT6FR53EW",
        "Arn": "arn:aws:iam::281230433728:policy/VPCFlowlogAccess",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2019-11-21T01:56:06Z",
        "UpdateDate": "2019-11-21T01:56:06Z"
    }
}

次のコマンドでポリシーを割り当てます。

$ aws iam attach-role-policy --role-name vpcflowlog --policy-arn arn:aws:iam::281230433728:policy/VPCFlowlogAccess

CloudWatchにVPC Flow logsを出力

VPC Flow logsはネットワークインターフェース、VPC、Subnetのいずれかを指定することができるのですが、ここではSubnetを指定したいと思います。

事前に設定したいSubnetのIDも調べておきます。それから先ほど作成したロールのArnも使用します。

$ aws ec2 create-flow-logs --resource-ids subnet-0c9c35ffcb7a89446 --resource-type Subnet --traffic-type ALL --deliver-logs-permission-arn arn:aws:iam::281230433728:role/vpcflowlog --log-group-name /aws/ec2/subnet/wordpresslog
{
    "ClientToken": "hogehogehoge",
    "FlowLogIds": [
        "fl-0252fd29f785b6919"
    ],
    "Unsuccessful": []
}

これでログが作成されはじめます。

CloudWatchよりログ確認

AWSマネジメントコンソールより、[CloudWatch] – [ロググループ]を開き、作成したロググループネームを開きます。

CLIで見る方法は次の通りです。

まずはロググループ名を調べます。

$ aws logs describe-log-groups
{
    "logGroups": [
        {
            "logGroupName": "/aws/ec2/subnet/wordpresslog",
            "creationTime": 1574302547691,
            "metricFilterCount": 0,
            "arn": "arn:aws:logs:ap-northeast-1:281230433728:log-group:/aws/ec2/subnet/wordpresslog:*",
            "storedBytes": 0
        }
    ]
}

次にログストリーム名を調べます。

$ aws logs describe-log-streams --log-group-name /aws/ec2/subnet/wordpresslog
{
    "logStreams": [
        {
            "logStreamName": "eni-06437fe048bc3d9f3-all",
            "creationTime": 1574302813113,
            "firstEventTimestamp": 1574302168000,
            "lastEventTimestamp": 1574303302000,
            "lastIngestionTime": 1574303412995,
            "uploadSequenceToken": "49599896390774611550727467632408773442737250969111803682",
            "arn": "arn:aws:logs:ap-northeast-1:281230433728:log-group:/aws/ec2/subnet/wordpresslog:log-stream:eni-06437fe048bc3d9f3-all",
            "storedBytes": 0
        },
        {
            "logStreamName": "eni-0b916a0ce65df197c-all",
            "creationTime": 1574302547745,
            "firstEventTimestamp": 1574302469000,
            "lastEventTimestamp": 1574303250000,
            "lastIngestionTime": 1574303586205,
            "uploadSequenceToken": "49599889186897987833792848471058426599055865178851680402",
            "arn": "arn:aws:logs:ap-northeast-1:281230433728:log-group:/aws/ec2/subnet/wordpresslog:log-stream:eni-0b916a0ce65df197c-all",
            "storedBytes": 0
        }
    ]
}

次のコマンドでログをみます。

$ aws logs get-log-events --log-group-name /aws/ec2/subnet/wordpresslog --log-stream-name eni-06437fe048bc3d9f3-all --output text

一応これで生データは見ることはできるのですが、視覚的に見辛いです。そこでもう少し見やすい方法で試します。

CloudWatchインサイトを活用

まずは単純な表示のみです。

[CloudWatch] – [インサイト] を開いてください。その後、次の手順でログを表示できます。

生データだけでなくヒストグラムも表示されるようになりました。

次にサンプルクエリを使用してみます。

クエリの実行をクリックすると、IPアドレス別の使用状況が分かるようになりました。

他にもこの辺りを試して見ます。

その後に[可視化]タブを開き、

棒を選択すると棒グラフで表示することもできます。

クエリは自分で加工することもできます。例えば送信先IPアドレスを指定して絞り込みたい場合は、次のように filter クエリを追加します。

出力したいフィールドも絞り込むこともできます。

これらの情報をダッシュボードに追加することもできます。

このようにVPC Flow logs を活用することによってネットワークを監視しやすくなります。