CloudWatchLogsのログをFirehose経由でS3に出力してみた
はじめに
AWSチームのすずきです。
Amazon CloudWatch Logs (Vended Logs)はサブスクリプションフィルタを利用して、 Lambda、Kinesis Stream、Kinesis Data Firehose、Amazon Elasticsearch Serviceと連携する事が可能です。(2018年7月現在)
今回、サブスクリプションフィルタの連携先としてKinesis Data Firehoseを指定し、 Vended Logs(VPCフローログ)のS3への出力を試す機会がありましたので紹介させて頂きます。
設定
LambdaとElasticsearch以外のサブスクリプションフィルタは、AWS CLIなどを利用して設定します。
今回の検証環境は、以下のCloudFormationテンプレートを利用して設定を行いました。
CloudFormation
- 検証に利用したCloudFormationテンプレートです。
- CloudWatchのLogGroup、SubscriptionFilter、Firehoseのストリーム、S3バケットを設置します。
VPCフローログ設定
- CloudFormationで作成されたLogGroupを出力先とするVPCフローログ設定を行いました。
確認
- Firehoseの出力先からファイルをダウンロード、GZIP圧縮を展開しJSON形式で保存されたログを参照する事ができました。
cd /tmp aws s3 cp s3://<S3バケット名>/firehose/cw_logs_firehose/2018/07/15/05/aaa-Step3deliverystream-bbbbbb /tmp/ cat aaa-Step3deliverystream-bbbbbb | gzip -d| jq .
出力例
- VPCフローログ出力例
{ "messageType": "DATA_MESSAGE", "owner": "00000000000", "logGroup": "/cw_logs/aaa", "logStream": "eni-xxxxxxxx-all", "subscriptionFilters": [ "aaa-Step2SubscriptionFilter-ccc" ], "logEvents": [ { "id": "34156565544237522570852594165671859978202113352719663104", "timestamp": 1531633371000, "message": "2 00000000000 eni-xxxxxxxx 192.168.0.XX 54.239.25.XX 41314 443 6 1 40 1531633371 1531633405 ACCEPT OK" }, { "id": "34156565544237522570852594165671859978202113352719663105", "timestamp": 1531633371000, "message": "2 00000000000 eni-xxxxxxxx 60.191.38.XX 192.168.0.XX 46389 8000 6 1 44 1531633371 1531633405 REJECT OK" } ] }
AWS費用
2018年7月現在、東京リージョンで投入データ1GBあたりの利用費用は以下の通り。
- CloudWatchLogs: $0.76
- Kinesis Data Firehose: $0.036
今回紹介したFirehoseを利用したS3へのエクスポート、CloudWatchLogs費用の5%程度の増加で利用可能です。
まとめ
CloudwatchLogs、S3へのエクスポート機能を備えていましたが、 サブスクリプションフィルタによるFirehose連携でより簡単にS3出力が可能になりました。
CloudwatchLogsに登録されたログデータの集計や検索処理などのためS3へのログ保存が望ましい場合、 今回紹介させて頂いた手順をお試しください。
また、CloudwatchLogsのサブスクリプションフィルタはLambdaと連携する事も可能です。 Firehoseへの投入前処理をLambda関数で実施し、S3 Selectや、Athenaを利用したログ参照については、 次の記事で紹介させて頂きたいと思います。