こんにちは。 ディベロップメントサービス1課の山本です。
監査ログなどにも利用されるVPCフローログをKinesis Data Firehose(以下、Firehose)経由でAmazon S3(以下、S3)にファイルとして保存する方法を紹介します。
主に2つの方法があるのですが、今回は自分が構築時につまずいた
Amazon CloudWacthLogsを経由する方法をご説明します。
- Amazon CloudWacthLogs経由でFirehoseへと送信する方法(今回説明)
- VPCフローログから直接Firehoseへと送信する方法
つまずいた点
1. 現象
FirehoseでS3へと出力するファイルの圧縮方法が設定できるのですが
無圧縮を設定していたのにも関わらず、ファイルがテキストエディターで開けない!
【テキストエディターでエラー】
2. 原因
Amazon CloudWacthLogsを経由する場合、Firehoseへ送信されるデータが自動的にgzip のレベル 6 で圧縮されるとのこと。
そのため、拡張子上では無圧縮ファイルでも中身のデータはgzipにて圧縮されていた。
3. 解決策
テキストエディターで開く場合は拡張子.gz
を追加した後に、解凍する。
解凍後に中身を確認すると、無事開くことができました。
せっかくなので、構築方法を引き続き記載していきます。
構築方法
1. 構成
今回、FirehoseからS3には無圧縮で転送する構成とします。 VPC内の通信を確認するために、EC2を1台VPC内に構築しています。
以下にAWS マネジメントコンソールでの設定方法を記載します。
今回の説明は、既存のVPCにフローログを設定しFirehose経由でS3に保存する人をスコープにさせて頂いております。そのためVPCやS3バケット、EC2は既に構築済の前提として進めます。
2. Firehoseの設定
Firehoseの配信ストリーム一覧画面から、配信ストリームを作成
をクリックします。
【配信ストリーム一覧画面】
【配信ストリーム作成画面】
設定値を入力後に配信ストリームを作成
をクリックします。
今回は初期設定ベースでおこない、変更が必要な箇所のみを下記に記載します。
項目 | 値 |
---|---|
ソース | Direct PUT |
送信先 | Amazon S3 |
配信ストリーム名 | {任意の名前} |
S3バケット | {作成済のバケット} |
配信ストリーム作成時にS3へとアクセスするためのIAMロールが自動生成されFirehoseにアタッチされます。
自動生成された場合は送信可能な全てのAWSサービスへの許可ポリシーを割り当てられているため、CloudFormationなどでロールを自作する際は下記のAWSドキュメントを参考にしてください。
3. Amazon CloudWatchLogsの設定
1. ロググループ作成
まず、VPCフローログを保存するロググループを作成します。
今回は確認用なので、名前以外はデフォルトの値で作成します。
【ロググループ作成画面】
2. IAMロール作成
次にAmazon CloudWatchLogsがFirehoseへとデータを送信するために必要な権限を付与したIAMロールを作成します。
作成するIAMロールは下記の内容です。
信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
許可ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "firehose:PutRecord", "Resource": "arn:aws:firehose:{リージョン}:{アカウントID}:deliverystream/{配信ストリーム名}" } ] }
3. サブスクリプションフィルター作成
次にAmazon CloudWatchLogsに出力されたVPCフローログを抽出して、FIrehoseへと送信するサブスクリプションフィルターを作成します。
作成したロググループを選択し、下部のサブスクリプションフィルタータブから
Kinesis Firehonse サブスクリプションフィルターを作成
をクリックします。
【ロググループ詳細画面】 【サブスクリプションフィルター作成画面】
設定値を入力後にストリーミングを開始
をクリックします。
設定値を下記に記載します。
項目 | 値 |
---|---|
送信先アカウント | 現在のアカウント |
Kinesis Firehose 配信ストリーム | {作成済の配信ストリーム名} |
既存のロールを選択 | {先に作成したIAMロール} |
ログの形式 | Amazon VPC フローログ |
サブスクリプションフィルターのパターン | {ログの形式選択時に自動入力} |
サブスクリプションフィルター名 | {任意のフィルター名} |
4. VPCフローログの設定
1. IAMロール作成
次にVPCフローログがAmazon CloudWatchLogsへとデータを送信するために必要な権限を付与したIAMロールを作成します。作成するIAMロールは下記の内容です。
信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "vpc-flow-logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
許可ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "*" } ] }
2. VPCフローログ作成
VPC一覧画面から、VPCフローログを取得するVPCを選択。
下部にあるフローログのタブから、フローログを作成
をクリック。
【VPC詳細画面】
【フローログ作成画面】
設定値を入力後にフローログを作成
をクリックします。
設定値を下記に記載します。
今回は確認用なので、集約間隔を1分間としてすぐにログ出力される設定にしてます。
項目 | 値 |
---|---|
名前 | {任意のフローログ名} |
フィルタ | すべて |
最大集約間隔 | 1分間 |
送信先 | CloudWatch Logs に送信 |
送信先ロググループ | {作成したロググループ名} |
IAM ロール | {作成したIAMロール} |
ログレコード形式 | AWS のデフォルト形式 |
5. S3ファイルの確認
各種の設定が完了したので、自動的にS3へとファイルが転送されます。
FirehoseがS3に転送する際のファイルのプレフィックスとファイル名は下記の通りです。(時刻はUTC)
項目 | 値 |
---|---|
プレフィックス | yyyy/MM/dd/HH/ |
ファイル名 | {DeliveryStreamName}-{DeliveryStreamVersion} -YYYY-MM-dd-HH-MM-SS-RandomString |
プレフィックスに関しては、配信ストリーム構築時の設定で変更可能です。
冒頭でも説明した通りAmazon CloudWacthLogs経由でFirehoseへと送信した場合、中身のデータがgzipで圧縮されます。
テキストエディターで開く場合、拡張子.gz
つけて解凍してください。
まとめ
AWSドキュメントには大きく書かれているのですが、見落としやすい点ではあるのでご注意ください。一方で、VPCフローログから直接Firehoseへ送信する際は無圧縮で送信されるので解凍は不要です。
自分はVPCフローログから直接Firehoseへ送信する方法で先に作成して、罠にハマりました。
本ブログがどなかたのお役に立てれば幸いです。