VPC Flow Logsについて調べたこと


元のドキュメントは以下を参照しています。和訳ではなく、私個人が理解したベースで書いているので、内容に間違いがあるかもしれません。
正確な情報は原文で確認をしてもらうようにお願いします。

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html

# VPC FLow Logs

VPC Flow LogsはVPCのなかでネットワーク・インターフェースを通過するIPトラフィックの行き来の情報をキャプチャ出来る機能です。Flow logのデータはCloudWatch Logsに保管されます。Flow Logsを有効にすれば、Amazon CloudWatch Logsに保管されたデータを見たり取り出したり出来ます。

#### Topics

- [Flow Logs Basics](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-logs-basics)
- [Flow Log Limitations](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-logs-limitations)
- [Flow Log Records](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-log-records)
- [IAM Roles for Flow Logs](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-logs-iam)
- [Working With Flow Logs](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#working-with-flow-logs)
- [Troubleshooting](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-logs-troubleshooting)
- [API and CLI Overview](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-logs-api-cli)

## Flow Logs Basics

Flow LogはVPC、Subnet、Network Interfaceといった単位で作成することが出来ます。VPCやSubnetといった単位でFlow Logを作成するとその中の各Network Interfaceはモニタリングされます。Flow logのデータはCloudWatch Logsのlog groupに公開され、各Network Interfaceはユニークなlog streamを持ちます。log streamはNetwork Interfaceのトラフィックを表すフィールドからなるログイベントであるlog recordを含みます。これ以上の情報は、[Flow Log Records](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-log-records)をご覧ください。

## Flow Log Limitations

Flow Logsを使用するには、以下の制限を知っておく必要があります。

- EC2クラシックのインスタンスには、Flow Logsは有効に出来ません。これは、ClassicLinkによってVPCとリンクされたEC2クラシックのインスタンスも含みます。
- VPC Peeringしたがあなたのアカウントにない限り、VPC peerignされたVPCはFlow Logsは有効に出来ません。
- Flow Logsにタギングは出来ません。
- 一度Flow Logを作成すると、設定を変更する事はできません。例えば、別のIAMロールを割り当てることは出来ません。そのかわりFlow Logを削除して新しく作成するようにして下さい。
- リソースレベルのパーミッションをサポートしたFlow LogのAPIアクションはありません。もしFlow Log APIを使うためにIAMポリシーを作成したい場合は、statementのresouce elementにワイルドカードを使用してすべてのリソースに対して権限を与えなければなりません。追加の情報は[Controlling Access to Amazon VPC Resources](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_IAM.html)

Flow LogsはすべてのIPトラフィックをキャプチャするわけではありません。以下のようなトラフィックはキャプチャしません。

- EC2インスタンスがAmazonのDNSサーバーと通信したときのトラフィック
- WindowsインスタンスがAmazonのWindowsライセンスサーバーとアクティベーションの通信をしたときのトラフィック
- インスタンスメタデータ取得のために169.254.169.254と通信したときのトラフィック
- DHCPトラフィック

## Flow Log Records

一つのFlow Log RecordはFlow Log内のひとつのネットワークの流れを表しています。各レコードはキャプチャーウィンドウのために5組のネットワークの流れをキャプチャしています。5組ひとセットは送信元、送信先、IP通信のためのプロトコルを特定する5つの異なる値を持ちます。キャプチャウィンドウはFlow LogsサービスがFlow Logs Recordを公開する前に集めたデータを表示しています。キャプチャウィンドウはおおよそ10分から15分までかかります。Flow Log Recordはスペースで分割された、以下のフォーマットとなっています。

version、account-id、interface-id、srcaddr、dstaddr、srcport、dstport、protocol、packets、start、end、action、log-status

|Field|Desctiption|
|:--:|:--|
|version|VPC Flow Logsのバージョン|
|account-id|アカウントID|
|interface-id|Log Steamが適用されたネットワークインターフェースのID（ENI）|
|srcaddr|送信元IPアドレス、ネットワークインターフェースのIPアドレスは常にプライベートIPです|
|dstaddr|送信先IPアドレス、ネットワークインターフェースのIPアドレスは常にプライベートIPです|
|srcport|送信元ポート番号|
|dstport|送信先ポート番号|
|protocol|IANAで定義されたプロトコル番号、追加の情報は[Assigned Internet Protocol Numbers](http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)にて|
|packets|キャプチャウィンドウで通信されたパケットの数|
|bytes|キャプチャウィンドウで通信されたバイト数|
|start|UNIX時間で表現された、キャプチャウィンドウの開始時間|
|end|UNIX時間で表現された、キャプチャウィンドウの終了時間|
|action|通信に割り当てられたアクション<br>- ACCEPT:通信がセキュリティグループやネットワークACLによって許可された<br>- REJECT:通信がセキュリティグループやネットワークACLによって拒否された|
|log-status|以下のFlow Logに関するロギングの状態です<br>- OK:データはCloudWatch Logsに正しくロギングされています<br>- NODATA:キャプチャウィンドウでNetwork Interfaceに対して通信がありませんでした<br>- SKIPDATA:キャプチャウィンドウでいくつかのFloW Log Recordがスキップされました これは内部的なキャパシティ制限や内部エラーによるものです|

フィールドがいずれかのレコードに当てはまらなかった場合はRecordは"-"で表現されます。

CloudWatch Logsによって収集された他のログイベントとFlow Logs Recordを一緒に動作させることも可能です。ログの監視とメトリックフィルターの詳しい情報は、Amazon CloudWatch開発者ガイドの[Monitoring Log Data](http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/MonitoringLogData.html)と[Filter and Pattern Syntax](http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html)を御覧ください。

#### トラフィックが許可／拒否されたFlow Log Recordsの例

次のものはアカウント123456789010におけるネットワークインターフェースeni-abc123deに対するSSH通信（送信先ポート22番 TCPプロトコル）のFlow Log Recordの例となります。

```
2 123456789010 eni-abc123de 172.168.1.12 172.168.1.11 20641 22 6 20 4249 1418530010 1418530070 ACCEPT OK
```

次のものはアカウント123456789010におけるネットワークインターフェースeni-abc123deに対するRDP通信（送信先ポート3389番 TCPプロトコル）のFlow Log Recordの例となります。

```
2 123456789010 eni-abc123de 172.168.1.12 172.168.1.11 49761 3389 6 20 4249 1418530010 1418530070 REJECT OK
```

#### データがなくレコードがスキップされたFlow Log Recordの例

次のものはキャプチャウィンドウ間でデータなしが記録されたFlow Log Recordの例です。

```
2 123456789010 eni-1a2b3c4d - - - - - - - 1431280876 1431280934 - NODATA
```

次のものはキャプチャウィンドウ間でスキップが記録されたFlow Log Recordの例です。

```
2 123456789010 eni-4b118871 - - - - - - - 1431280876 1431280934 - SKIPDATA
```

#### Security GroupとNetwork ACLのルール例

もしFlow LogsをSecurity GroupやNetwork ACLのルールにおける許可や制限に活用しているのであれば、リソースのステートレスに関して把握しましょう。Security Groupはステートフルです、これはSecurity Groupのルールで明示的に許可していなくても、許可されている通信のレスポンスは自動的に許可されることを意味します。反対にNetwork ACLはステートレスです’、許可された通信のレスポンスもNetwork ACLのルールで明示的に許可する必要があります。

例として、あなた自身のラップトップ（IPアドレスは55.123.456.78）からEC2インスタンス（Network InterfaceのローカルIPアドレスは172.11.22.333）にpingコマンドを実行したとします。Security GroupのInboudルールはICMP通信は許可されており、Outboundのルールでは許可されていません。しかしながら、Security GroupはステートフルであるがゆえにEC2インスタンスが返したpingのレスポンスは許可されます。次にNetwork ACLのInboudルールでICMPトラフィックが許可されていますが、OutboudのICMP通信は許可されません。それはNetworks ACLがステートレスだからであり、pingのレスポンスはドロップされ、あなた自身のラップトップには届きません。Flow Logでは、下記3つのエントリーが表示されていました。オリジナルのping通信に関する2つのACCEPTエントリーと、Security Groupによって許可されたものと、Network ACLによってREJECTされたpingに対するレスポンスのエントリーです。

```
2 123456789010 eni-1235b8ca 55.123.456.78 172.11.22.333 0 0 1 8 672 1432917027 1432917142 ACCEPT OK
```

```
2 123456789010 eni-1235b8ca 172.11.22.333 55.123.456.78 0 0 1 4 336 1432917027 1432917082 ACCEPT OK
```

```
2 123456789010 eni-1235b8ca 172.11.22.333 55.123.456.78 0 0 1 4 336 1432917094 1432917142 REJECT OK
```

# IAM Roles for Flow Logs
Flow Logに割り当てられるIAMロールはCloudWatch LogsのLog Groupにアップするために、十分な権限が付与される必要があります。IAMロールに割り当てられるIAMポリシーは最低でも以下の権限を含む必要があります。

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

IAMロールはFlow Logsサービスがロールを引き受けるために、Trust Relationshipが設定される必要があります（Trust Relationshipを閲覧するためには、IANのWebコンソール画面でIAMロールを選択し、Edit Trust Relationshipを選択して下さい）。

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

あるいは、Flow Logsを使うために次の手順にしたがって新しいロールを作ることも出来ます。

### To create an IAM role for flow logs

1. https://console.aws.amazon.com/iam/ にアクセスしてIAMのWebコンソールを開きます
2. ナビゲーションペインでRolesを選択し、Create New Roleを選択します
3. 例えばFlow-Logs-Roleのようなロール名を入力し、Nextを選択します
4. Select Role Typeページにて、Amazon EC2をSelectを選択します
5. Attach Policyページにて、Next Stepを選択します
6. Flow Logを作成するときに必要となるので、Reviewページにて、IAMロールのARNをメモし、Create Roleを選択します
7. 作成したロール名を選択し、Inline Policiesセクションを展開、Click hereを選択します
8. Cstom Policyを選択し、Selectを選択します
9. 上記のIAM Roles for Flow Logsセクション内にある、最初のポリシーをコピーし、Policy Documentウィンドウにペーストします。
10. 上記のIAM Roles for Flow Logsセクション内にある、二番目にあるTrust Relatinshipのポリシーをコピーし、Edit Trust Relationshipを選択します、すでに記載されているPolicy Documentを削除し、先ほどコピーしたものをペーストします。完了後、Update Trust Policyを選択します。

## Working With Flow Logs

Amazon EC2、Amazon VPC、そしてCloudWatchコンソールを使ってFlow Logsを動作させることが出来ます。

#### Topic

- Creating a Flow Log
- Viewing Flow Logs
- Deleting a Flow Log

### Creating a Flow Log

Flow Logは、Amazon VPCのWebコンソールのVPCページやSubnetページから作成出来ますし、Amazon EC2のWebコンソールのNetwork Interfaceからも作ることが出来ます。

#### To create a flow log for a network interface

1. https://console.aws.amazon.com/ec2/ にアクセスし、Amazon EC2のWebコンソールを開きます
2. ナビゲーションペインで、Network Interfaceを選択します
3. Network Interfaceを選択し、Flow Logsタグを選び、Create Flow Logを選択します
4. ダイアログボックスで以下の情報を完了させ、完了したらCreate Flow Logを選択します
  - Filter:Flow LogがRejectした通信、Acceptした通信、すべての通信をキャプチャするべきかを選択します
  - Role:CloudWatch Logsにアップするための権限を持ったIAMロール名を入力します
  - Destination Log Group:Flow Logを公開するときのCloudWatch Logsにおけるグループ名を入力します。グループ名はすでに作成済みのもの、新しく作成するもの、どちらでも構いません。

#### To create a flow log for a VPC or a subnet

1. https://console.aws.amazon.com/vpc/ にアクセスし、Amazon VPCのWebコンソールを開きます
2. ナビゲーションペインで、Your VPCsかYour Subnetsを選択します
3. VPCもしくはVPC Subnetsを選択し、Flow Logsタグを選び、Create Flow Logを選択します
  - Note 複数のVPCに対してFlow Logsを作成したい場合は、複数のVPCを選択してActionメニューからCreate Flow Logsを選択し、複数のVPC Subnetsに対してFlow Logsを作成したい場合は、複数のVPC Subnetsを選択してActionメニューからCreate Flow Logsを選択します。
4. ダイアログボックスで以下の情報を完了させ、完了したらCreate Flow Logを選択します
  - Filter:Flow LogがRejectした通信、Acceptした通信、すべての通信をキャプチャするべきかを選択します
  - Role:CloudWatch Logsにアップするための権限を持ったIAMロール名を入力します
  - Destination Log Group:Flow Logを公開するときのCloudWatch Logsにおけるグループ名を入力します。グループ名はすでに作成済みのもの、新しく作成するもの、どちらでも構いません。

### Viewing Flow Logs

Flow Logsの情報は、Amazon EC2、Amazon VPCのWebコンソールのFlow Logsタブでリソースを指定することで見れます。リソースを選択すると、そのリソースに対するすべてのFlow Logsがリストされます。表示された情報には、Flow LogのID、Flow Logの設定、Flow Logのステータスについての情報が含まれます。

#### To view information about your flow logs for your network interfaces

1. https://console.aws.amazon.com/ec2/ にアクセスし、Amazon EC2のコンソールを開きます
2. ナビゲーションペインで、Network Interfacesを選択します
3. Network Interfaceを選択し、Flow Logsタブを選ぶとFlow Logsについての情報が表示されます

#### To view information about your flow logs for your VPCs or subnets

1. https://console.aws.amazon.com/vpc/ にアクセスし、Amazon VPCのコンソールを開きます
2. ナビゲーションペインで、VPCsかSubnetsを選択します
3. VPCかVPC Subnetをを選択し、Flow Logsタブを選ぶとFlow Lgsについての情報が表示されます

#### To view your flow log records for a flow log

1. https://console.aws.amazon.com/cloudwatch/ にアクセスし、Amazon CloudWatchのコンソールを開きます
2. ナビゲーションペインで、Logsを選択します
3. Flow Logが含まれる、グループ名を選択します
4. Network InterfaceのLogストリームがリストされます。見たいFlow Log RecordのNework Interface IDが含まれたLogストリームの名前を選択します、Flow Log Recordについてさらに知りたい場合は[Flow Log Records](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-log-records)をご覧下さい

### Deleting a Flow Log

Flow LogはAmzon EC2やAmazon CloudWatchのコンソールを使うことによって削除することが出来ます。

**Note**

これらは手順でリソースのFlow Logsサービスを無効にできます。Network InterfaceのLogストリームを削除する場合はCloudWatchのコンソールを使います。

#### To delete a flow log for a network interface

1. https://console.aws.amazon.com/ec2/ にアクセスして、Amazon EC2のコンソールを開きます
2. ナビゲーションペインで、Network Interfacesを選択します
3. Flow Logsタブを選択し、削除したいFlow LogのDeleteボタンを選択します
4. 確認ダイアログボックスでYes Deleteを選択します

#### To delete a flow log for a VPC or subnet

1. https://console.aws.amazon.com/vpc/ にアクセスして、Amazon VPCのコンソールを開きます
2. ナビゲーションペインで、VPCsかVPC Subnetsのどちらかのリソースを選択します
3. Flow Logsタブを選択し、削除したいFlow LogのDeleteボタンを選択します
4. 確認ダイアログボックスでYes Deleteを選択します

## Troubleshooting

### Incomplete Flow Log Records

Flow Logs Recordがincompleteになったり、データが送られてきていないようであれば、Flow LogsがCloudWatch LogsのLogグループへの転送に問題があるかもしれません。Amazon EC2コンソールかAmazon VPCコンソールにアクセスし、対象リソースのFlow Logsタブにアクセスして下さい。追加の情報は、[Viewing Flow Logs](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/flow-logs.html#view-flow-logs)を参照して下さい。Flow LogsテーブルのStatusカラムには何かしらのエラーを表示します。代わりに[describe-flow-logs](http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-flow-logs.html)コマンドを実行してその結果をチェックすることも可能です。

- Rate limited:CloudWatch Logsがスロットリングエラーに達した。このエラーは、Network InterfaceのFlow Logsの数が特定の時間枠内で送ることが出来る最大レコード量を超えてしまったことによって発生します。
- Access error:Flow Logに割り当てたIAMロールがCloudWatch LogにFlow Log Recordを送るために必要な権限を持っていません、追加の情報は[IAM Roles for Flow Logs](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/flow-logs.html#flow-logs-iam)を参照して下さい
- Unknown error:Flow Logサービスで内部エラーが発生しています

### Flow Log is Active, But No Flow Log Records or Log Group

Flow Logsを作成し、Amamzon VPCやAmazon EC2のコンソールでFlow Logがactiveを表示しました。しかし、CloudWatch LogsではLogストリームは何も見ることができず、CloudWatch LogsのLogグループは作成されていません。これは以下のいずれかによるものです。

- Flow Logは作成される途中の状態です。Flow LogのLogグループを作成してからデータが表示されるまでに10分程度かかる場合もあります
- Network Interfaceが関連する通信がまだ記録されていない状態です。CloudWatch LogsのLogグループは通信が記録されたときのみに作成されます

## API and CLI Overview

このページで解説したことは、AWS CLIやAPIを使っても実現出来ます。コマンドラインインターフェースや実装されているAPIアクションに関する情報は、[Accessing Amazon VPC](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Introduction.html#VPCInterfaces)を参照して下さい。

#### Create a flow log

- [create-flow-logs](http://docs.aws.amazon.com/cli/latest/reference/ec2/create-flow-logs.html) (AWS CLI)
- [New-EC2FlowLogs](http://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2FlowLogs.html) (AWS Tools for Windows PowerShell)
- [CreateFlowLogs](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFlowLogs.html) (Amazon EC2 Query API)

#### Describe your flow logs

- [describe-flow-logs](http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-flow-logs.html) (AWS CLI)
- [Get-EC2FlowLogs](http://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2FlowLogs.html) (AWS Tools for Windows PowerShell)
- [DescribeFlowLogs](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeFlowLogs.html) (Amazon EC2 Query API)

#### View your flow log records (log events)

- [get-log-events](http://docs.aws.amazon.com/cli/latest/reference/logs/get-log-events.html) (AWS CLI)
- [Get-CWLLogEvents](http://docs.aws.amazon.com/powershell/latest/reference/items/Get-CWLLogEvents.html) (AWS Tools for Windows PowerShell)
- [GetLogEvents](http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetLogEvents.html) (CloudWatch API)

#### Delete a flow log

- [delete-flow-logs](http://docs.aws.amazon.com/cli/latest/reference/ec2/delete-flow-logs.html) (AWS CLI)
- [Remove-EC2FlowLogs](http://docs.aws.amazon.com/powershell/latest/reference/items/Remove-EC2FlowLogs.html) (AWS Tools for Windows PowerShell)
- [DeleteFlowLogs](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteFlowLogs.html) (Amazon EC2 Query API)